25

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

4

5 回答 5

19

我建议将线转换为参数格式而不是点斜率。也就是说,线的参数函数返回沿该线的点以获取某个参数 t 的值。您可以将这条线表示为一个参考点,并将一个向量表示为穿过该点的线的方向。这样,您只需从 A 点前后移动 d 个单位即可获得其他点。

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

    幅度 = (1^2 + m^2)^(1/2)

    N = <1, m> / 幅度 = <1 / 幅度, m / 幅度>

归一化的方向向量是 N。现在你差不多完成了。您只需要以参数化格式为您的线编写方程:

    f(t) = A + t*N

这使用向量数学。具体来说,标量向量乘法(参数 t 和向量 N)和向量加法(A 和 t*N)。函数 f 的结果是沿线的一个点。您正在寻找的 2 个点是 f(d) 和 f(-d)。以您选择的语言实施。

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

于 2009-08-09T02:45:13.720 回答
12

让我简单地解释一下答案

起点 -(x0, y0)

终点——(x1, y1)

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

点在远处的一条线上

起点和终点之间的距离由下式给出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)

于 2016-01-28T18:47:51.737 回答
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)。

于 2009-08-09T02:46:20.677 回答
0

我认为这是一个很棒且易于理解的解决方案:

http://www.physicsforums.com/showpost.php?s=f04d131386fbd83b7b5df27f8da84fa1&p=2822353&postcount=4

于 2013-05-10T06:45:37.050 回答
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 在数学 stackexchange 上的出色回答

于 2021-01-04T15:42:28.967 回答