我有一个问题我知道一条线我只知道它的斜率(m)和它上面的一个点A(x,y)我如何计算这条线上的点(实际上是其中两个)与点的距离(d)一种 ???我问这个是为了找到通过 A(x,y) 距离为 .Distance 的线上的像素强度。在这种情况下,距离将是像素数。
5 回答
我建议将线转换为参数格式而不是点斜率。也就是说,线的参数函数返回沿该线的点以获取某个参数 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>。这就是图形运算经常使用矢量数学的原因,因为计算更直接且不易出现奇点。一开始可能看起来有点复杂,但是一旦你掌握了矢量运算的窍门,很多计算机图形任务就会变得容易得多。
起点 -(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)
。
让我们将您要查找的点称为 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)。
我认为这是一个很棒且易于理解的解决方案:
http://www.physicsforums.com/showpost.php?s=f04d131386fbd83b7b5df27f8da84fa1&p=2822353&postcount=4
这是一个 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 上的出色回答。