找到具有给定距离的线上的点

时间:2009-08-09 02:32:31

标签: language-agnostic graphics vector lines points

我有一个问题,我知道一条线,我只知道它的斜率(m)和它上面的一个点A(x,y)我如何计算这条线上的点(实际上是两个)距离(d) )从A点开始??? 我问这个是为了找到一条穿过A(x,y)的线上的像素强度,距离是这样的。在这种情况下,距离将是像素数。

5 个答案:

答案 0 :(得分:15)

我建议将线转换为参数格式而不是点斜率。也就是说,线的参数函数沿着该线返回一些参数t的值的点。您可以将线表示为参考点,并使用向量表示通过该点的线的方向。这样,你只需从A点向前和向后移动d单位就可以得到你的其他点。

由于您的线具有斜率m,因此其方向矢量<1,m>。因为它在x中每1个像素移动y个像素。您希望将该方向向量标准化为单位长度,以便除以向量的大小。

    magnitude = (1^2 + m^2)^(1/2)

    N = <1, m> / magnitude = <1 / magnitude, m / magnitude>

标准化的方向向量是N.现在你差不多完成了。您只需要以参数化格式编写行的等式:

    f(t) = A + t*N

这使用vector math。具体来说,scalar vector multiplication(参数t和矢量N)和vector addition(A和t * N)。函数f的结果是沿线的点。你要找的两点是f(d)和f(-d)。用您选择的语言实施。

与目前为止的所有其他答案相比,使用此方法的优点是,您可以轻松扩展此方法以支持具有“无限”斜率的线。也就是说,像x = 3这样的垂直线。你真的不需要斜率,你需要的只是归一化的方向向量。对于垂直线,它是&lt; 0,1&gt;。这就是图形操作经常使用矢量数学的原因,因为计算更直接且不易出现奇点。 一开始看起来有点复杂,但是一旦你掌握了矢量操作,很多计算机图形学任务就会变得容易多了。

答案 1 :(得分:2)

Let me explain the answer in a simple way

起点 - (x0, y0)

结束点 - (x1, y1)

我们需要在从起点到终点的距离dt处找到一个点(xt, yt)

Point on a line at a distance

起点和终点之间的距离由d = sqrt((x1 - x0)^2 + (y1 - y0)^2)

给出

设距离比t = dt / d

然后点(xt, yt) = (((1 - t) * x0 + t * x1), ((1 - t) * y0 + t * y1))

0 < t < 1时,该点在线上。

t < 0时,该点位于(x0, y0)附近的行之外。

t > 1时,该点位于(x1, y1)附近的行之外。

答案 2 :(得分:0)

让我们调用你想要找到P的点,坐标为px,py,你的起点是A的坐标ax和ay。斜率m只是Y的变化与X变化的比值,因此如果你的点P是距离A的距离s,那么它的坐标是px = ax + s,而py = ay + m * s。现在使用毕达哥拉斯,从A到P的距离d将是d = sqrt(s * s +(m * s)*(m * s))。为了使P成为远离A的特定D单位,找s为s = D / sqrt(1 + m * m)。

答案 3 :(得分:0)

答案 4 :(得分:0)

这是一个 Python 实现,用于在距初始点的给定距离处查找线段上的点:

import numpy as np

def get_point_on_vector(initial_pt, terminal_pt, distance):
    v = np.array(initial_pt, dtype=float)
    u = np.array(terminal_pt, dtype=float)
    n = v - u
    n /= np.linalg.norm(n, 2)
    point = v - distance * n

    return tuple(point)

基于@Theophile here 在 math stackexchange 上的出色回答。