找到圆心
本文关键字: | 更新日期: 2023-09-27 18:33:27
我需要一些 c# 代码来实现以下目的:
我有两点(2D)。这些点位于半径为 r 的圆上。我知道每个点的切角。我需要抓住圆圈的中点。
//托马斯
好吧,我想我有点不清楚。见下图。点 P1 位于线的末尾,线的角度为 At1。点 P2 位于角度为 At2 的直线的开头。我知道 P1 和 P2 的坐标。我也知道角度 At1 和 At2。在 P1 和 P2 之间形成半径,我需要知道由 P1、P2、At1 和 At2 形成的(不可见)圆的中心点 Pc。点 P1 和 P2 可以位于坐标系中的任何位置。
我知道这不是 c#,但是我希望遇到解决这个问题的人。
见图片
如果不知道这些点在圆上彼此相距最远,那么它们可以在无限数量的圆上。
否则,很简单:
Point pt1 = ...
Point pt2 = ...
Point mid = new Point((pt1.X + pt2.X) / 2, (pt1.Y + pt2.Y) / 2);
首先,检查切角是否平行。 如果是,那么您需要做的就是根据Yorye Nathan的解决方案找到它们之间的中点(因为它们都沿着圆的直径)。
如果它们不平行,则可以从已知的 P1 和 P2 开始绘制两条垂直于切角的线。 如果您求解这两条线的交点,则该交点将是 Pc。
我现在没有时间编写完整的 C# 数学并对其进行测试,但一些伪代码可能是:
public Point CalculateCircleCentre(Point p1, Degrees tangent1, Point p2, Degrees tangent2)
{
if (AreAnglesParallel(tangent1, tangent2))
{
return Midpoint(p1, p2);
}
else
{
var line1 = new Line(p1, tangent1 + 90);
var line2 = new Line(p2, tangent2 + 90);
var intersectionPoint = FindIntersection(line1, line2);
return intersectionPoint;
}
}
假设一个圆上有 2 个点,坐标为 (x1, y1)、(x2, y2),点 (x3, y3) 是半径为 r 的圆的中心,您需要做的就是找到 x3 和 y3。解决这个系统:
(x3-x1)^2+(y3-y1)^2=r^2
(x3-x2)^2+(y3-y2)^2=r^2
扩展到
x3*x3-2*x3*x1+x1*x1 + y3*y3-2*y3*y1+y1*y1 = r*r
x3*x3-2*x3*x2+x2*x2 + y3*y3-2*y3*y2+y2*y2 = r*r
2*x3*(x2-x1) + 2*y3*(y2-y1) + x1*x1 + x2*x2 + y1*y1 + y2*y2 = 0
您现在可以用这个长表达式替换 x3 并找到 y3
x3 = (2*y3*(y1-y2) - (x1*x1 + x2*x2 + y1*y1 + y2*y2)) / (2*(x2-x1))
之后,您将知道查找x3的所有内容。