Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Rounded Rectangles and Thick Circles
#4
I came up with one that I call Balloon_Box, which uses the fill circle routine on the corners.

Code: (Select All)
$COLOR:32

TYPE V2
    x AS INTEGER
    y AS INTEGER
END TYPE

TYPE region
    ul AS V2
    lr AS V2
END TYPE

SCREEN _NEWIMAGE(1024, 512, 32)
DO: LOOP UNTIL _SCREENEXISTS

DIM AS region ulrg, urrg, llrg, lrrg
ulrg.ul.x = 0: ulrg.ul.y = 0: ulrg.lr.x = _WIDTH / 2 - 1: ulrg.lr.y = _HEIGHT / 2 - 1
urrg.ul.x = _WIDTH / 2: urrg.ul.y = 0: urrg.lr.x = _WIDTH - 1: urrg.lr.y = _HEIGHT / 2 - 1
llrg.ul.x = 0: llrg.ul.y = _HEIGHT / 2: llrg.lr.x = _WIDTH / 2 - 1: llrg.lr.y = _HEIGHT - 1
lrrg.ul.x = _WIDTH / 2: lrrg.ul.y = _HEIGHT / 2: lrrg.lr.x = _WIDTH - 1: lrrg.lr.y = _HEIGHT - 1


DO
    CLS
    BalloonRegion ulrg, Green, Blue
    BalloonRegion urrg, Black, Cyan
    BalloonRegion llrg, Black, White
    BalloonRegion lrrg, Blue, Green
    WHILE _MOUSEINPUT: WEND
    'BalloonBox _MOUSEX, _MOUSEY, Green, Red, 0, 0
    BalloonBox 100, 100, Green, Red, _MOUSEX - 50, _MOUSEY - 50
    _LIMIT 30
    _DISPLAY
LOOP UNTIL _KEYDOWN(27)
END

SUB BalloonRegion (r AS region, bk AS _UNSIGNED LONG, vg AS _UNSIGNED LONG)
    BalloonBox r.lr.x - r.ul.x, r.lr.y - r.ul.y, bk, vg, r.ul.x, r.ul.y
END SUB 'BalloonRegion

SUB BalloonBox (wd AS INTEGER, ht AS INTEGER, bk AS _UNSIGNED LONG, vg AS _UNSIGNED LONG, xp AS INTEGER, yp AS INTEGER)
    DIM bbox&, pre&
    DIM radius%, shrink%, wd1%, ht1%
    IF wd < 1 OR ht < 1 THEN EXIT SUB
    radius% = _IIF(wd < ht, wd \ 10, ht \ 10)
    shrink% = radius% \ 4
    bbox& = _NEWIMAGE(wd, ht, 32) '                             balloon
    wd1% = _WIDTH(bbox&) - 1: ht1% = _HEIGHT(bbox&) - 1
    pre& = _DEST
    _DEST bbox&
    CLS , &HFFFF00FF '                                          full magenta masking color
    'Draw outer border in border color (vg)
    LINE (radius%, 0)-(wd1% - radius%, ht1%), vg, BF '          Tall narrow block
    LINE (0, radius%)-(wd1%, ht1% - radius%), vg, BF '          short fat block
    FCirc radius%, radius%, radius%, vg '                       upper left fillet
    FCirc wd1% - radius%, radius%, radius%, vg '                upper right fillet
    FCirc radius%, ht1% - radius%, radius%, vg '                lower left fillet
    FCirc wd1% - radius%, ht1% - radius%, radius%, vg '         lower right fillet
    'draw inner field in background color (bk)
    LINE (radius%, shrink%)-(wd1% - radius%, ht1% - shrink%), bk, BF
    LINE (shrink%, radius%)-(wd1% - shrink%, ht1% - radius%), bk, BF
    FCirc radius%, radius%, radius% - shrink%, bk
    FCirc wd1% - radius%, radius%, radius% - shrink%, bk
    FCirc radius%, ht1% - radius%, radius% - shrink%, bk
    FCirc wd1% - radius%, ht1% - radius%, radius% - shrink%, bk

    _CLEARCOLOR &HFFFF00FF
    _DEST pre&
    _PUTIMAGE (xp, yp), bbox&
    _FREEIMAGE bbox&
END SUB 'BallonBox

SUB FCirc (CX AS INTEGER, CY AS INTEGER, RR AS INTEGER, C AS _UNSIGNED LONG) 'Steve's circle draw
    DIM AS INTEGER R, RError, X, Y
    R = ABS(RR) '                                               radius value along positive x
    RError = -R '                                               opposite side of circle? negative x
    X = R '                                                     point along positive x position
    Y = 0 '                                                     starting at the equator
    IF R = 0 THEN PSET (CX, CY), C: EXIT SUB '                  zero radius is point, not circle
    LINE (CX - X, CY)-(CX + X, CY), C, BF '                     draw equatorial line
    WHILE X > Y
        RError = RError + Y * 2 + 1
        IF RError >= 0 THEN
            IF X <> Y + 1 THEN
                LINE (CX - Y, CY - X)-(CX + Y, CY - X), C, BF ' draw line above equator
                LINE (CX - Y, CY + X)-(CX + Y, CY + X), C, BF ' draw line below equator
            END IF
            X = X - 1
            RError = RError - X * 2
        END IF
        Y = Y + 1
        LINE (CX - X, CY - Y)-(CX + X, CY - Y), C, BF '         draw line north latitudes
        LINE (CX - X, CY + Y)-(CX + X, CY + Y), C, BF '         draw line south latitudes
    WEND
END SUB 'FCirc
DO: LOOP: DO: LOOP
sha_na_na_na_na_na_na_na_na_na:
Reply


Messages In This Thread
RE: Rounded Rectangles and Thick Circles - by OldMoses - 02-02-2026, 04:10 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Circles and Ellipses(Tilt and Fill) SMcNeill 1 960 07-06-2023, 07:07 PM
Last Post: Space_Ghost

Forum Jump:


Users browsing this thread: 1 Guest(s)