如何解决在最接近给定线的圆上找到点的垂直距离
我正在使用Three.js,并试图弄清楚如何从X和Y网格上的随机点获取最接近的圆线段。基本上,哪条线也是红色光盘最近的中心。不可见的网格是x = 400和y =400。z =0。我正在寻找任何语言的算法。我知道它是三角函数,但是很遗憾地说我不像我以前想象的那样新鲜。如果任何人都可以使用javascript或python回答,那将很棒,但是任何编码语言都将很棒!
解决方法
第一步是通过x轴找到所选点和圆心之间的直线角度。此角度为theta = atan2(y0-yc,x0-xc)
。减去起始角度并找到相对于完整圆的2 * pi的分数,得出索引:floor(theta * num_segments / (2 * pi))
。该数字必须取段数的模数来获得0 <= ind < num_segments
之间的索引。
要查找点与圆之间的距离,请首先计算到中心的距离,然后从半径中减去该距离。因此,radius - sqrt((x0-xc)*(x0-xc)+(y0-yc)*(y0-yc))
。
这里有一些python代码来说明这个概念(避免使用numpy会使事情更容易实现,但很难转换为其他编程语言)。
from matplotlib import pyplot as plt
from math import sin,cos,pi,atan2,floor
def draw_segmented_circle(xc,yc,radius,num_segments=8,theta0=0,selected_segment=None,**kwargs):
xpos = [xc + radius * cos(theta0 + 2 * pi * i / num_segments) for i in range(num_segments + 1)]
ypos = [xc + radius * sin(theta0 + 2 * pi * i / num_segments) for i in range(num_segments + 1)]
if selected_segment is not None:
i = selected_segment
plt.plot([xpos[i],xpos[i + 1]],[ypos[i],ypos[i + 1]],**kwargs)
else:
for i in range(num_segments):
plt.plot([xpos[i],**kwargs)
plt.plot([xc,xpos[i]],[yc,ypos[i]],ls=':',**kwargs)
def find_closest_segment(x0,y0,xc,theta0=0):
theta = (atan2(y0 - yc,x0 - xc) - theta0)
return (floor(theta * num_segments / (2 * pi)) + num_segments) % num_segments
xc,num_segments,theta0 = 0,5,8,0
circle = (xc,theta0)
draw_segmented_circle(*circle,color='blue')
x0,y0 = 1,3
ind = find_closest_segment(x0,*circle)
draw_segmented_circle(*circle,selected_segment=ind,color='red')
plt.plot(x0,'o',color='red')
plt.gca().set_aspect('equal')
plt.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。