三点画弧(C#)
全局变量
Graphics g;
List<Point> arc = new List<Point>();
相关事件
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
Point arcPoint = new Point(e.X, e.Y);
arc.Add(arcPoint);
if (arc.Count == 3)
paintArc(arc);
}
相关函数
private void paintArc(List<Point> arc)
{
Pen p = new Pen(Color.Black, 1);
for (int i = 0; i < 3; i++)
g.DrawEllipse(p, arc[i].X, arc[i].Y, 2, 2);
int A = arc[0].X - arc[1].X;
int B = arc[0].Y - arc[1].Y;
int C = arc[0].X - arc[2].X;
int D = arc[0].Y - arc[2].Y;
double E = (arc[0].X * arc[0].X - arc[1].X * arc[1].X + arc[0].Y * arc[0].Y - arc[1].Y * arc[1].Y) / 2;
double F = (arc[0].X * arc[0].X - arc[2].X * arc[2].X + arc[0].Y * arc[0].Y - arc[2].Y * arc[2].Y) / 2;
double X = -(D * E - B * F) / (B * C - A * D);
double Y = -(A * F - C * E) / (B * C - A * D);
Point center = new Point(Convert.ToInt16(X), Convert.ToInt16(Y));
g.DrawEllipse(p, center.X, center.Y, 2, 2);
double R = Math.Sqrt((arc[0].X - X) * (arc[0].X - X) + (arc[0].Y - Y) * (arc[0].Y - Y));
double cosValue1 = (arc[0].X - X) / R;
double sinValue1 = (arc[0].Y - Y) / R;
double angle1 = Math.Acos(cosValue1)/Math.PI*180;
if (sinValue1 < 0)
angle1 = 360 - angle1;
double cosValue2 = (arc[2].X - X) / R;
double sinValue2 = (arc[2].Y - Y) / R;
double angle3 = Math.Acos(cosValue2) / Math.PI * 180;
if (sinValue2 < 0)
angle3 = 360 - angle3;
int mode = (arc[1].X - arc[0].X) * (arc[2].Y - arc[1].Y) - (arc[1].Y - arc[0].Y) * (arc[2].X - arc[1].X) > 0 ? 1 : 0;
if (mode == 1)
if (angle3 > angle1)
g.DrawArc(p, (int)(X - R), (int)(Y - R), (int)(2 * R), (int)(2 * R), (float)angle1, (float)(angle3 - angle1));
else
g.DrawArc(p, (int)(X - R), (int)(Y - R), (int)(2 * R), (int)(2 * R), (float)angle1, (float)(360 - (angle1 - angle3)));
else
if (angle3 > angle1)
g.DrawArc(p, (int)(X - R), (int)(Y - R), (int)(2 * R), (int)(2 * R), (float)angle1, (float)(angle3 - angle1 - 360));
else
g.DrawArc(p, (int)(X - R), (int)(Y - R), (int)(2 * R), (int)(2 * R), (float)angle1, (float)(angle3 - angle1));
arc.Clear();
}
运行结果