Samples Gallery & Reference > Utilities
Circle Intersecting Line by bplus
(1/1)
The Librarian:
Circle Intersecting Line
Author: @bplus
Source: qb64.org Forum
URL: https://www.qb64.org/forum/index.php?topic=2132.0
Version: 2020
Tags: [2d], [geometry], [intersections]
Description:
This is an interactive (mouse-driven) demo that calculates the intersection of any line with any circle.
Source Code:
--- Code: QB64: ---_TITLE "Circle Intersect Line" ' b+ 2020-01-31 develop' Find point on line perpendicular to line at another point" 'B+ 2019-12-15' further for a Line and Circle Intersect, making full use of the information from the link below. CONST xmax = 800, ymax = 600SCREEN _NEWIMAGE(xmax, ymax, 32)_SCREENMOVE 300, 40 DO CLS IF testTangent = 0 THEN 'test plug in set of border conditions not easy to click PRINT "First set here is a plug in test set for vertical lines." mx(1) = 200: my(1) = 100: mx(2) = 200: my(2) = 400 'line x = 200 mx(3) = 400: my(3) = 300: mx(4) = 150: my(4) = 300 ' circle origin (center 400, 300) then radius test 200 tangent, 150 more than tangent, 250 short FOR i = 1 TO 4 CIRCLE (mx(i), my(i)), 2 NEXT IF mx(1) <> mx(2) THEN slopeYintersect mx(1), my(1), mx(2), my(2), m, Y0 ' Y0 otherwise know as y Intersect LINE (0, Y0)-(xmax, m * xmax + Y0), &HFF0000FF LINE (mx(1), my(1))-(mx(2), my(2)) ELSE LINE (mx(1), 0)-(mx(1), ymax), &HFF0000FF LINE (mx(1), my(1))-(mx(2), my(2)) END IF testTangent = 1 ELSE PRINT "First 2 clicks will form a line, 3rd the circle origin and 4th the circle radius:" WHILE pi < 4 'get 4 mouse clicks _PRINTSTRING (20, 20), SPACE$(20) _PRINTSTRING (20, 20), "Need 4 clicks, have" + STR$(pi) WHILE _MOUSEINPUT: WEND IF _MOUSEBUTTON(1) AND oldMouse = 0 THEN 'new mouse down pi = pi + 1 mx(pi) = _MOUSEX: my(pi) = _MOUSEY CIRCLE (mx(pi), my(pi)), 2 IF pi = 2 THEN 'draw first line segment then line IF mx(1) <> mx(2) THEN slopeYintersect mx(1), my(1), mx(2), my(2), m, Y0 ' Y0 otherwise know as y Intersect LINE (0, Y0)-(xmax, m * xmax + Y0), &HFF0000FF LINE (mx(1), my(1))-(mx(2), my(2)) ELSE LINE (mx(1), 0)-(mx(1), ymax), &HFF0000FF LINE (mx(1), my(1))-(mx(2), my(2)) END IF END IF END IF oldMouse = _MOUSEBUTTON(1) _DISPLAY _LIMIT 60 WEND END IF p = mx(3): q = my(3) r = SQR((mx(3) - mx(4)) ^ 2 + (my(3) - my(4)) ^ 2) CIRCLE (p, q), r, &HFFFF0000 IF mx(1) = mx(2) THEN 'line is vertical so if r = IF r = ABS(mx(1) - mx(3)) THEN ' one point tangent intersect PRINT "Tangent point is "; TS$(mx(1)); ", "; TS$(my(3)) CIRCLE (mx(1), my(3)), 2, &HFFFFFF00 CIRCLE (mx(1), my(3)), 4, &HFFFFFF00 ELSEIF r < ABS(mx(1) - mx(3)) THEN 'no intersect PRINT "No intersect, radius too small." ELSE '2 point intersect ydist = SQR(r ^ 2 - (mx(1) - mx(3)) ^ 2) y1 = my(3) + ydist y2 = my(3) - ydist PRINT "2 Point intersect (x1, y1) = "; TS$(mx(1)); ", "; TS$(y1); " (x2, y2) = "; TS$(mx(1)); ", "; TS$(y2) CIRCLE (mx(1), y1), 2, &HFFFFFF00 'marking intersect points yellow CIRCLE (mx(1), y2), 2, &HFFFFFF00 CIRCLE (mx(1), y1), 4, &HFFFFFF00 'marking intersect points yellow CIRCLE (mx(1), y2), 4, &HFFFFFF00 END IF ELSE 'OK the calculations! 'from inserting eq ofline into eq of circle where line intersects circle see reference ' https://math.stackexchange.com/questions/228841/how-do-i-calculate-the-intersections-of-a-straight-line-and-a-circle A = m ^ 2 + 1 B = 2 * (m * Y0 - m * q - p) C = q ^ 2 - r ^ 2 + p ^ 2 - 2 * Y0 * q + Y0 ^ 2 D = B ^ 2 - 4 * A * C 'telling part of Quadratic formula = 0 then circle is tangent or > 0 then 2 intersect points IF D < 0 THEN ' no intersection PRINT "m, y0 "; TS$(m); ", "; TS$(Y0) PRINT "(p, q) "; TS$(p); ", "; TS$(q) PRINT "A: "; TS$(A) PRINT "B: "; TS$(B) PRINT "C: "; TS$(C) PRINT "D: "; TS$(D); " negative so no intersect." ELSEIF D = 0 THEN ' one point tangent x1 = (-B + SQR(D)) / (2 * A) y1 = m * x1 + Y0 PRINT "Tangent Point Intersect (x1, y1) = "; TS$(x1); ", "; TS$(y1) CIRCLE (x1, y1), 2, &HFFFFFF00 'yellow circle should be on line perprendicular to 3rd click point CIRCLE (x1, y1), 4, &HFFFFFF00 'yellow circle should be on line perprendicular to 3rd click point ELSE '2 points x1 = (-B + SQR(D)) / (2 * A): y1 = m * x1 + Y0 x2 = (-B - SQR(D)) / (2 * A): y2 = m * x2 + Y0 PRINT "2 Point intersect (x1, y1) = "; TS$(x1); ", "; TS$(y1); " (x2, y2) = "; TS$(x2); ", "; TS$(y2) CIRCLE (x1, y1), 2, &HFFFFFF00 'marking intersect points yellow CIRCLE (x2, y2), 2, &HFFFFFF00 CIRCLE (x1, y1), 4, &HFFFFFF00 'marking intersect points yellow CIRCLE (x2, y2), 4, &HFFFFFF00 END IF END IF _DISPLAY INPUT "press enter to continue, any + enter to quit "; q$ IF LEN(q$) THEN SYSTEM pi = 0 'point indexLOOP UNTIL _KEYDOWN(27) SUB slopeYintersect (X1, Y1, X2, Y2, slope, Yintercept) ' fix for when x1 = x2 slope = (Y2 - Y1) / (X2 - X1) Yintercept = slope * (0 - X1) + Y1END SUB FUNCTION TS$ (n) TS$ = _TRIM$(STR$(n))END FUNCTION
Navigation
[0] Message Index
Go to full version