;| 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)) ) ) ) ) )
Community content is available under CC-BY-SA unless otherwise noted.