这是基本的图形几何和/或触发,我觉得它很愚蠢,但我不记得这是怎么回事。所以:
我想计算位于#1线上某处的点(x',y'),这样当与#2点连接时,会创建一条到第一行的新垂线。
感谢。
答案 0 :(得分:7)
在这种计算几何中,一个有用的经验法则是你应该尽可能地使用向量,只作为最后的手段切换到笛卡尔坐标。所以让我们用向量代数来解决这个问题。假设您的行从 p 变为 p + r ,另一个点是 q 。
现在,该线上的任何一点,包括你想要找到的点(称之为 s ),都可以表示为 s = p < / strong> +λ r 用于标量参数λ。
现在 q 到 s 的向量必须垂直于 r 。因此
( q - ( p +λ r ))· r = 0
其中·是dot product operator。展开产品:
( q - p )· r =λ( r · r )
并分开:
λ=( q - p )· r / r · r
当你实现它时,你需要检查 r · r = 0,以避免被零除。
答案 1 :(得分:6)
您可以通过首先考虑从(x, y)
到(x1, y1)
的行中的通用点(x2, y2)
找到该点:
x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)
并从(xp, yp)
E = (x - xp)**2 + (y - yp)**2
代替x
和y
的定义
E = (x1 + t*(x2 - x1) - xp)**2 +
(y1 + t*(y2 - y1) - yp)**2
然后找到相对于t
E
的距离变化t
的最小距离
dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
经过一些计算后得出
dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
t*((x2 - x1)**2 + (y1 - y2)**2))
当这个导数为零时,我们得到t
t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1)) /
((x2 - x1)**2 + (y2 - y1)**2)
所以可以使用t
定义中(x, y)
的值来计算最终点。
使用矢量符号这与Gareth提出的完全相同的公式......
t = <p - p1, p2 - p1> / <p2 - p1, p2 - p1>
其中符号<a, b>
表示点积运算ax*bx + ay*by
。
另请注意,完全相同的公式适用于n维空间。
答案 2 :(得分:1)
答案是:
y=ax+b
where a=(x1-x2)/(y2-y1)
b=yp-(x1-x2)*xp/(y2-y1)
如何获得结果:
1) slope for the original line: (y2-y1)/(x2-x1)
2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1)
3) Plug this into (xp,yp) we can have the result line.
在此之后计算答案(这太长了......我很饿)。
答案 3 :(得分:1)
对于所有使用向量寻找具体示例的可怜人...在这里,我基于加雷斯的回答。
您有一个向量,从p到r(从0,0到50,-50),另一个点q在(50,0)。 q与从p到r的向量的直角交点为{x:25. y:-25},并使用以下代码导出。
FuzzySearch.extractTop
const p = [0, 0];
const r = [50, -50];
const q = [50, 0];
const l = math.add(p, r);
const m = math.dot(math.subtract(q, p), r) / math.dot(r, r);
console.log('intersecting point', math.multiply(l, m));
答案 4 :(得分:0)
您可以求解连接(x1, y1)
和(x2, y2)
的线的斜率。然后你知道垂直线的斜率是负斜率。
要查找y轴截距,请使用斜率查看该线在y
从x=0
到x1
的行进距离。
b + (x1 - x0) * m = y1
b + (x1 - 0) * m = y1
b + (x1 * m) = y1
b = y1 - x1 * m
然后,您可以获得两点之间的线的公式以及(xp, yp)
中具有上述斜率的线。对于给定的x,它们具有相等的y,因此您可以求解x
,然后将其插入y
的任一公式中。
m = slope_from_1_to_2 = (y2 - y1) / (x2 - x1)
n = slopePerpendicular = (-1) / m
b = intercept_for_1_to_2 = y1 - x1 * m
c = intercept_for_p = yp - xp * n
因此,线的方程是形式的
y = mx + b
第1点和第2点:
y(x) = mx + b
点p:
y(x) = nx + c
将y
设为等于找x'
mx' + b = nx' + c
(m-n)x' = c - b
x' = (c - b) / (m - n)
因此使用任一公式计算y'
y' = mx' + b
答案 5 :(得分:0)
let x1, x2, y1, y2, slope, xp, yp, m, x, y
x1 = 0
y1 = 0
x2 = 50
y2 = -50
xp = 50
yp = 0
slope = (y1 - y2) / (x1 - x2)
m = -1 / slope
x = (m * xp - yp - slope * x1 + y1) / (m - slope)
y = m * x - m * xp + yp
console.log('x: ', x, ', y: ', y )