Code archives/Algorithms/Circle through three points
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
The algorithm has been taken from: http://cgafaq.info/wiki/Circle_Through_Three_Points I belive that the algorithm itsself and my BMX implementation of it is Public Domain even though the actual source is released under the GNU FDL 1.2 ( http://www.gnu.org/copyleft/fdl.html ) -- Byteemoz | |||||
SuperStrict Function CircleFromPoints:Int(p1x#, p1y#, p2x#, p2y#, p3x#, p3y#, cx# Var, cy# Var, rad# Var) Local A#, B#, C#, D#, E#, F#, G# A = p2x - p1x B = p2y - p1y C = p3x - p1x D = p3y - p1y E = A * (p1x + p2x) + B * (p1y + p2y) F = C * (p1x + p3x) + D * (p1y + p3y) G = 2 * (A * (p3y - p2y) - B * (p3x - p2x)) If G = 0 Then cx = 0.0 cy = 0.0 rad = 0.0 Return False Else cx = (D * E - B * F) / G cy = (A * F - C * E) / G rad = Sqr((p1x - cx) ^ 2 + (p1y - cy) ^ 2) Return True EndIf EndFunction ' a test AppTitle = "LMB = point1 ; MMB = point2 ; RMB = point3" Graphics 800, 600 Local p1x# = 400, p1y# = 250, p2x# = 350, p2y# = 350, p3x# = 450, p3y# = 350, cx#, cy#, rad# Repeat WaitEvent If MouseDown(MOUSE_LEFT) Then p1x = MouseX() ; p1y = MouseY() If MouseDown(MOUSE_MIDDLE) Then p2x = MouseX() ; p2y = MouseY() If MouseDown(MOUSE_RIGHT) Then p3x = MouseX() ; p3y = MouseY() CircleFromPoints p1x, p1y, p2x, p2y, p3x, p3y, cx, cy, rad Cls SetColor 255, 255, 255 DrawOval cx - rad, cy - rad, rad * 2, rad * 2 SetColor 0, 64, 0 DrawOval cx - 1, cy - 1, 3, 3 SetColor 255, 128, 128 DrawRect p1x - 2, p1y - 2, 5, 5 DrawRect p2x - 2, p2y - 2, 5, 5 DrawRect p3x - 2, p3y - 2, 5, 5 Flip Until KeyHit(KEY_ESCAPE) Or AppTerminate() |
Comments
None.
Code Archives Forum