给定一个点 (pX, pY) 和一个具有已知中心 (cX,cY) 和半径 (r) 的圆,您可以用最短的代码量找到最接近 (pX, pY) ?
我有一些代码可以工作,但它涉及将圆转换为 (x - cX)^2 + (y - cY)^2 = r^2 形式的方程(其中 r 是半径)并使用方程从点 (pX, pY) 到 (cX, cY) 的直线,以创建要求解的二次方程。
一旦我解决了它会做的错误,但这似乎是一个不雅的解决方案。
给定一个点 (pX, pY) 和一个具有已知中心 (cX,cY) 和半径 (r) 的圆,您可以用最短的代码量找到最接近 (pX, pY) ?
我有一些代码可以工作,但它涉及将圆转换为 (x - cX)^2 + (y - cY)^2 = r^2 形式的方程(其中 r 是半径)并使用方程从点 (pX, pY) 到 (cX, cY) 的直线,以创建要求解的二次方程。
一旦我解决了它会做的错误,但这似乎是一个不雅的解决方案。
其中 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 维。
我会从中心到点画一条线,然后计算该图穿过圆圈的位置 oO 我认为并不难
先用数学方法求解,然后转化为代码。请记住,点和圆边缘之间的最短线也将通过其中心(如@litb 所述)。
最短距离点位于通过中心和输入点的圆周和直线的交点处。中心点、输入点和输出点也位于一条直线上
设中心为 (xc, yc) 和输入 (xi, yi) 的最短点为 (x,y) 然后 sqrt((xc-x)^2 + (yc-y)^2) = r
由于中心点、输入点和输出点位于一条直线上,因此在其中任何两个点之间计算的斜率应该相同。
(yc-yi)/(xc-xi) = (y-yc)/(x-xc)
4.求解方程 2 和 3 应该给我们最短的点。
Trig 函数,乘以 r,并根据需要添加 pX 或 pY。
将圆的中心视为原点,将 (pX, pY) 的坐标转换为极坐标, (theta, r') 将 r' 替换为原始圆的 r 并转换回笛卡尔坐标 (并调整原点)。
您要求最短的代码,所以在这里。可以在四行中完成,尽管仍然存在二次方。我认为该点在圆圈之外。我没有考虑如果该点直接位于圆心上方或下方会发生什么,即 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 是你在圆圈上的结果。
我很确定我在某处犯了错误,如果有人发现了什么,请发表评论。当然它是退化的,一个答案离你的观点最远,另一个离你最近。
用图片来思考它的简单方法,并且很容易变成代码:从中心到点取向量(pX - cX,pY - cY)。除以它的长度 sqrt(blah blah blah),乘以半径。将此添加到(cX,cY)。