寻找与给定距离相隔一定距离的直线上的点

25

我有一个问题,我知道一条直线的斜率(m)和它上面的一个点A(x,y)。如何计算距离点A(实际上是两个点)距离为d的这条直线上的点?? 我是为了找到通过点A(x,y)的像素强度而问这个问题,其中距离指的是像素数。

5个回答

19
我建议将该行转换为参数格式,而不是点斜式。即,一个参数化函数返回该行上某个参数t的点。您可以将该行表示为参考点和表示通过该点的线方向的向量。这样,您只需从点A向前和向后移动d个单位即可获得其他点。
由于您的直线具有斜率m,其方向向量为<1,m>。由于它在x方向上每移动1个像素,y方向上就要移动m个像素。您希望将该方向向量标准化为单位长度,因此需要除以向量的大小。
    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的结果是沿着该行的一点。您正在寻找的2个点是f(d)和f(-d)。使用您选择的语言实现它。
使用这种方法的优势是,与迄今为止所有其他答案不同,您可以轻松地扩展此方法以支持具有“无限”斜率的线。也就是说,像x = 3这样的垂直线。您实际上不需要斜率,您所需的只是标准化的方向向量。对于垂直线,它是<0,1>。这就是为什么图形操作经常使用矢量数学,因为计算更加直观并且不容易出现奇点。 起初可能看起来有点复杂,但一旦掌握了矢量运算,许多计算机图形任务会变得更加容易。

@ALevy,您引入了一个变量'A',但我没有看到'A'被定义为什么。那么,'A'是什么? - Tom Auger
@TomAuger,我在这个答案的介绍段落中提到了A。A是线上的一个点。任何一个在线上的点都可以,没有关系。 - A. Levy

12

让我用简单的语言解释答案

起点 - (x0, y0)

终点 - (x1, y1)

我们需要找到距离起点(x0, y0)一定距离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)


4
经过查看5个不同页面后,我找到了最简单的解释。 - Manmohan Bishnoi

1
这是一个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的出色答案(此处)


0

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)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接