【发布时间】:2021-01-04 23:42:28
【问题描述】:
我有一个问题我知道一条线我只知道它的斜率(m)和它上面的一个点 A(x,y)我如何计算这条线上的点(实际上是其中两个)距离(d ) 从 A 点开始 ??? 我问这个是为了找到通过 A(x,y) 距离为 .Distance 的线上的像素强度。在这种情况下,距离将是像素数。
【问题讨论】:
标签: language-agnostic graphics vector lines points
我有一个问题我知道一条线我只知道它的斜率(m)和它上面的一个点 A(x,y)我如何计算这条线上的点(实际上是其中两个)距离(d ) 从 A 点开始 ??? 我问这个是为了找到通过 A(x,y) 距离为 .Distance 的线上的像素强度。在这种情况下,距离将是像素数。
【问题讨论】:
标签: language-agnostic graphics vector lines points
我建议将线转换为参数格式而不是点斜率。也就是说,线的参数函数返回沿该线的点以获取某个参数 t 的值。您可以将这条线表示为一个参考点,并将一个向量表示为穿过该点的线的方向。这样,您只需从 A 点前后移动 d 个单位即可获得其他点。
由于你的线有斜率m,它的方向向量是。因为它在 x 中每 1 个像素在 y 中移动 m 个像素。您想将该方向向量归一化为单位长度,以便除以向量的大小。
幅度 = (1^2 + m^2)^(1/2) N = / 幅度 =归一化的方向向量是 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 这样的垂直线。您实际上并不需要斜率,您所需要的只是归一化的方向向量。对于垂直线,它是 。这就是图形运算经常使用矢量数学的原因,因为计算更直接且不易出现奇点。 一开始可能看起来有点复杂,但是一旦你掌握了矢量运算的窍门,很多计算机图形任务就会变得容易得多。
【讨论】:
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)附近的线外。
【讨论】:
这是一个 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 上的出色回答。
【讨论】:
让我们将您要查找的点称为 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)。
【讨论】:
【讨论】: