(42S) Determine Circle From Three Given Points - Printable Version +- HP Forums (https://www.hpmuseum.org/forum) +-- Forum: HP Software Libraries (/forum-10.html) +--- Forum: General Software Library (/forum-13.html) +--- Thread: (42S) Determine Circle From Three Given Points (/thread-11056.html) (42S) Determine Circle From Three Given Points - gerry_in_polo - 07-15-2018 08:43 AM Calculates the center and radius of the circle passing through three given points. Example, enter X1=1, Y1=4, X2=-1, Y2=2, X3=4, Y3=-3. Result, center (Xc,Yc)=(2.5,0.5) and radius R=3.8079. RE: (42S) Determine Circle From Three Given Points - Dieter - 07-15-2018 04:38 PM (07-15-2018 08:43 AM)gerry_in_polo Wrote:  Calculates the center and radius of the circle passing through three given points. Example, enter X1=1, Y1=4, X2=-1, Y2=2, X3=4, Y3=-3. Result, center (Xc,Yc)=(2.5,0.5) and radius R=3.8079. Thank you very much for your program. This problem, solving a circle through three given points, reminds me of the early days with my first programmable calculator, a 34C. I had a HP67/97 book which included auch a program, and I tried to adapt it for the 34C. Essentially the problem boils down to solving a linear equation system with three unknowns. In matrix notation it can be written this way: Code: (x1  y1  -1)     (2*xc          )     (x1² + y1²) (x2  y2  -1)  *  (2*yc          )  =  (x2² + y2²) (x3  y3  -1)     (xc² + yc² - r²)     (x3² + y3²) Since the 42s features matrix support, this approach can be implemented in a quite compact program. So here is my alternative solution: Code: 00 { 184-Byte Prgm } 01>LBL "CIRCLE" 02 3 03 ENTER 04 NEWMAT 05 STO "C" 06 3 07 ENTER 08 1 09 NEWMAT 10 STO "B" 11 1.003 12 STO 00 13>LBL 00 14 INDEX "C" 15 RCL 00 16 "X" 17 AIP 18 |-"^Y" 19 AIP 20 |-"?" 21 1 22 STOIJ 23 PROMPT 24 X<>Y 25 STOEL 26 J+ 27 X^2 28 X<>Y 29 STOEL 30 J+ 31 X^2 32 + 33 -1 34 STOEL 35 INDEX "B" 36 RCL 00 37 1 38 STOIJ 39 R^ 40 STOEL 41 ISG 00 42 GTO 00 43 RCL "B" 44 RCL "C" 45 ÷ 46 STO "X" 47 INDEX "X" 48 RCLEL 49 2 50 ÷ 51 STO "XC" 52 X^2 53 I+ 54 RCLEL 55 2 56 ÷ 57 STO "YC" 58 X^2 59 + 60 I+ 61 RCLEL 62 - 63 SQRT 64 STO "R" 65 CLV "B" 66 CLV "C" 67 CLV "X" 68 "Xc=\LF   " 69 ARCL "XC" 70 AVIEW 71 STOP 72 "Yc=\LF   " 73 ARCL "YC" 74 AVIEW 75 STOP 76 "R=\LF   " 77 ARCL "R" 78 AVIEW 79 END Note: "|-" means "append", "^" is "↑" and "\LF" is a line feed. Your example: Code: XEQ "CIRCLE" X1↑Y^1?            1  [ENTER]  4 [R/S] X2↑Y^2?           -1  [ENTER]  2 [R/S] X3↑Y^3?            4  [ENTER] -3 [R/S] Xc=    2,5               [R/S] Yc=    0,5               [R/S] R=    3,807786... Since I am not very familiar with 42s matrix programming the program can probably be improved with more efficient code. So if someone can provide a better version: go ahead. Dieter RE: (42S) Determine Circle From Three Given Points - gerry_in_polo - 07-16-2018 12:49 AM The matrix approach does not readily illustrate the basic principle of determining the circle which encompasses three points: the intersection of the two perpendicular inspectors of the two chords linking the first and second and then the second and third given points as the circle's center and subsequent computation of the radius. RE: (42S) Determine Circle From Three Given Points - gerry_in_polo - 07-16-2018 01:19 AM Another observation: your program is 79 lines long, mine is 87, not really a significant difference although a different approach is always worth knowing. RE: (42S) Determine Circle From Three Given Points - Dieter - 07-16-2018 07:19 AM (07-16-2018 01:19 AM)gerry_in_polo Wrote:  Another observation: your program is 79 lines long, mine is 87, not really a significant difference ... Your program can even be shorter by using RCL-arithmetic. On the other hand my version has a quite elaborate output routine. Line 65 ff. can be replaced with a simple Code: 65 VIEW "XC" 66 STOP 67 VIEW "YC" 68 STOP 69 VIEW "R" Then take a look at the byte count. With the above simplification it's down to 149 Bytes. (07-16-2018 01:19 AM)gerry_in_polo Wrote:  ...although a different approach is always worth knowing. Yes, that's exactly why I posted it. This is just another way of solving the same problem. Isn't this what forums are all about? But let me explain why I chose this method: The approach here is the general circle equation: (X–Xc)² + (Y–Yc)² = R². The program solves the resulting equation system for the three given points. There is one significant advantage of this method: it doesn't matter if two Y-values are the same. Try (0|2), (4|2) and (2|0) and the program correctly returns the center at (2|2) and a radius of 2. This will not work with the other approach where a division by (Y2–Y1) and (Y3–Y2) takes place. Dieter RE: (42S) Determine Circle From Three Given Points - Thomas Klemm - 07-17-2018 01:21 PM The HP-42S allows to use complex numbers to solve the problem. Formula The three complex number $$a$$, $$b$$ and $$c$$ represent the vertices of the triangle. Define the following: $\begin{eqnarray} p=c+a \\ P=c-a \\ \\ q=a+b \\ Q=a-b \end{eqnarray}$ Then for the center $$z$$ of the circle the following holds true: (The $$\cdot$$ is for the dot-product.) $\begin{eqnarray} P\cdot(z-\frac{p}{2})=0 \\ Q\cdot(z-\frac{q}{2})=0 \end{eqnarray}$ This means that the vector from the center to the midpoint is perpendicular to the sides of the triangle. Given: $\begin{eqnarray} u=P\cdot p \\ v=Q\cdot q \end{eqnarray}$ We can rewrite these equations: $\begin{eqnarray} P\cdot z=P\cdot\frac{p}{2}=\frac{u}{2} \\ Q\cdot z=Q\cdot\frac{p}{2}=\frac{v}{2} \end{eqnarray}$ Or then: $\begin{eqnarray} P\cdot 2z=u \\ Q\cdot 2z=v \end{eqnarray}$ Using: $\begin{eqnarray} P=P_x+iP_y \\ Q=Q_x+iP_y \\ \\ z=x+iy \\ w=v+iu \end{eqnarray}$ This equation can be written using matrix notation: $\begin{bmatrix} P_x & P_y \\ Q_x & Q_y \end{bmatrix} \begin{bmatrix} 2x \\ 2y \end{bmatrix} = \begin{bmatrix} u \\ v \end{bmatrix}$ If we transpose this matrix we can rewrite the equation as: $\begin{eqnarray} g=Q_x+iP_x \\ h=Q_y+iP_y \\ \\ 2x\cdot g+2y\cdot h=w \end{eqnarray}$ This equation can be cross multiplied both by $$h$$ and $$g$$: (Reminder: $$h\times h=g\times g=0$$.) $\begin{eqnarray} 2x\cdot h\times g=h\times w \\ 2y\cdot h\times g=w\times g=-g\times w \end{eqnarray}$ The determinant is: $D=h\times g$ We end up with: $\begin{eqnarray} x=\frac{h\times w}{2D} \\ y=-\frac{g\times w}{2D} \end{eqnarray}$ Program Code: 00 { 69-Byte Prgm }  ; X Y Z T 01 LBL "CENTER"      ; c b a 02 ENTER             ; c c b a 03 R↑                ; a c c b 04 STO+ ST Z         ; a c c+a=p b 05 -                 ; c-a=P p b b 06 LASTX             ; a P p b 07 R↓                ; P p b a 08 DOT               ; u b a a 09 STO 00            ; u b a a 10 X<> ST L          ; P b a a 11 R↓                ; b a a P 12 STO+ ST Z         ; b a a+b=q P 13 -                 ; a-b=Q q P P 14 DOT               ; v P P P 15 STO 01            ; v P P P 16 X<> ST L          ; Q P P P 17 COMPLEX           ; Qy Qx P P 18 R↑                ; P Qy Qx P 19 COMPLEX           ; Py Px Qy Qx 20 X<>Y              ; Px Py Qy Qx 21 R↓                ; Py Qy Qx Px 22 COMPLEX           ; h Qx Px Px 23 X<> ST Z          ; Px Qx h Px 24 COMPLEX           ; g h Px Px 25 RCL 01            ; v g h Px 26 RCL 00            ; u v g h 27 COMPLEX           ; w g h h 28 R↓                ; g h h w 29 CROSS             ; h×g=D h w w 30 STO÷ ST Z         ; D h w/D w 31 X<> ST L          ; g h w/D w 32 X<> ST Z          ; w/D g h w 33 CROSS             ; g×w/D=2x h w w 34 X<>Y              ; h 2x w w 35 LASTX             ; w/D h 2x w 36 CROSS             ; h×w/D=-2y 2x w w 37 +/-               ; 2y 2x w w 38 COMPLEX           ; 2z w w w 39 2                 ; 2 2z w w 40 ÷                 ; z w w w 41 END               ; z w w w The radius of the circle isn't calculated. But that should be easy now that we know the center. Example: A = (1, 4) B = (-1, 2) C = (4, -3) 1 ENTER 4 COMPLEX -1 ENTER 2 COMPLEX 4 ENTER -3 COMPLEX XEQ "CENTER" 2.5 i0.5 Kind regards Thomas RE: (42S) Determine Circle From Three Given Points - Dieter - 07-17-2018 07:17 PM (07-17-2018 01:21 PM)Thomas Klemm Wrote:  The HP-42S allows to use complex numbers to solve the problem. Hey, that's a really great new approach! Hats off! (07-17-2018 01:21 PM)Thomas Klemm Wrote:  The radius of the circle isn't calculated. But that should be easy now that we know the center. The simplest way of calculating the radius may be storing one of the points (as a complex number) at the beginning (insert STO "P" between line 01 and 02), and add a final ENTER RCL–"P" ABS at the end. This will return the center coordinates in Y and the radius in X:  1  ENTER  4  COMPLEX -1  ENTER  2  COMPLEX  4  ENTER -3  COMPLEX XEQ "CENTER" => 2,5 i0,5 3,80788655... Dieter