2009-12-17 25 views
10

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

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

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

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

+0

这将取决于您希望垂直线与之相符的已知线上的点。你的示例图似乎表明它们处于已知线的中点。 – ZombieSheep 2009-12-17 16:00:35

+0

是的,要在红线的中点相交 – basszero 2009-12-17 16:05:01

+0

相关:[从对角线计算垂直偏移](http://stackoverflow.com/q/17195055/183120)。 – legends2k 2013-10-19 06:01:54

回答

16

如果B1是2个红点之间的蓝点,B2是其他蓝色的点,然后做到这一点的方法是:

  • 查找B1 - B2
  • 正常化这一载体
  • 然后扩展该向量了由红色点
  • 旋转之间的距离的一半90度
  • 这个向量添加到B1(这是R1)
  • 苏从B1(这是R2)中抽取这个向量

以上所有内容都是相当直接的 - 最棘手的一点就是弄清楚如何在文本中写出它!

这可能是有益的,但 - 矩阵旋转90度:

[ 0 -1 ] 
[ 1 0 ] 
+0

简单的英语向量解释正是我需要的把这些碎片放在我的头上。谢谢!可惜你没有得到许多赞扬 – basszero 2009-12-17 17:31:04

3

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

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

+0

但是,您需要解决一个涉及距离的方程组,以将点斜率形式转换为线段。我希望得到一个解决的系统解决方案 – basszero 2009-12-17 16:00:28

+0

是的,我错过了一个步骤,你需要先找到点斜率公式的x坐标,那里的三角进来。 – nlucaroni 2009-12-17 16:03:31

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