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

时间:2009-12-17 15:47:48

标签: math vector geometry 2d linear-algebra

我知道线段的终点和我想要创建的垂直端盖的距离/大小,但我需要计算垂直线的终点。我一直用45-45-90三角形和圆点产品撞墙,但我似乎无法让它融合在一起。

我知道蓝色的点和红点的距离,我需要找到红色的点。

在标记为重复之前,我尝试了this question中发布的答案,但结果却是垂直的。

http://rauros.net/files/caps.png http://rauros.net/files/caps.png

3 个答案:

答案 0 :(得分:16)

如果B1是2个红点之间的蓝点,B2是另一个蓝点,那么这样做的方法是:

  • 查找B1 - B2
  • 规范化此向量
  • 然后将此向量向上缩放红点之间距离的一半
  • 旋转90度
  • 将此向量添加到B1(这是R1)
  • 从B1(这是R2)中减去此向量

以上所有内容都相当简单 - 最棘手的一点就是弄清楚如何用文字写出来!

这可能会有所帮助 - 矩阵旋转90度:

[ 0  -1 ]
[ 1   0 ]

答案 1 :(得分:8)

围绕这个问题的简单方法不是考虑斜率m,而是考虑x和y的变化,我称之为dx,dy(来自微积分表示法)。 原因在于,处理垂直线的斜率是无限的,并且在任何情况下,您不需要使用trig函数,此代码将更快更简单。

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

我在这里假设点2是所需线的交点。

好的,所以垂直线的斜率与第一条线的负倒数有关。 有两种方法可以做到这一点:

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,但差异很小。请注意,您可以更有效地编写代码,并结合平方根。

答案 2 :(得分:3)

你知道蓝线的斜率,我们称之为m。垂直于蓝线的线将具有斜率-1/m

找到需要一些触发的x坐标,sine \theta = d / delta_x,其中\ theta是x轴蓝线的角度,d是蓝点之一的红点距离。然后将delta_x加/减到您希望线垂直的蓝点的x坐标。现在,您可以使用点斜率公式计算y坐标。

相关问题