【问题标题】:finding the perpendicular distance of a point on the circle closest to the given line [closed]找到最接近给定线的圆上一点的垂直距离[关闭]
【发布时间】:2020-12-24 04:45:39
【问题描述】:

我正在使用 Three.js 并试图弄清楚如何从 X 和 Y 网格上的随机点获取圆的最近线段。基本上哪条线也是最接近红色圆盘的中心。不可见的网格是 x = 400 和 y = 400。z = 0。我正在寻找任何语言的算法。我知道三角学,但我很抱歉地说我不像我想象的那么新鲜。如果有人可以用 javascript 或 python 回答那会很棒,但任何编码语言都会很棒!

如果我从原点 (0,0) 处的红色圆盘开始,然后移动它

好的澄清一下,说绿线是Y, 红线是X,现在我想知道 数学公式将告诉我红色圆圈的中间最接近哪个轴。现在红色圆圈将随机放置在 X 和 Y 轴范围内的任何位置。我认为这是一个三角函数,但我对数学很生疏。如果您可以将答案转换为 javascript,那将非常有帮助

【问题讨论】:

  • 这不是一个 JavaScript 问题。更多的是一道数学题。这篇文章应该可以帮助您入门:stackoverflow.com/questions/10957689/…
  • 这个也是。它具有用于线圆碰撞检测的 javascript 代码示例:stackoverflow.com/questions/37224912/… 您需要能够“检测碰撞”,因为您必须使用相同的距离计算,这将导致您能够找到线段这是最近的距离。
  • 这是一道数学题。去 math.stackexchange.com 询问。 PS:在直线上取一个点,计算该点与圆心之间的de等式并更改该点,直到最小化距离。
  • 我不明白这个问题。你能否重新表述它并显示更清晰的图片来解释你想要什么?
  • 短语the invisible grid is x = 10 and y = 10. z = 0 很难理解。网格与红点和/或圆圈有何关系?对于所有涉及的元素,z 是否会为零,或者是否涉及 3D 元素?你写的是一个圆圈,但显示的是八角形。那么,您的意思是细分为N 段的圆圈吗?你如何表示圆圈和第一段的开始?径向线段是否只是如图所示,或者它们是“圆形线段”的一部分

标签: javascript math three.js


【解决方案1】:

第一步是找到所选点与圆心之间的直线与 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], xpos[i + 1]], [ypos[i], ypos[i + 1]], **kwargs)
            plt.plot([xc, xpos[i]], [yc, ypos[i]], ls=':', **kwargs)

def find_closest_segment(x0, y0, xc, yc, radius, num_segments=8, theta0=0):
    theta = (atan2(y0 - yc, x0 - xc) - theta0)
    return (floor(theta * num_segments / (2 * pi)) + num_segments) % num_segments

xc, yc, radius, num_segments, theta0 = 0, 0, 5, 8, 0
circle = (xc, yc, radius, num_segments, theta0)
draw_segmented_circle(*circle, color='blue')

x0, y0 = 1, 3
ind = find_closest_segment(x0, y0, *circle)
draw_segmented_circle(*circle, selected_segment=ind, color='red')
plt.plot(x0, y0, 'o', color='red')

plt.gca().set_aspect('equal')
plt.show()

【讨论】:

  • 是的,谢谢 很抱歉我在措辞这个问题时遇到了问题。感谢您花时间回答它。你做得非常好。荣誉。
  • 虚线也可以吗?
  • 您可以使用例如this code 并遍历线段并存储距离最小的线段。
  • 完美!!!再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多