我需要一些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);
首先,检查切角是否平行。如果是,那么你需要做的就是根据约尔耶·内森的解找到它们之间的中点(因为它们都沿着圆的直径)。
如果它们不平行,那么您可以从已知的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的一切。