39

给定一个点 (pX, pY) 和一个具有已知中心 (cX,cY) 和半径 (r) 的圆,您可以用最短的代码量找到最接近 (pX, pY) ?

我有一些代码可以工作,但它涉及将圆转换为 (x - cX)^2 + (y - cY)^2 = r^2 形式的方程(其中 r 是半径)并使用方程从点 (pX, pY) 到 (cX, cY) 的直线,以创建要求解的二次方程。

一旦我解决了它会做的错误,但这似乎是一个不雅的解决方案。

4

8 回答 8

68

其中 P 是点,C 是中心,R 是半径,使用合适的“数学”语言:

V = (P - C); Answer = C + V / |V| * R;

其中|V| 是 V 的长度。

好的好的

double vX = pX - cX;
double vY = pY - cY;
double magV = sqrt(vX*vX + vY*vY);
double aX = cX + vX / magV * R;
double aY = cY + vY / magV * R;

易于扩展到 >2 维。

于 2008-11-19T03:10:31.060 回答
7

我会从中心到点画一条线,然后计算该图穿过圆圈的位置 oO 我认为并不难

于 2008-11-19T02:56:23.380 回答
3

先用数学方法求解,然后转化为代码。请记住,点和圆边缘之间的最短线也将通过其中心(如@litb 所述)。

于 2008-11-19T03:06:49.210 回答
2
  1. 最短距离点位于通过中心和输入点的圆周和直线的交点处。中心点、输入点和输出点也位于一条直线上

  2. 设中心为 (xc, yc) 和输入 (xi, yi) 的最短点为 (x,y) 然后 sqrt((xc-x)^2 + (yc-y)^2) = r

  3. 由于中心点、输入点和输出点位于一条直线上,因此在其中任何两个点之间计算的斜率应该相同。

(yc-yi)/(xc-xi) = (y-yc)/(x-xc)

4.求解方程 2 和 3 应该给我们最短的点。

于 2012-08-31T00:08:46.770 回答
1

Trig 函数,乘以 r,并根据需要添加 pX 或 pY。

于 2008-11-19T02:52:42.127 回答
1

将圆的中心视为原点,将 (pX, pY) 的坐标转换为极坐标, (theta, r') 将 r' 替换为原始圆的 r 并转换回笛卡尔坐标 (并调整原点)。

于 2008-11-19T03:09:02.327 回答
1

您要求最短的代码,所以在这里。可以在四行中完成,尽管仍然存在二次方。我认为该点在圆圈之外。我没有考虑如果该点直接位于圆心上方或下方会发生什么,即 cX=pX。

m=(cY-pY)/(cX-pX);  //slope
b=cY-m*cX;  //or Py-m*Px.  Now you have a line in the form y=m*x+b
X=(  (2mcY)*((-2*m*cY)^2-4*(cY^2+cX^2-b^2-2*b*cY-r^2)*(-1-m^2))^(1/2)  )/(2*(cY^2+cX^2-b^2-2*bc*Y-r^2));
Y=mX+b;

1] 得到连接点和圆心的直线方程。

2] 沿直线移动距离中心一半径的距离,以找到圆上的点。即:radius=a^2+b^2 即:r=((cY-Y)+(cX-X))^(1/2)

3] 二次求解。X=quadratic_solver(r=((cY-Y)+(cX-X))^(1/2),X) 如果你用 Y=m*X+b 代替,你会得到上面的地狱。

4] X 和 Y 是你在圆圈上的结果。

我很确定我在某处犯了错误,如果有人发现了什么,请发表评论。当然它是退化的,一个答案离你的观点最远,另一个离你最近。

于 2008-11-19T04:02:30.097 回答
1

用图片来思考它的简单方法,并且很容易变成代码:从中心到点取向量(pX - cX,pY - cY)。除以它的长度 sqrt(blah blah blah),乘以半径。将此添加到(cX,cY)。

于 2008-11-19T04:22:40.227 回答