0

我需要一些 c# 代码用于以下内容:

我有两点(2D)。这些点在半径为 r 的圆上。我知道每个点的切线角。我需要抓住圆的中点。

//托马斯


好的,我想我有点不清楚。见下图。点 P1 位于直线的末端,直线的夹角为 At1。点 P2 位于角度为 At2 的直线的起点。我知道 P1 和 P2 的坐标。我也知道角度 At1 和 At2。在 P1 和 P2 之间形成一个半径,我需要知道由 P1、P2、At1 和 At2 形成的(不可见)圆的中心点 Pc。点 P1 和 P2 可以位于坐标系中的任何位置。

我知道这不是 c#,但是我希望遇到解决这个问题的人。

看图片

4

3 回答 3

1

如果不知道这些点在圆上彼此相距最远,那么它们可以在无限数量的圆上。

否则,很简单:

Point pt1 = ...
Point pt2 = ...

Point mid = new Point((pt1.X + pt2.X) / 2, (pt1.Y + pt2.Y) / 2);
于 2012-05-08T14:35:47.080 回答
0

首先,检查切角是否平行。如果它们是,那么您需要做的就是根据 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;
    }
}
于 2012-05-09T19:12:25.497 回答
-1

假设您在坐标为 (x1, y1)、(x2, y2) 的圆上有 2 个点,点 (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 的一切。

于 2012-05-08T15:06:28.763 回答