代码之家  ›  专栏  ›  技术社区  ›  basszero

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

  •  10
  • basszero  · 技术社区  · 16 年前

    我知道线段的端点以及我想要创建的垂直端盖的距离/大小,但我需要计算垂直线的端点。我一直在用45-45-90三角形和点积把我的头撞在墙上,但我似乎无法把它们结合在一起。

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

    this question 但这导致端盖始终垂直。

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

    3 回复  |  直到 8 年前
        1
  •  18
  •   Justin    16 年前

    如果B1是两个红色点之间的蓝色点,B2是另一个蓝色点,则执行此操作的方法是:

    • 将此向量归一化
    • 然后将该向量放大红色点之间距离的一半
    • 将此向量添加到B1(这是R1)

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

    [ 0  -1 ]
    [ 1   0 ]
    
        2
  •  8
  •   Dov    16 年前

    解决这个问题的简单方法不是用斜率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++,因为我使用了Sqt,但是差别很小。请注意,结合平方根可以更有效地编写代码。

        3
  •  3
  •   nlucaroni    16 年前

    你知道蓝线的斜率,我们称之为蓝线 m . 一条垂直于蓝线的线会有斜率 -1/m .

    要找到x坐标,你需要一些三角, sine \theta = d / delta_x ,其中θ是x轴蓝线的角度,d是从蓝点到其中一个红点的距离。然后加/减 delta_x

    推荐文章