我有一个问题,我知道一条线,我只知道它的斜率(m)和它上面的一个点A(x,y)我如何计算这条线上的点(实际上是两个)距离(d) )从A点开始??? 我问这个是为了找到一条穿过A(x,y)的线上的像素强度,距离是这样的。在这种情况下,距离将是像素数。
答案 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)
。
起点和终点之间的距离由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)
我认为这是一个很棒且易于理解的解决方案:
http://www.physicsforums.com/showpost.php?s=f04d131386fbd83b7b5df27f8da84fa1&p=2822353&postcount=4
答案 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 上的出色回答。