第二次作业 用面向对象的思维设计相关类,从而实现直线与直线、直线与圆、直线与矩形的交点。 要求各给出每个案例的至少一个示例的程序
C#
namespace Fb
{
public class FB_2
{
// public static void Main(string[] args)
// {
// //说明:实例化图像后,传入Cac即可计算
// Line l1 = new Line(1, 1, -1);
// Line l2 = new Line(-2, 1, 0);
// Cir c1 = new Cir(0, 0, 1);
// Rec r1 = new Rec(1, -1, 2, 2);
// Console.WriteLine("直线与直线:");
// Cac cac1 = new Cac(l1, l2);
// Console.WriteLine("直线与圆:");
// Cac cac2 = new Cac(l1, c1);
// Console.WriteLine("直线与矩形:");
// Cac cac3 = new Cac(l1, r1);
// }
}
class MathGraph
{
public mathType mType;
}
class Line : MathGraph
{
public double A { get; set; }
public double B { get; set; }
public double C { get; set; }
public Line() { }
public Line(double a, double b, double c)
{
mType = mathType.line;
A = a;
B = b;
C = c;
}
}
class Cir : MathGraph
{
public Vector2D Center = new Vector2D();//圆心
public double R;//半径
public Cir() { }
public Cir(Vector2D center, double r)
{
mType = mathType.circle;
Center = center;
R = r;
}
public Cir(double x, double y, double r)
{
mType = mathType.circle;
Center.x = x;
Center.y = y;
R = r;
}
}
class Rec : MathGraph
{
public Vector2D LT = new Vector2D();//左上
public Vector2D RT = new Vector2D();//右上
public Vector2D LB = new Vector2D();//左下
public Vector2D RB = new Vector2D();//右下
public Rec() { }
public Rec(Vector2D lt, Vector2D rt, Vector2D lb, Vector2D rb)
{
mType = mathType.rectangle;
LT = lt;
RT = rt;
LB = lb;
RB = rb;
}
public Rec(double xlt, double ylt, double xrt, double yrt, double xlb, double ylb, double xrb, double yrb)
{
mType = mathType.rectangle;
LT.x = xlt;
LT.y = ylt;
RT.x = xrt;
RT.y = yrt;
LB.x = xlb;
LB.y = ylb;
RB.x = xrb;
RB.y = yrb;
}
public Rec(double xlb, double ylb, double xrt, double yrt)
{
mType = mathType.rectangle;
LT.x = xlb;
LT.y = yrt;
RT.x = xrt;
RT.y = yrt;
LB.x = xlb;
LB.y = ylb;
RB.x = xrt;
RB.y = ylb;
}
}
class Cac
{
public Cac() { }
public Cac(Line l1, Line l2)//直线
{
if (l1.A == l2.A && l1.B == l2.B && l1.C == l2.C)
{
Console.WriteLine("直线相同");
return;
}
if (l1.A * l2.B == l2.A * l1.B)
{
Console.WriteLine("直线平行");
}
Console.WriteLine("x: " + (l2.C * l1.B - l1.C * l2.B) / (l1.A * l2.B - l2.A * l1.B));
Console.WriteLine("y: " + (l1.C * l2.A - l2.C * l1.A) / (l1.A * l2.B - l2.A * l1.B));
}
public Cac(Line l1, Cir c1)//圆
{
double distanceR;//直线到圆心的距离
distanceR = Math.Abs(l1.A * c1.Center.x + l1.B * c1.Center.y + l1.C) / (Math.Sqrt(l1.A * l1.A + l1.B * l1.B));
if (distanceR > c1.R)
{
Console.WriteLine("直线与圆无交点");
return;
}
else
{
double x1, x2, y1, y2;
double k = -l1.A / l1.B;
double b = -l1.C / l1.B;
double c = -c1.Center.x;
double d = -c1.Center.y;
x1 = -(Math.Sqrt((k * k + 1) * c1.R * c1.R - c * c * k * k + (2 * c * d + 2 * b * c) * k - d * d - 2 * b * d - b * b) + (b + d) * k + c) / (k * k + 1);
x2 = (Math.Sqrt((k * k + 1) * c1.R * c1.R - c * c * k * k + (2 * c * d + 2 * b * c) * k - d * d - 2 * b * d - b * b) - (b + d) * k - c) / (k * k + 1);
y1 = k * x1 + b;
y2 = k * x2 + b;
if (x1 == x2)
Console.WriteLine("直线与圆有一交点:( " + x1 + " , " + y1 + " )");
else
Console.WriteLine("直线与圆有两交点:( " + x1 + " , " + y1 + " )" + " , ( " + x2 + " , " + y2 + " )");
}
}
public Cac(Line l1, Rec r1)//矩形
{
if (l1.A == 0)
{
double Y = -l1.C / l1.B;
if (Y == r1.LB.y || Y == r1.RT.y)
{
Console.WriteLine("直线与矩形一边重合");
return;
}
else if (Y < r1.LB.y || Y > r1.RT.y)
{
Console.WriteLine("直线与矩形无交点");
return;
}
else
{
Console.WriteLine("直线与矩形两交点:( " + r1.LB.x + " , " + Y + " ) , ( " + r1.RT.x + " , " + Y + " )");
return;
}
}
else if (l1.B == 0)
{
double X = -l1.C / l1.A;
if (X == r1.LB.x || X == r1.RT.x)
{
Console.WriteLine("直线与矩形一边重合");
return;
}
else if (X < r1.LB.x || X > r1.RT.x)
{
Console.WriteLine("直线与矩形无交点");
return;
}
else
{
Console.WriteLine("直线与矩形两交点:( " + X + " , " + r1.LB.y + " ) , ( " + X + " , " + r1.RT.y + " )");
return;
}
}
else
{
double X1, X2, X3, X4, Y1, Y2, Y3, Y4;
bool flag = false;//是否存在
X1 = r1.LB.x;
Y1 = -(l1.A * X1 + l1.C) / l1.B;
X2 = r1.RT.x;
Y2 = -(l1.A * X2 + l1.C) / l1.B;
Y3 = r1.LB.y;
X3 = -(l1.B * Y3 + l1.C) / l1.A;
Y4 = r1.RT.y;
X4 = -(l1.B * Y4 + l1.C) / l1.A;
if (Y1 <= Y4 && Y1 >= Y3)
{
if (Y1 == -0)
Y1 = 0;
Console.WriteLine("存在交点:( " + X1 + " , " + Y1 + " )");
flag = true;
}
if (Y2 <= Y4 && Y2 >= Y3)
{
if (Y2 == -0)
Y2 = 0;
Console.WriteLine("存在交点:( " + X2 + " , " + Y2 + " )");
flag = true;
}
if (X3 < X2 && X3 > X1)
{
if (X3 == -0)
X3 = 0;
Console.WriteLine("存在交点:( " + X3 + " , " + Y3 + " )");
flag = true;
}
if (X4 < X2 && X4 > X1)
{
if (X4 == -0)
X4 = 0;
Console.WriteLine("存在交点:(" + X4 + " , " + Y4 + " )");
flag = true;
}
if (!flag)
Console.WriteLine("无交点");
}
}
}
class Vector2D//点
{
public double x { get; set; }
public double y { get; set; }
}
enum mathType
{
line,
circle,
rectangle
}
}