AutoCAD
Advertisement
;| WIKI-3PTTOBULGE
Returns the bulge of an arc defined by three points, PNT1, PNT2, and PNT3
   If point 2 is nil, returns 0.
   Edit the source code for this function at 
  3pttobulge (AutoLISP function)
   External function references:
   WIKI-ASIN
   WIKI-TAN

Theory:                                             
                 /\                          
                /  \                         
               /    \                        
              /      \                       
             / delta  \                      
            /          \                     
           /            R                    
          /              \                   
         /                \                  
        /                  \                 
       /                    \                
      /                      \               
     /       __chord___ ----- 1
    3 ------      |          *
       .    ANG2   B    _.* 
           - 2 - ._|..-



Bulge = 2*B/chord
Bulge = tan(delta/4)
Theory (in classic triangle geometry terms):
 We want to find the radius, R.
 Points 1, 2, and 3 form a triangle with sides 1, 2, and 3 opposite them.
 A unique circle passes through the three points.
 Sides 1, 2, and 3 are all chords of the circle.
 Side 2 (opposite point 2) is the chord of this segment of the circle.

 It happens to be true that angle 2 doubled plus delta equals 360 or 2pi.
 This is intuitive when point 2 is at the midpoint of the circle segment.
 Consider how angle 2 acts in the following cases:
  Delta   Angle 2
    0       180  
   90       135  
  180        90  
  270        45  
  360         0

 But it is also true when point 2 is not at the midpoint.
 Therefore delta = 2*pi - 2*ang2 = 2*(pi-ang2) = 2*(ang1 + ang3)
 and delta/2=pi-ang2                                                           (equation 1)

 A line from the center of the circle is a perpendicular bisector of any of the three lines
 Therefore (side2/2)/R=sin(delta/2).                                           (equation 2)
 We'd like to get R just in terms of side2 and ang2.  Luckily we have this trig identity,
  sin(pi-theta)=sin(theta),                                                    (equation 3)
 so we can say from equations 1 and 3 that sin(delta/2)=sin(pi-ang2)=sin(ang2) (equation 4)
 and from equations 2 and 4 that (side2/2)/R=sin(ang2).                        (equation 5)
 Solving for R we get R=side2/(2*sin(ang2)).                                   (equation 6)
 That gives us R in terms of things we know.
 In fact, from the law of sines (a/sin(A)=b/sin(B)=c/sin(C)), since 2R=side2/sin(ang2),
 in geometry triangle terms (where "a" is a triangle side and "A" is its opposite angle),
 R=a/(2*sin(A)) for any of the three points/angles/opposite sides
|;
(DEFUN
   WIKI-3PTTOBULGE (PNT1 PNT2 PNT3 / ANG1 ANG2 ANG3 BULGE CHORD DELTA DELTA1 R)
  (COND
    ((NOT PNT2) 0)
    (T
     (SETQ
       CHORD
        (DISTANCE PNT1 PNT3)
       ANG2
        (- (ANGLE PNT2 PNT1) (ANGLE PNT2 PNT3))
       ;;We use the theory above to write an expression for R
       ;;using chord and ang2
       ;;Sin of ang2 (and thus R) will be negative if the arc is clockwise.
       R
        (/ CHORD (* 2 (SIN ANG2)))
       DELTA1
        (* 2 (WIKI-ASIN (/ CHORD (* 2 R))))
       ANG1
        (ABS (- (ANGLE PNT1 PNT3) (ANGLE PNT1 PNT2)))
       ANG1
        (ABS
          (IF (> ANG1 PI)
            (- ANG1 (* 2 PI))
            ANG1
          )
        )
       ANG3
        (ABS (- (ANGLE PNT3 PNT1) (ANGLE PNT3 PNT2)))
       ANG3
        (ABS
          (IF (> ANG3 PI)
            (- ANG3 (* 2 PI))
            ANG3
          )
        )
       DELTA
        (* 2 (+ ANG1 ANG3))
       BULGE
        (* (IF (MINUSP R)
             -1
             1
           )
           (WIKI-TAN (/ DELTA 4.0))
        )
     )
    )
  )
)
Advertisement