如何计算垂直线段的端点?

12
我知道线段的端点和垂直端点的距离/大小,想要创造出这些端点,但我需要计算垂直线的端点。我一直在尝试使用45-45-90三角形和点积,但似乎无法让它们结合起来。
我知道蓝色点的位置和到红色点的距离,我需要找到红色点的位置。
在将其标记为重复内容之前,我尝试了此问题中发布的答案,但结果总是会产生垂直的端点。
图片链接:http://rauros.net/files/caps.png http://rauros.net/files/caps.png

这将取决于您希望垂直线与已知线相交的点。您的示例图似乎显示它们位于已知线的中点处。 - ZombieSheep
是的,它们会在红线的中点相交。 - basszero
相关:从对角线计算垂直偏移量 - legends2k
3个回答

18
如果B1是两个红点之间的蓝点,B2是另一个蓝点,则操作步骤如下:
  • 找到B1 - B2向量
  • 将该向量归一化
  • 然后将该向量按照两个红点之间距离的一半进行缩放
  • 旋转90度
  • 将该向量加到B1(得到R1)
  • 从B1中减去该向量(得到R2)
以上所有步骤都相对简单。最困难的部分可能是如何将其用文本形式呈现!
这也许会有所帮助——旋转90度的矩阵:
[ 0  -1 ]
[ 1   0 ]

这个简单易懂的向量解释正是我需要的,让我能够在脑海中把所有的知识点串联起来。谢谢!可惜你没有得到很多赞。 - basszero

8

解决这个问题的简单方法不是考虑斜率m,而是考虑x和y的变化量,我称之为dx、dy(来自微积分符号)。

原因之一是,处理垂直线的斜率是无穷大的。此外,你不需要使用三角函数,这段代码将更快速和简单。

dx = x2 - x1;
dy = y2 - y1;

我假设这里的第二个点是所需直线的交点。
好的,那么垂直线的斜率与第一条线的负倒数有关。有两种方法可以实现这一点:
dx2 = -dy
dy2 = dx

或者

dx2 = dy
dy2 = -dx

这对应着两个方向,一个向右转,另一个向左转。

然而,dx和dy被缩放到原始线段的长度。你的垂线有不同的长度。

以下是两点之间的距离:

double length(double x1, double y1, double x2, double y2) {
 return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}

无论选择哪边,做你想做的事情:

double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy);
double dx2 = -dy * scale;
double dy2 = dx * scale

然后对另一侧进行相同的操作。 我刚意识到我的示例有些类似于c++,因为我使用了sqrt,但是差异微不足道。请注意,您可以更有效地编写代码,结合平方根。


3
你知道蓝线的斜率,我们称之为m。与蓝线垂直的线将具有斜率-1/m
要找到x坐标,您需要一些三角函数,其中sine \theta = d / delta_x,其中\theta是蓝线相对于x轴的角度,d是从蓝点到红点之一的距离。然后将delta_x加/减到您想要垂直的蓝点的x坐标上。现在,您可以使用点斜式公式来确定y坐标。

但是你需要解决一个涉及距离的方程组,才能将点斜式转换为线段。我希望有一个已解决的系统解决方案。 - basszero
是的,我错过了一步,你需要先找到点斜式公式的x坐标,这就涉及到三角函数。 - nlucaroni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接