Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Drawing 20 planets with graphical commands
#1
Hello team! I thought I would share a bit of fun code with graphical statements, to draw planets randomly. Trying to make it as beautiful as possible.

Code: (Select All)

Screen _NewImage(800, 600, 32)
_Title "20 Beautiful Planets in QB64PE"
Randomize Timer
Type PlanetData
    x As Integer
    y As Integer
    radius As Integer
    r As Integer
    g As Integer
    b As Integer
    hasRings As Integer
    ringAngle As Single
    atmosphere As Integer
    spots As Integer
End Type

Dim Shared Planets(1 To 20) As PlanetData
Dim Shared i As Integer
Dim Shared f As Long

f = _LoadFont("Arial.ttf", 16, "MONOSPACE")
If f > 0 Then _Font f

For i = 1 To 20
    Planets(i).x = 70 + ((i - 1) Mod 5) * 150
    Planets(i).y = 70 + ((i - 1) \ 5) * 120
    Planets(i).radius = 20 + Rnd * 25
    Planets(i).hasRings = IIf(Rnd > 0.5, -1, 0)
    Planets(i).ringAngle = Rnd * _Pi
    Planets(i).atmosphere = IIf(Rnd > 0.3, -1, 0)
    Planets(i).spots = Int(Rnd * 8) + 2
    Select Case i
        Case 1: ' Blue gas giant
            Planets(i).r = 50: Planets(i).g = 100: Planets(i).b = 200
        Case 2: ' Red desert planet
            Planets(i).r = 180: Planets(i).g = 80: Planets(i).b = 60
        Case 3: ' Green jungle planet
            Planets(i).r = 60: Planets(i).g = 150: Planets(i).b = 80
        Case 4: ' Purple crystal planet
            Planets(i).r = 150: Planets(i).g = 70: Planets(i).b = 200
        Case 5: ' Orange lava planet
            Planets(i).r = 220: Planets(i).g = 120: Planets(i).b = 40
        Case 6: ' Ice planet
            Planets(i).r = 200: Planets(i).g = 230: Planets(i).b = 250
        Case 7: ' Brown rocky planet
            Planets(i).r = 140: Planets(i).g = 110: Planets(i).b = 90
        Case 8: ' Pink nebula planet
            Planets(i).r = 230: Planets(i).g = 150: Planets(i).b = 200
        Case 9: ' Yellow sun-like
            Planets(i).r = 240: Planets(i).g = 220: Planets(i).b = 100
        Case 10: ' Teal ocean planet
            Planets(i).r = 70: Planets(i).g = 180: Planets(i).b = 170
        Case 11: ' Maroon volcanic
            Planets(i).r = 120: Planets(i).g = 40: Planets(i).b = 50
        Case 12: ' Cyan gas giant
            Planets(i).r = 80: Planets(i).g = 200: Planets(i).b = 220
        Case 13: ' Gold metallic
            Planets(i).r = 210: Planets(i).g = 180: Planets(i).b = 80
        Case 14: ' Emerald green
            Planets(i).r = 40: Planets(i).g = 180: Planets(i).b = 120
        Case 15: ' Deep blue
            Planets(i).r = 30: Planets(i).g = 70: Planets(i).b = 150
        Case 16: ' Rust planet
            Planets(i).r = 170: Planets(i).g = 90: Planets(i).b = 70
        Case 17: ' Lilac planet
            Planets(i).r = 180: Planets(i).g = 140: Planets(i).b = 220
        Case 18: ' Turquoise
            Planets(i).r = 70: Planets(i).g = 210: Planets(i).b = 190
        Case 19: ' Copper
            Planets(i).r = 190: Planets(i).g = 130: Planets(i).b = 100
        Case 20: ' Violet storm
            Planets(i).r = 130: Planets(i).g = 80: Planets(i).b = 180
    End Select
Next i
Cls , _RGB32(5, 5, 20)

For i = 1 To 200
    PSet (Rnd * 800, Rnd * 600), _RGB32(200 + Rnd * 55, 200 + Rnd * 55, 200 + Rnd * 55)
Next i

For i = 1 To 5
    DrawNebula Rnd * 800, Rnd * 600, Int(Rnd * 100) + 50
Next i

For i = 1 To 20
    DrawPlanet Planets(i)
Next i


Color _RGB32(180, 180, 255)
_PrintMode _KeepBackground
_PrintString (320, 550), "Press SPACE to regenerate"
_PrintString (350, 570), "Press ESC to exit"


Do
    k$ = InKey$
    If k$ = " " Then
        Randomize Timer
        For i = 1 To 20
            Planets(i).radius = 20 + Rnd * 25
            Planets(i).hasRings = IIf(Rnd > 0.5, -1, 0)
            Planets(i).ringAngle = Rnd * _Pi
            Planets(i).atmosphere = IIf(Rnd > 0.3, -1, 0)
            Planets(i).spots = Int(Rnd * 8) + 2
        Next i
        Cls , _RGB32(5, 5, 20)
        For i = 1 To 200
            PSet (Rnd * 800, Rnd * 600), _RGB32(200 + Rnd * 55, 200 + Rnd * 55, 200 + Rnd * 55)
        Next i
        For i = 1 To 5
            DrawNebula Rnd * 800, Rnd * 600, Int(Rnd * 100) + 50
        Next i
        For i = 1 To 20
            DrawPlanet Planets(i)
        Next i
        Color _RGB32(180, 180, 255)
        _PrintString (320, 550), "Press SPACE to regenerate"
        _PrintString (350, 570), "Press ESC to exit"
    End If
    _Limit 30
Loop Until k$ = Chr$(27)

System

Sub DrawPlanet (p As PlanetData)

    For r = p.radius To 0 Step -1
        intensity = 0.3 + 0.7 * (r / p.radius)
        Circle (p.x - 3, p.y - 3), r, _RGB32(p.r * intensity * 0.3, p.g * intensity * 0.3, p.b * intensity * 0.3)
    Next r
    For r = p.radius To 0 Step -1
        intensity = 0.5 + 0.5 * (r / p.radius)
        gradient = 0.7 + 0.3 * Sin(r * _Pi / p.radius)
        Circle (p.x, p.y), r, _RGB32(p.r * intensity * gradient, p.g * intensity * gradient, p.b * intensity * gradient)
    Next r
    If p.atmosphere Then
        For r = p.radius + 3 To p.radius + 10 Step 1
            alpha = 50 - (r - p.radius - 3) * 7
            If alpha > 0 Then
                Circle (p.x, p.y), r, _RGBA32(p.r, p.g, p.b, alpha)
            End If
        Next r
    End If
    If p.hasRings Then
        DrawRings p.x, p.y, p.radius, p.ringAngle, p.r, p.g, p.b
    End If
    DrawSurfaceDetails p.x, p.y, p.radius, p.spots, p.r, p.g, p.b
    For r = p.radius \ 3 To 0 Step -1
        intensity = 0.8 + 0.2 * (r / (p.radius \ 3))
        Circle (p.x - p.radius \ 3, p.y - p.radius \ 3), r, _RGBA32(255, 255, 255, 100 * intensity)
    Next r
End Sub

Sub DrawRings (x, y, radius, angle, r, g, b)
    For ring = 1 To 3
        ringRadius = radius + 15 + ring * 5
        ringWidth = 3
        For w = -ringWidth To ringWidth
            For a = 0 To _Pi(2) Step 0.01
                rx = ringRadius * Cos(a)
                ry = (ringRadius + w) * Sin(a) * 0.3
                rx2 = rx * Cos(angle) - ry * Sin(angle)
                ry2 = rx * Sin(angle) + ry * Cos(angle)
                distFromCenter = Abs(w) / ringWidth
                alpha = 150 * (1 - distFromCenter)
                ringColor = _RGBA32(r + 30, g + 30, b + 30, alpha)
                PSet (x + rx2, y + ry2), ringColor
            Next a
        Next w
    Next ring
End Sub

Sub DrawSurfaceDetails (x, y, radius, numSpots, baseR, baseG, baseB)
    For spot = 1 To numSpots
        angle = Rnd * _Pi(2)
        distance = Rnd * radius * 0.8
        spotX = x + distance * Cos(angle)
        spotY = y + distance * Sin(angle)
        spotSize = radius * (0.1 + Rnd * 0.2)
        spotType = Int(Rnd * 3)
        Select Case spotType
            Case 0:
                spotR = baseR * 0.5
                spotG = baseG * 0.5
                spotB = baseB * 0.5
            Case 1:
                spotR = _Min(255, baseR * 1.3)
                spotG = _Min(255, baseG * 1.3)
                spotB = _Min(255, baseB * 1.3)
            Case 2:
                spotR = _Min(255, baseG * 1.2)
                spotG = _Min(255, baseB * 1.2)
                spotB = _Min(255, baseR * 1.2)
        End Select
        For r = spotSize To 0 Step -1
            alpha = 200 * (r / spotSize)
            Circle (spotX, spotY), r, _RGBA32(spotR, spotG, spotB, alpha)
        Next r
        If Rnd > 0.7 Then
            craterSize = spotSize * 0.5
            Circle (spotX + craterSize * 0.3, spotY + craterSize * 0.3), craterSize, _RGB32(baseR * 0.3, baseG * 0.3, baseB * 0.3)
            Circle (spotX + craterSize * 0.2, spotY + craterSize * 0.2), craterSize * 0.7, _RGB32(baseR * 0.7, baseG * 0.7, baseB * 0.7)
        End If
    Next spot
End Sub

Sub DrawNebula (x, y, size)
    For i = 1 To 5
        nx = x + (Rnd - 0.5) * size
        ny = y + (Rnd - 0.5) * size
        ns = size * (0.3 + Rnd * 0.3)
        nr = 50 + Rnd * 100
        ng = 50 + Rnd * 100
        nb = 100 + Rnd * 100
        For r = ns To 0 Step -1
            alpha = 30 * (r / ns)
            Circle (nx, ny), r, _RGBA32(nr, ng, nb, alpha)
        Next r
    Next i
End Sub

Function IIf% (condition, trueValue, falseValue)
    If condition Then
        IIf = trueValue
    Else
        IIf = falseValue
    End If
End Function

Let me know what you think!
Reply


Messages In This Thread
Drawing 20 planets with graphical commands - by Delsus - 02-05-2026, 06:59 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  A drawing program Frederick 8 552 02-28-2026, 04:45 PM
Last Post: Frederick
  BallDraw - simple drawing programing using colored balls Dav 2 390 11-11-2025, 08:57 PM
Last Post: Dav
  Improved my small Gradient Ball drawing SUB Dav 22 5,367 07-13-2023, 05:23 PM
Last Post: Dav
  "Slower" Line Drawing Example James D Jarvis 2 1,139 05-13-2023, 03:56 PM
Last Post: James D Jarvis
  Simple drawing that fades to background. Dav 8 1,621 11-05-2022, 03:09 PM
Last Post: Pete

Forum Jump:


Users browsing this thread: 1 Guest(s)