Home
JAQForum Ver 24.01
Log In or Join  
Active Topics
Local Time 12:19 16 Oct 2025 Privacy Policy
Jump to

Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.

Forum Index : Microcontroller and PC projects : PicoMiteVGA DEMO

     Page 9 of 9    
Author Message
javavi

Guru

Joined: 01/10/2023
Location: Ukraine
Posts: 516
Posted: 11:51am 23 Jun 2025
Copy link to clipboard 
Print this post

  RonnS said  Hello Javavi, I find your code so beautiful and have translated it into another basic language - do I have your permission to also publish the result on another site (with acknowledgment of the author)?

OK! No restrictions, just fun!
I didn’t invent this code myself, I just adapted the ready-made one to the syntax of MMBASIC and slightly modified it for dynamics.
 
javavi

Guru

Joined: 01/10/2023
Location: Ukraine
Posts: 516
Posted: 04:29pm 26 Jun 2025
Copy link to clipboard 
Print this post

Galaxian

MODE 2
Text 160,0,"000000","CT",7,1
For R=0 To 2: Proc(16*R,238,6,1):Next
Proc(140,230,12,7):Proc(150,192,2,7):Proc(154,50,17,6)
For R=1 To 8
Proc(32*R,150,9,8):Proc(32*R,120,10,9):Proc(32*R,90,8,14)
Next
End

Sub Proc(X0,Y0,Q,C)
Color Map(C)
A=1:W=X0:U=W+2*Q
For X=1 To (Q+2)/2
 Y=Y0:I=1
 Do
   If I And A Then Box W,Y,2,2: Box U,Y,2,2
   Inc Y,-2:Inc I,I
 Loop Until I>A
 A=A*(Q+1-X)/X
 Inc W,2:Inc U,-2
Next
End Sub
 
Volhout
Guru

Joined: 05/03/2018
Location: Netherlands
Posts: 5350
Posted: 08:16pm 26 Jun 2025
Copy link to clipboard 
Print this post

Few more lines and you have a game...
Great !!

Volhout
PicomiteVGA PETSCII ROBOTS
 
Martin H.

Guru

Joined: 04/06/2022
Location: Germany
Posts: 1295
Posted: 05:28am 03 Aug 2025
Copy link to clipboard 
Print this post

I've found a little listing in Facebook and converted it to run in MMBasic
Here the PicomiteVGA Version
mode 2 ' 320x240
Const SCREEN_HEIGHT = 480
Const Q = 3
Dim XP(Q), YP(Q), ZP(Q) As Integer
Dim MX(26,26), MY(26,26) As Integer
cls
' Define charge points
XP(1) = 11 : YP(1) = 6 : ZP(1) = 175
XP(2) = 17 : YP(2) = 18 : ZP(2) = -150
XP(3) = 7 : YP(3) = 19 : ZP(3) = 40
' Projection constants
Dim XS , YS  As Integer
XS = 25: YS = 200
' Fill matrix with transformed coordinates
For X  = 0 To 25
For Y  = 0 To 25
 UPJE = 0
For W  = 1 To Q
D = Sqr((X - XP(W))^2 + (Y - YP(W))^2)
inc UPJE, ZP(W) * Exp(-D / 2)
Next
' Fix grid orientation (X then Y)
MX(X,Y) = XS + 11*X + 11*Y
' Flip Y-axis (to match PC-BASIC lower-left origin)
MY(X,Y) = SCREEN_HEIGHT - (UPJE + YS - X*4 + Y*4)
' Optional: show control points
Pixel MX(X,Y)/2, MY(X,Y)/2, rgb(0,255,255)
Next
Next
' Draw the surface
E = 0
For Y = 25 To 1 Step -1
For X = 0 To 24
X1 = MX(X,Y)/2: Y1 = MY(X,Y)/2
X2 = MX(X+1,Y)/2: Y2 = MY(X+1,Y)/2
X3 = MX(X+1,Y-1)/2: Y3 = MY(X+1,Y-1)/2
X4 = MX(X,Y-1)/2: Y4 = MY(X,Y-1)/2
' Fill with alternating pattern
If (E Mod 2 = 0) Then
K = RGB(0,0,255)
else
K = RGB(0,128,255)
endif
TRIANGLE X1, Y1, X2, Y2,X3, Y3 ,k,k
TRIANGLE X1, Y1, X4, Y4,X3, Y3 ,k,k
Line X1,Y1 ,X2,Y2,, K
Line X2,Y2 ,X3,Y3,, K
Line X3,Y3,X4,Y4,, K
Line X4,Y4,X1,Y1,, K

XPc = (X1 + X3) \ 2
YPc = (Y1 + Y3) \ 2
' Highlight border
K = RGB(255,255,255)
Line X1,Y1,X2,Y2,, K
Line X2,Y2 ,X3,Y3,, K
Line X3,Y3,X4,Y4,, K
Line X4,Y4,X1,Y1,, K
inc E
Next
Next



Since the program was designed for 640x360, I divided all screen coordinates by 2.
Not elegant but it works
Cheers
 Martin
Edited 2025-08-03 15:31 by Martin H.
'no comment
 
Amnesie
Guru

Joined: 30/06/2020
Location: Germany
Posts: 706
Posted: 06:34am 03 Aug 2025
Copy link to clipboard 
Print this post

  Martin H. said  I've found a little listing in Facebook and converted it to run in MMBasic
Here the PicomiteVGA Version
mode 2 ' 320x240
Const SCREEN_HEIGHT = 480
Const Q = 3
Dim XP(Q), YP(Q), ZP(Q) As Integer
Dim MX(26,26), MY(26,26) As Integer
cls
' Define charge points
XP(1) = 11 : YP(1) = 6 : ZP(1) = 175
XP(2) = 17 : YP(2) = 18 : ZP(2) = -150
XP(3) = 7 : YP(3) = 19 : ZP(3) = 40
' Projection constants
Dim XS , YS  As Integer
XS = 25: YS = 200
' Fill matrix with transformed coordinates
For X  = 0 To 25
For Y  = 0 To 25
 UPJE = 0
For W  = 1 To Q
D = Sqr((X - XP(W))^2 + (Y - YP(W))^2)
inc UPJE, ZP(W) * Exp(-D / 2)
Next
' Fix grid orientation (X then Y)
MX(X,Y) = XS + 11*X + 11*Y
' Flip Y-axis (to match PC-BASIC lower-left origin)
MY(X,Y) = SCREEN_HEIGHT - (UPJE + YS - X*4 + Y*4)
' Optional: show control points
Pixel MX(X,Y)/2, MY(X,Y)/2, rgb(0,255,255)
Next
Next
' Draw the surface
E = 0
For Y = 25 To 1 Step -1
For X = 0 To 24
X1 = MX(X,Y)/2: Y1 = MY(X,Y)/2
X2 = MX(X+1,Y)/2: Y2 = MY(X+1,Y)/2
X3 = MX(X+1,Y-1)/2: Y3 = MY(X+1,Y-1)/2
X4 = MX(X,Y-1)/2: Y4 = MY(X,Y-1)/2
' Fill with alternating pattern
If (E Mod 2 = 0) Then
K = RGB(0,0,255)
else
K = RGB(0,128,255)
endif
TRIANGLE X1, Y1, X2, Y2,X3, Y3 ,k,k
TRIANGLE X1, Y1, X4, Y4,X3, Y3 ,k,k
Line X1,Y1 ,X2,Y2,, K
Line X2,Y2 ,X3,Y3,, K
Line X3,Y3,X4,Y4,, K
Line X4,Y4,X1,Y1,, K

XPc = (X1 + X3) \ 2
YPc = (Y1 + Y3) \ 2
' Highlight border
K = RGB(255,255,255)
Line X1,Y1,X2,Y2,, K
Line X2,Y2 ,X3,Y3,, K
Line X3,Y3,X4,Y4,, K
Line X4,Y4,X1,Y1,, K
inc E
Next
Next



Since the program was designed for 640x360, I divided all screen coordinates by 2.
Not elegant but it works
Cheers
 Martin


Martin,

this is funny, I saw the same exact post in this Facebook-Group, too and also wondered if it can be translated to MMBASIC    And now you're posting this! Hah!  

Greetings
Daniel
 
Martin H.

Guru

Joined: 04/06/2022
Location: Germany
Posts: 1295
Posted: 07:04am 03 Aug 2025
Copy link to clipboard 
Print this post

Good Morning Daniel,
Sometimes you do strange things with your first coffee on a Sunday morning
I have now (after coffee) also noticed that the 4 “Line” commands after the “Triangle” commands can be omitted
Edited 2025-08-03 17:09 by Martin H.
'no comment
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10486
Posted: 08:38am 03 Aug 2025
Copy link to clipboard 
Print this post

Looks even better in 1280x720 mode 3 (640x360)





MODE 3 ' 640x360
Const SCREEN_HEIGHT = 360
Const Q = 3
Dim XP(Q), YP(Q), ZP(Q) As Integer
Dim MX(26,26), MY(26,26) As Integer
CLS
' Define charge points
XP(1) = 11 : YP(1) = 6 : ZP(1) = 175
XP(2) = 17 : YP(2) = 18 : ZP(2) = -150
XP(3) = 7 : YP(3) = 19 : ZP(3) = 40
' Projection constants
Dim XS , YS  As Integer
XS = 25: YS = 200
' Fill matrix with transformed coordinates
For X  = 0 To 25
For Y  = 0 To 25
UPJE = 0
For W  = 1 To Q
D = Sqr((X - XP(W))^2 + (Y - YP(W))^2)
Inc UPJE, ZP(W) * Exp(-D / 2)
Next
' Fix grid orientation (X then Y)
MX(X,Y) = XS + 11*X + 11*Y
' Flip Y-axis (to match PC-BASIC lower-left origin)
MY(X,Y) = SCREEN_HEIGHT - (UPJE + YS - X*4 + Y*4)
' Optional: show control points
Pixel MX(X,Y), MY(X,Y), RGB(0,255,255)
Next
Next
' Draw the surface
E = 0
For Y = 25 To 1 Step -1
For X = 0 To 24
X1 = MX(X,Y): Y1 = MY(X,Y)
X2 = MX(X+1,Y): Y2 = MY(X+1,Y)
X3 = MX(X+1,Y-1): Y3 = MY(X+1,Y-1)
X4 = MX(X,Y-1): Y4 = MY(X,Y-1)
' Fill with alternating pattern
If (E Mod 2 = 0) Then
K = RGB(0,0,255)
Else
K = RGB(0,128,255)
EndIf
Triangle X1, Y1, X2, Y2,X3, Y3 ,k,k
Triangle X1, Y1, X4, Y4,X3, Y3 ,k,k

XPc = (X1 + X3)
YPc = (Y1 + Y3)
' Highlight border
K = RGB(255,255,255)
Line X1,Y1,X2,Y2,, K
Line X2,Y2 ,X3,Y3,, K
Line X3,Y3,X4,Y4,, K
Line X4,Y4,X1,Y1,, K
Inc E
Next
Next
Save image "layer"
 
Martin H.

Guru

Joined: 04/06/2022
Location: Germany
Posts: 1295
Posted: 09:18am 03 Aug 2025
Copy link to clipboard 
Print this post

  matherp said  Looks even better in 1280x720 mode 3 (640x360)




Thank you Peter,
This certainly looks better
Have a good Sunday
Cheers
 Martin
'no comment
 
javavi

Guru

Joined: 01/10/2023
Location: Ukraine
Posts: 516
Posted: 04:54pm 03 Aug 2025
Copy link to clipboard 
Print this post

Mandelbrot MODE 2 / MODE 3

MODE 2
Dim CM(3)=(RGB(Blue),RGB(Cyan),RGB(Yellow),RGB(Magenta))
Dim R(15)=(0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5)
L=Log(2)
S=0:For U=-1.725 To -1.225 Step .5/MM.HRES
D=0:For V=-0.2 To .0000002 Step .4/MM.VRES
Color CM(Int((fM(U,V)+R(S Mod 4+4*(D Mod 4)))/16)Mod 4)
Pixel S,D:Pixel S,MM.VRES-D
Inc D: Next V
Inc S: Next U
Do :Loop While Inkey$=""

Function fM(U,V)
Local X,Y,A,B,C
Do
 Y=2*X*Y+V
 X=A-B+U
 A=X*X
 B=Y*Y
 Inc C
Loop Until C>=50 Or A+B>16
If C=50 Then fM=0 Else fM=5*(C+1-Log((Log(A+B)/2)/L)/L)
End Function
 
stanleyella

Guru

Joined: 25/06/2022
Location: United Kingdom
Posts: 2659
Posted: 05:53pm 03 Aug 2025
Copy link to clipboard 
Print this post

nice. can the colours be mapped and rotated?
 
javavi

Guru

Joined: 01/10/2023
Location: Ukraine
Posts: 516
Posted: 09:12am 10 Aug 2025
Copy link to clipboard 
Print this post

Cylinder on a plane by bazzargh 10.07.2025
# Weekend MMBasic Entertainment
# Procedural graphics

Q=.755/8
Z=.636363/8
C=.527225
For X=0 To 1280 Step 2
For Y=0 To 1000 Step 2
V=(X+4*Y)\500
W=(X-Y+450)\200
F=1
If (X>70 And X<430 And Y>300 And Y<900)Or((X-250)*(X-250)/8+(Y-300)*(Y-300)<4000) Then
 F=1-X/250:F=F*(F>0)
EndIf
If (X-250)*(X-250)/8+(Y-900)*(Y-900)<4000 Then F=0
If F=1 And V>1 And V<7 And W>0 And W<6 Then
 F=.5+.25*((W+V)Mod 2)-.25*(X>250 And X-3*Y>-900 And X-8*Y<-1600)
EndIf
I=Q*X+Z*Y+C
I=I-Int(I)
If Int(F)-(F-Int(F)>I) And 1 Then Pixel X\2,500-Y\2
Next :Next
 
Martin H.

Guru

Joined: 04/06/2022
Location: Germany
Posts: 1295
Posted: 11:29am 10 Aug 2025
Copy link to clipboard 
Print this post

Hi javavi
I have no idea how the program does it, but it's brilliant
'no comment
 
vegipete

Guru

Joined: 29/01/2013
Location: Canada
Posts: 1144
Posted: 03:19pm 10 Aug 2025
Copy link to clipboard 
Print this post

Here's a slight change to the cylinder on checker-board so it fits on a 320 pixel wide screen, and possibly runs slightly faster:
Q=.755/8
Z=.636363/8
C=.527225
For X=0 To 1280 Step 4
 For Y=0 To 1000 Step 4
   V=(X+4*Y)\500
   W=(X-Y+450)\200
   F=1
   X2=X-250
   X3=X2*X2/8
   If (X>70 And X<430 And Y>300 And Y<900)Or(X3+(Y-300)*(Y-300)<4000) Then
     F=1-X/250:F=F*(F>0)
   EndIf
   If X3+(Y-900)*(Y-900)<4000 Then F=0
   If F=1 And V>1 And V<7 And W>0 And W<6 Then
     F=.5+.25*((W+V)Mod 2)-.25*(X>250 And X-3*Y>-900 And X-8*Y<-1600)
   EndIf
   I=Q*X+Z*Y+C
   I=I-Int(I)
   If Int(F)-(F-Int(F)>I) And 1 Then Pixel X\4,250-Y\4
 Next
Next

Visit Vegipete's *Mite Library for cool programs.
 
stanleyella

Guru

Joined: 25/06/2022
Location: United Kingdom
Posts: 2659
Posted: 11:00pm 10 Aug 2025
Copy link to clipboard 
Print this post

looks fine ili9341
 
Martin H.

Guru

Joined: 04/06/2022
Location: Germany
Posts: 1295
Posted: 07:44am 13 Aug 2025
Copy link to clipboard 
Print this post

Found on Facebook
sh=MM.VRes : sw=MM.HRes
xc = sw / 2 : yc = sh / 2
rad = sh / 40
For j = 1 To 9999
CLS
a = Rnd(1)
If a > 0.86 Then a = a * 0.86
If a < 0.1 Then a = a + 0.1
If a = 0.5 Then a = 0.4999
b = 0.9998
Print @(5,5) a
p = 15000
c = 2 - 2 * a
x = 0
y = 12.17
w = a * x + c * x * x / (1 + x * x)
For h = 0 To p
If h > 150 Then
ct = 1.1 * Sqr(x * x + y * y) / rad
cr = 83 * ct : If cr >255 Then cr = cr/5
cg = 177 * ct : If cg >255 Then cg = cg/5
cb = 186 * ct : If Cb >255 Then cb = cb/5
Pixel x * rad + xc, y * rad + yc, RGB(cr, cg, cb)
z = x
x = b * y + w
u = x * x
w = a * x + c * u / (1 + u)
y = w - z
End If
Next h
Pause 300
Next j

Edited 2025-08-13 17:44 by Martin H.
'no comment
 
phil99

Guru

Joined: 11/02/2018
Location: Australia
Posts: 2777
Posted: 08:20am 13 Aug 2025
Copy link to clipboard 
Print this post

After a while this happened:-
[23] Pixel x * rad + xc, y * rad + yc, RGB(cr, cg, cb)
Error : 256 is invalid (valid is 0 to 255)

So added rollovers to the colours.
sh=MM.VRES : sw=MM.HRES
xc = sw / 2 : yc = sh / 2
rad = sh / 40
For j = 1 To 9999
  CLS
  a = Rnd(1)
  If a > 0.86 Then a = a * 0.86
     If a < 0.1 Then a = a + 0.1
  If a = 0.5 Then a = 0.4999
  b = 0.9998
  Print @(5,5) a
  p = 15000
  c = 2 - 2 * a
  x = 0
  y = 12.17
  w = a * x + c * x * x / (1 + x * x)
  For h = 0 To p
   If h > 150 Then
    ct = 1.1 * Sqr(x * x + y * y) / rad
    cr = 83 * ct : If cr >255 Then cr = cr/5
    cg = 177 * ct : If cg >255 Then cg = cg/5
    cb = 186 * ct : If Cb >255 Then cb = cb/5
    cr = cr And 255
    cg = cg And 255
    cb = cb And 255
    Pixel x * rad + xc, y * rad + yc, RGB(cr, cg, cb)
    z = x
    x = b * y + w
    u = x * x
    w = a * x + c * u / (1 + u)
    y = w - z
   End If
  Next h
  Pause 300
Next j

Edited 2025-08-13 18:24 by phil99
 
javavi

Guru

Joined: 01/10/2023
Location: Ukraine
Posts: 516
Posted: 05:31pm 23 Aug 2025
Copy link to clipboard 
Print this post

Waves 640х480

MODE 1
Dim float t,d,h
Dim integer x,y,x1,y1,z
FRAMEBUFFER CREATE
FRAMEBUFFER WRITE F
Do
 CLS
 For y1=0 To 24
   For x1=0 To 24
     x=12*(24-x1)+12*y1+30
     y=-6*(24-x1)+6*y1+240
     h=60*Sin((x1-y1)/4+t)
     'h=60*Sin((x1+y1)/4+t)
     'h=60*Sin(x1/2+t)+60*Cos(y1/2+t)
     Circle x,y-h,7,,,0,1
   Next
 Next
 FRAMEBUFFER COPY F,N,B
 Inc t,.2
Loop
 
stanleyella

Guru

Joined: 25/06/2022
Location: United Kingdom
Posts: 2659
Posted: 06:58pm 23 Aug 2025
Copy link to clipboard 
Print this post

nice demo! works as is hdmi. bit harder to work on ili9341 display, still working on it
 
javavi

Guru

Joined: 01/10/2023
Location: Ukraine
Posts: 516
Posted: 05:54pm 02 Oct 2025
Copy link to clipboard 
Print this post

Drawing a fractal

l=7
s=520
h=s*Sqr(3)/2
x=320-s/2:y=160-h/3
b=320+s/2:c=y
d=320:e=160+h*2/3
CLS RGB(Blue)
PROCF(x,y,b,c,l)
PROCF(b,c,d,e,l)
PROCF(d,e,x,y,l)
End

Sub PROCF(x,y,b,c,l)
If l=0 Then PROCd(x,y,b,c) Else PROCsd(x,y,b,c,l)
End Sub

Sub PROCd(x,y,b,c)
Line x,y,b,c
End Sub

Sub PROCsd(x,y,b,c,l)
Local i,j,k,m,n,o,g,h,a
a=Pi/3
g=(b-x)/3:h=(c-y)/3
i=x+g:j=y+h
k=x+2*g:m=y+2*h
n=i+(g*Cos(a)-h*Sin(a))
o=j+(g*Sin(a)+h*Cos(a))
PROCF(x,y,i,j,l-1)
PROCF(i,j,n,o,l-1)
PROCF(n,o,k,m,l-1)
PROCF(k,m,b,c,l-1)
End Sub
 
toml_12953
Guru

Joined: 13/02/2015
Location: United States
Posts: 470
Posted: 10:08pm 02 Oct 2025
Copy link to clipboard 
Print this post

  javavi said  DEMO: PCB Router


That almost works in MMBASIC for Windows, too.
The only exception is that some traces (green lines)
aren't connected to anything.
 
     Page 9 of 9    
Print this page


To reply to this topic, you need to log in.

The Back Shed's forum code is written, and hosted, in Australia.
© JAQ Software 2025