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

如何在与直线的给定垂直距离处找到一个点?

  •  42
  • AZDean  · 技术社区  · 16 年前

    我在一个窗口中画了一条线,我让用户拖动它。所以,我的线由两点定义:(x1,y1)和(x2,y2)。但是现在我想在我的线的末端画“caps”,也就是说,在我的每个端点画短的垂直线。大写字母的长度应为N像素。

    因此,要在端点(x1,y1)绘制“cap”线,我需要找到两个形成垂直线的点,其中每个点都离该点(x1,y1)N/2像素。

    那么,如果一个点(x3,y3)需要与已知直线的终点(x1,y1)保持垂直距离n/2,即由(x1,y1)和(x2,y2)定义的直线,如何计算它呢?

    4 回复  |  直到 9 年前
        1
  •  80
  •   David Nehme    16 年前

    你需要计算一个垂直于直线段的单位向量。避免计算斜率,因为这会导致被零误差除。

    dx = x1-x2
    dy = y1-y2
    dist = sqrt(dx*dx + dy*dy)
    dx /= dist
    dy /= dist
    x3 = x1 + (N/2)*dy
    y3 = y1 - (N/2)*dx
    x4 = x1 - (N/2)*dy
    y4 = y1 + (N/2)*dx
    
        2
  •  5
  •   Giacomo Degli Esposti    16 年前

    你只需要计算正交向量并乘以n/2

    vx = x2-x1
    vy = y2-y1
    len = sqrt( vx*vx + vy*vy )
    ux = -vy/len
    uy = vx/len
    
    x3 = x1 + N/2 * ux
    Y3 = y1 + N/2 * uy
    
    x4 = x1 - N/2 * ux
    Y4 = y1 - N/2 * uy
    
        3
  •  3
  •   user677616    14 年前

    因为从2到1和1到3的向量是垂直的,所以它们的点积是0。

    这会给你留下两个未知数:x从1到3(x13),y从1到3(y13)

    用毕达哥拉斯定理得到另一个未知方程。

    用代换法求解每一个未知数…

    这需要平方和非平方,所以你会失去与方程相关的符号。

    要确定标志,请考虑:

    while x21 is negative, y13 will be positive
    while x21 is positive, y13 will be negative
    while y21 is positive, x13 will be positive
    while y21 is negative, x13 will be negative
    

    已知:点1:x1,y1

    已知:点2:x2,y2

    x21 = x1 - x2
    y21 = y1 - y2
    

    已知:距离1->3:n/2

    方程A:勾股定理

    x13^2 + y13^2 = |1->3|^2
    x13^2 + y13^2 = (N/2)^2
    

    已知:角度2-1-3:直角

    向量2->1和1->3垂直

    2->1点1->3为0

    公式B:点积=0

    x21*x13 + y21*y13 = 2->1 dot 1->3
    x21*x13 + y21*y13 = 0
    

    比率b/w x13和y13:

    x21*x13 = -y21*y13
    x13 = -(y21/x21)y13
    
    x13 = -phi*y13
    

    方程A:按比例求解y13

      plug x13 into a
    phi^2*y13^2 + y13^2 = |1->3|^2
    
      factor out y13
    y13^2 * (phi^2 + 1) = 
    
      plug in phi
    y13^2 * (y21^2/x21^2 + 1) = 
    
      multiply both sides by x21^2
    y13^2 * (y21^2 + x21^2) = |1->3|^2 * x21^2
    
      plug in Pythagorean theorem of 2->1
    y13^2 * |2->1|^2 = |1->3|^2 * x21^2
    
      take square root of both sides
    y13 * |2->1| = |1->3| * x21
    
      divide both sides by the length of 1->2
    y13 = (|1->3|/|2->1|) *x21
    
      lets call the ratio of 1->3 to 2->1 lengths psi
    y13 = psi * x21
    
      check the signs
        when x21 is negative, y13 will be positive
        when x21 is positive, y13 will be negative
    
    y13 = -psi * x21
    

    方程A:用比率求解x13

      plug y13 into a
    x13^2 + x13^2/phi^2 = |1->3|^2
    
      factor out x13
    x13^2 * (1 + 1/phi^2) = 
    
      plug in phi
    x13^2 * (1 + x21^2/y21^2) = 
    
      multiply both sides by y21^2
    x13^2 * (y21^2 + x21^2) = |1->3|^2 * y21^2
    
      plug in Pythagorean theorem of 2->1
    x13^2 * |2->1|^2 = |1->3|^2 * y21^2
    
      take square root of both sides
    x13 * |2->1| = |1->3| * y21
    
      divide both sides by the length of 2->1
    x13 = (|1->3|/|2->1|) *y21
    
      lets call the ratio of |1->3| to |2->1| psi
    x13 = psi * y21
    
      check the signs
        when y21 is negative, x13 will be negative
        when y21 is positive, x13 will be negative
    
    x13 = psi * y21
    

    凝结

    x21 = x1 - x2
    y21 = y1 - y2
    
    |2->1| = sqrt( x21^2 + y^21^2 )
    |1->3| = N/2
    
    psi = |1->3|/|2->1|
    
    y13 = -psi * x21
    x13 =  psi * y21
    

    我通常不会这样做,但我在工作中解决了它,并认为彻底解释它将帮助我巩固我的知识。

        4
  •  1
  •   Tim Cooper    12 年前

    如果要避免SQRT,请执行以下操作:

    in: line_length, cap_length, rotation, position of line centre
    
    define points:
      tl (-line_length/2, cap_length)
      tr (line_length/2, cap_length)
      bl (-line_length/2, -cap_length)
      br (line_length/2, -cap_length)
    
    rotate the four points by 'rotation'
    offset four points by 'position'
    
    drawline (midpoint tl,bl to midpoint tr,br)
    drawline (tl to bl)
    drawline (tr to br)