Basicprogramming(.org) > General questions and discussions

Celtic Knot Challenge

(1/3) > >>

B+:
Anyone else want to try this:

I think I ruined my eyes, getting all start and end angles for arcs. Ruined eyes in turn makes it hard to detect typos, assuming you know how to spell the word in first place :D

ZXDunny:
I'm lazy, so if you could outline the algorithm I'll definitely give that a go :)

Cybermonkey:

--- Quote from: ZXDunny on July 04, 2019, 10:31:22 am ---I'm lazy, so if you could outline the algorithm I'll definitely give that a go :)

--- End quote ---
+1  ;D

B+:
Sorry, it is time and patience exercise that I know of:

--- Code: ---OPTION _EXPLICIT
_TITLE "Vince Celtic Challenge Skeleton"
CONST xmax = 1200, ymax = 700, pi = 3.14159265
CONST xc = xmax / 2, yc = ymax / 2
SCREEN _NEWIMAGE(xmax, ymax, 32)
_SCREENMOVE 100, 20

celticKnot xc, yc, 30
SLEEP

SUB celticKnot (xc, yc, thick)
DIM distr, r, r1, hex, hd2, nHex, x0, y0, c AS _UNSIGNED LONG

distr = 5 * thick
r = 4 * thick
r1 = 3 * thick
hex = pi * 2 / 6
hd2 = hex / 2

FOR nHex = 1 TO 6
IF nHex <= 2 THEN c = &HFFFFFFFF ELSE c = &HFF444444
'circles with origins in main circle
x0 = xc + distr * COS(nHex * hex - hd2)
y0 = yc + distr * SIN(nHex * hex - hd2)

CIRCLE (x0, y0), r, c
CIRCLE (x0, y0), r1, c

' circles with outside origins
x0 = xc + (2 * distr - 1.5 * thick) * COS(nHex * hex)
y0 = yc + (2 * distr - 1.5 * thick) * SIN(nHex * hex)
IF nHex = 1 THEN c = &HFF0000FF ELSE c = &HFF444444
CIRCLE (x0, y0), r, c
CIRCLE (x0, y0), r1, c

NEXT
END SUB

--- End code ---

This code draws the circle "skeleton" from which I eyeballed 12 Arcs with 12 Start Angles and 12 End Angles for an Arc Sub to draw in one "inside" circle ring and one "outside" ring. The 2nd inside ring highlighted is there to help show where bridges go on the overlap "inner" rings. Once that set is ready just repeat 6 times around the origin.

--- Code: ---SUB arc (x, y, r, raStart, raStop, c AS _UNSIGNED LONG)
'x, y origin, r = radius, c = color

'raStart is first angle clockwise from due East = 0 degrees
' arc will start drawing there and clockwise until raStop angle reached

DIM al, a
IF raStop < raStart THEN
arc x, y, r, raStart, _PI(2), c
arc x, y, r, 0, raStop, c
ELSE
' modified to easier way suggested by Steve
'Why was the line method not good? I forgot.
al = _PI * r * r * (raStop - raStart) / _PI(2)
FOR a = raStart TO raStop STEP 1 / al
PSET (x + r * COS(a), y + r * SIN(a)), c
NEXT
END IF
END SUB

--- End code ---

I was thinking I might automate the arc data by point and click with mouse for the start and end angles of arcs because the 2nd part of the challenge or extra credit goes to being able to change the width of the rings.

EDIT: Sorry for misspelling of Thread Title

Update: Apparently one can do everything mathematically given 3 radii and "width to render the image."

B+:
To eliminate eye-balling start and end arcs, I have worked up code for the 2 points intersect of 2 circles when they do intersect.

Hopefully this will allow me to draw a variety of ring widths with math only.