找到圆心

本文关键字: | 更新日期: 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的所有内容。

相关文章:
  • 没有找到相关文章