Samples Gallery & Reference > 2D/3D Graphics
Lissajous Curve Table by FellippeHeitor
(1/1)
Qwerkey:
Lissajous Curve Table
Author: @FellippeHeitor
Source: qb64.org Forum
URL: https://www.qb64.org/forum/index.php?topic=683.0
Version: « Reply #8 on: October 09, 2018, 02:48:07 PM »
Tags: [2D], [Graphics], [Mathematics]
Description:
Graphical Lissajou's Figures. For added eye-candy-ness, I've changed the plot line to paint using HSB colors so that ink color will vary according to the current rotational angle.
Source Code:
--- Code: QB64: ---_TITLE "Lissajous Curve Table" $RESIZE:ON TYPE vector x AS SINGLE y AS SINGLEEND TYPE DIM SHARED angleDIM SHARED wDIM SHARED rows, cols SCREEN _NEWIMAGE(800, 800, 32) setup:angle = 0w = 80rows = INT(_HEIGHT / w) - 1cols = INT(_WIDTH / w) - 1REDIM dot(rows, cols) AS vector plot = _NEWIMAGE(_WIDTH, _HEIGHT, 32)_DEST plotCLS_DEST 0 DO IF _RESIZE THEN oldScreen = _DEST SCREEN _NEWIMAGE(_RESIZEWIDTH, _RESIZEHEIGHT, 32) _FREEIMAGE oldScreen _FREEIMAGE plot GOTO setup END IF _PUTIMAGE , plot d = w - 0.2 * w r = d / 2 FOR i = 0 TO cols cx = w + i * w + w / 2 cy = w / 2 CIRCLE (cx, cy), r x = r * COS(angle * (i + 1) - _PI(.5)) y = r * SIN(angle * (i + 1) - _PI(.5)) LINE (cx + x, 0)-(cx + x, _HEIGHT), _RGB32(127, 127, 127) CircleFill cx + x, cy + y, 4, _RGB32(28, 222, 50) CircleFill cx + x, cy + y, 2, _RGB32(11, 33, 249) FOR j = 0 TO rows dot(j, i).x = cx + x NEXT NEXT FOR i = 0 TO rows cx = w / 2 cy = w + i * w + w / 2 CIRCLE (cx, cy), r x = r * COS(angle * (i + 1) - _PI(.5)) y = r * SIN(angle * (i + 1) - _PI(.5)) LINE (0, cy + y)-(_WIDTH, cy + y), _RGB32(127, 127, 127) CircleFill cx + x, cy + y, 4, _RGB32(28, 222, 50) CircleFill cx + x, cy + y, 2, _RGB32(11, 33, 249) FOR j = 0 TO cols dot(i, j).y = cy + y NEXT NEXT _DEST plot LINE (0, 0)-(_WIDTH, _HEIGHT), _RGBA32(0, 0, 0, 4), BF FOR j = 0 TO rows FOR i = 0 TO cols CircleFill dot(j, i).x, dot(j, i).y, 1, hsb(_R2D(angle), 127, 127, 255) NEXT NEXT angle = angle + 0.01 IF angle > _PI(2) THEN angle = 0 _DEST 0 _DISPLAY _LIMIT 30LOOP SUB CircleFill (x AS LONG, y AS LONG, R AS LONG, C AS _UNSIGNED LONG) DIM x0 AS SINGLE, y0 AS SINGLE DIM e AS SINGLE x0 = R y0 = 0 e = -R DO WHILE y0 < x0 IF e <= 0 THEN y0 = y0 + 1 LINE (x - x0, y + y0)-(x + x0, y + y0), C, BF LINE (x - x0, y - y0)-(x + x0, y - y0), C, BF e = e + 2 * y0 ELSE LINE (x - y0, y - x0)-(x + y0, y - x0), C, BF LINE (x - y0, y + x0)-(x + y0, y + x0), C, BF x0 = x0 - 1 e = e - 2 * x0 END IF LOOP LINE (x - R, y)-(x + R, y), C, BFEND SUB FUNCTION map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!) map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!END FUNCTION FUNCTION hsb~& (__H AS _FLOAT, __S AS _FLOAT, __B AS _FLOAT, A AS _FLOAT) DIM H AS _FLOAT, S AS _FLOAT, B AS _FLOAT H = map(__H, 0, 255, 0, 360) S = map(__S, 0, 255, 0, 1) B = map(__B, 0, 255, 0, 1) IF S = 0 THEN hsb~& = _RGBA32(B * 255, B * 255, B * 255, A) EXIT FUNCTION END IF DIM fmx AS _FLOAT, fmn AS _FLOAT DIM fmd AS _FLOAT, iSextant AS INTEGER DIM imx AS INTEGER, imd AS INTEGER, imn AS INTEGER IF B > .5 THEN fmx = B - (B * S) + S fmn = B + (B * S) - S ELSE fmx = B + (B * S) fmn = B - (B * S) END IF iSextant = INT(H / 60) IF H >= 300 THEN H = H - 360 END IF H = H / 60 H = H - (2 * INT(((iSextant + 1) MOD 6) / 2)) IF iSextant MOD 2 = 0 THEN fmd = (H * (fmx - fmn)) + fmn ELSE fmd = fmn - (H * (fmx - fmn)) END IF imx = _ROUND(fmx * 255) imd = _ROUND(fmd * 255) imn = _ROUND(fmn * 255) SELECT CASE INT(iSextant) CASE 1 hsb~& = _RGBA32(imd, imx, imn, A) CASE 2 hsb~& = _RGBA32(imn, imx, imd, A) CASE 3 hsb~& = _RGBA32(imn, imd, imx, A) CASE 4 hsb~& = _RGBA32(imd, imn, imx, A) CASE 5 hsb~& = _RGBA32(imx, imn, imd, A) CASE ELSE hsb~& = _RGBA32(imx, imd, imn, A) END SELECT END FUNCTION
Navigation
[0] Message Index
Go to full version