Биссектриса угла, заданного тремя точками - C#
Формулировка задачи:
имеем три точки A, B, C. необходимо нарисовать биссектрису угла ABC.
кто подскажет решение. а то я уже зашел в тупик.
попробовал вычислить уравнения прямых через точки AB(А1x+B1y+C1) и BC(A2x+B2y+C2), далее из уравнения расстояния от точки до прямой имеем систему:
однако решение дает какие-то совсем левые точки. десять раз перепроверил не могу найти ошибки.
public static class GrExt
{
public static void DrawLine(this Graphics g, float a, float b, float c, float x1, float x2)
{
float y1 = (-a * x1 - c) / b;
float y2 = (-a * x2 - c) / b;
g.DrawLine(Pens.Black, x1,y1,x2,y2);
}
public static void DrawBisector(this Graphics g, float x1, float y1, float x2, float y2, float x3, float y3, float d = 50)
{
DrawBisector(g, new PointF(x1, y1), new PointF(x2, y2), new PointF(x3, y3), d);
}
public static void DrawBisector(this Graphics g, PointF p1, PointF p2, PointF p3, float d=50)
{
float A1, B1, C1, A2, B2, C2;
A1 = p2.Y - p1.Y;
B1 = p1.X - p2.X;
C1 = p1.Y*(p2.X-p1.X)-p1.X*(p2.Y-p1.Y);
g.DrawLine(A1, B1, C1, p1.X, p2.X);
A2 = p3.Y - p2.Y;
B2 = p2.X - p3.X;
C2 = p2.Y * (p3.X - p2.X) - p2.X * (p3.Y - p2.Y);
g.DrawLine(A2, B2, C2, p3.X, p2.X);
p.X = p2.X;
p.Y = p2.Y;
g.dr(A1,B1,C1,A2,B2,C2);
}
private static PointF p= new PointF();
private static void dr(this Graphics g, float a1, float b1, float c1, float a2, float b2, float c2, float d=50)
{
float val1 = Convert.ToSingle(d * Math.Sqrt(a1 * a1 + b1 * b1));
float val2 = Convert.ToSingle(d * Math.Sqrt(a2 * a2 + b2 * b2));
float valY = b2 - b1*a2/a1;
float val = a2*c1/a1 - c2;
float y1 = (val1 + val2 + val)/valY;
float y2 = (val1 - val2 + val) / valY;
float y3 = (-val1 + val2 + val) / valY;
float y4 = (-val1 - val2 + val) / valY;
float x1 = (val1 - b1*y1 - c1)/a1;
float x2 = (val1 - b1 * y2 - c1) / a1;
float x3 = (-val1 - b1 * y3 - c1) / a1;
float x4 = (-val1 - b1 * y4 - c1) / a1;
g.DrawLine(new Pen(Color.Red, 3), p.X, p.Y, x1, y1);
g.DrawLine(new Pen(Color.Green, 3), p.X, p.Y, x2, y2);
g.DrawLine(new Pen(Color.Blue, 3), p.X, p.Y, x3, y3);
g.DrawLine(new Pen(Color.Black, 3), p.X, p.Y, x4, y4);
}
}Решение задачи: «Биссектриса угла, заданного тремя точками»
textual
Листинг программы
g.DrawLine(Pens.Black, p2, p);