Webmail
Director web
::
Tutoriale
::
Code archive
::
Upload
::
Forum
::
Acasã
|
Ajutor
|
Cãutare
|
Autentificare
|
Înregistrare
» Utilizator
» Parteneri
» Linux Server
» WorldIT.info
» Web hosting
» Gazduire web
» IPFind
» Invatam.net
» PC Troubleshooting
» RegEx
» sigur.info
» Computericã
» De citit
» LAMP in CentOS
» LAMP in Ubuntu Server
» FAMP/LAMP in FreeBSD
» Formular de contact
» Optimizare Apache
» Optimizare MySQL
» Recomandari
» Hazardous Gaming
» What I Know
» PHP Funk
» Taskuri securitate
» Anti spam
» O parola eficienta
» Trojan, backdoor, spyware
» Phishing si pharming
» Securizare windows
» Cum functioneaza un virus?
» Certificate SSL
» Gumblar
» Un firewall eficient
» Ingineria sociala
» Statistici
65571
de mesaje.
7753
de topicuri.
1305
de utilizatori.
allerhoofNole
e ultimul utilizator inregistrat.
[Detalii]
SkullBox Forum
|
Development
|
Basic si Fox
| Topic:
[FreeBASIC/QBasic]Functii desenare
|
|
Pagini: [
1
]
Print
[FreeBASIC/QBasic]Functii desenare [763 afisari]
zapakitul
Mesaje: 1930
Offline
[FreeBASIC/QBasic]Functii desenare
Ieri ma apucat o dorinta nebuna de a face urmatorul pas in lumea 3D, si anume sa inteleg tot ce sta in spatele ei, si sa "modelez" si sa afisez obiecte in 3D fara a folosi Directx sau openGl, ci practic sa creez totu pornind de la lini si puncte. Asa c-a m-am apucat de treaba si jucandu-ma putin am scos cateva "perle". Practic prima mea dorinta a fost sa creez o linie 3D daca pot sa spun asa. Ideea a fost simpla, o linie dintr-un spatiu 3D sa o proiectez intr-unul 2D. Pe baza acestei lini am trecut mai departe si am facut cateva functii de desenare a unor tri-unghiuri si patrulatere "3D". Nu e cine stie ce, dar as vrea totusi sa postez rezultate pe masura ce aprofundez.
Sursa ar fi urmatoarea:
Code:
/'
Brawn Engine: 2D-3D Proof of concept
Use it in any way you want... Be sure just to use #include once "brawn.bi" in you projects'/
Declare Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
Declare Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Declare Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
Declare Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Declare Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),4
End Sub
Sub Draw3DlineGreen(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),2
End Sub
Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Draw3DlineGreen(x1,y1,z1,x2,y2,z2)
Draw3DlineGreen(x2,y2,z2,x3,y3,z3)
Draw3DlineGreen(x3,y3,z3,x1,y1,z1)
End Sub
Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Draw3Dline(x1,y1,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,x3,y3,z3)
Draw3Dline(x3,y3,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,x1,y1,z1)
End Sub
Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
dim msx As Integer, msy As Integer, buttons As Integer
dim mouse As Integer
mouse = getmouse (msx, msy, buttons)
Draw3Dline(x1,y1,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,msx,msy,z3)
Draw3Dline(msx,msy,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,x1,y1,z1)
End Sub
Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
dim c As integer
c = sqr(a*a + b*b)
line(a, y1)-(b,y2)
line(b, y2)-(c,y3)
line(c, y3)-(a,y1)
End Sub
Si un mic exemplu de folosire:
Code:
#include once "functii_desenare.bi"
Screen 13
Do
cls
Draw3DQuadrilater_Mouse(70,10,1,150,10,1,100,60,1,180,60,1)
Draw3Dtriangle(60,20,1,27,20,1,67,103,1)
Draw2DTriangle(10,17,0,90,30)
Draw3DQuadrilater(50,50,1,100,100,1,50,150,1,300,200,1)
ScreenSync
loop
Screenshot + Executabil:
Logged
13-12-2008, 10:51
Twitt
::
DarkByte
Mesaje:
Răspuns: [FreeBASIC/QBasic]Functii desenare
Apropos de proiectari forme 3D intr-un spatiu 2D, incearca sa faci un program care sa simuleze screensaver-ul "Starfield" din Windows. Ai niste puncte ("stele") la distante variabile si se apropie de monitor.
Bafta
Logged
13-12-2008, 11:51
Twitt
::
zapakitul
Mesaje: 1930
Offline
Răspuns: [FreeBASIC/QBasic]Functii desenare
Am mai lucrat in seara asta ce am mai lucrat si am mai adaugat vreo 2 functii si anume: Draw3DPoint (amplaseaza un punct dupa cele 3 coordonate spatiale) si Fill3D (umple o zona delimitata de 4 coordonate: x1-x2 si y1-y2). De asemenea cu aceast mic update am facut si cateva demo-uri, si pe langa asta am adaugat si mica mea incercare de a Studia Rotatile folosindu-ma de functiile matematice Sin si Cos. Proiectul meu de studiu momentan nu este foarte interesant dar sper sa devina din ce in ce mai atractiv atat pentru mine, cat si pentru voi... Asa, noua sursa:
Code:
/'
Brawn Engine: 2D-3D Proof of concept
Use it in any way you want... Be sure just to use #include once "brawn.bi" in you projects'/
Declare Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
Declare Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Declare Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
Declare Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Declare Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Declare Sub Draw3DPoint(x As integer, y As integer, z As integer)
Declare Sub Draw3DPointCLR(x As integer, y As integer, z As integer, clr As integer)
Declare Sub Fill3D(x1 As integer, x2 As integer, y1 As integer, y2 As integer,za As integer, clr As integer)
Sub Fill3D(x1 As integer, x2 As integer, y1 As integer, y2 As integer, z As integer, clr As integer)
dim x As integer, y As integer
For x = x1 to x2
For y = y1 to y2
Draw3dPointCLR(x,y,z,clr)
Next y
Next x
End Sub
Sub Draw3Dline(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),4
End Sub
Sub Draw3DPoint(x As integer, y As integer, z As integer)
dim x3d As integer, y3d As integer
x3d = x/z
y3d = y/z
pset (x3d,y3d),3
End Sub
Sub Draw3DPointCLR(x As integer, y As integer, z As integer, clr As integer)
dim x3d As integer, y3d As integer
x3d = x/z
y3d = y/z
pset (x3d,y3d),clr
End Sub
Sub Draw3DlineGreen(x1 As integer,y1 As integer,z1 As integer,x2 As integer,y2 As integer,z2 As integer)
dim x1_point As integer, y1_point As integer, x2_point As integer, y2_point As integer
x1_point = x1/z1
y1_point = y1/z1
x2_point = x2/z2
y2_point = y2/z2
line (x1_point,y1_point)-(x2_point,y2_point),2
End Sub
Sub Draw3Dtriangle(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer)
Draw3DlineGreen(x1,y1,z1,x2,y2,z2)
Draw3DlineGreen(x2,y2,z2,x3,y3,z3)
Draw3DlineGreen(x3,y3,z3,x1,y1,z1)
End Sub
Sub Draw3DQuadrilater(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
Draw3Dline(x1,y1,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,x3,y3,z3)
Draw3Dline(x3,y3,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,x1,y1,z1)
End Sub
Sub Draw3DQuadrilater_Mouse(x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer, x4 As integer, y4 As integer, z4 As integer)
dim msx As Integer, msy As Integer, buttons As Integer
dim mouse As Integer
mouse = getmouse (msx, msy, buttons)
Draw3Dline(msx,msy,z1,x2,y2,z2)
Draw3Dline(x2,y2,z2,x3,y3,z3)
Draw3Dline(x3,y3,z3,x4,y4,z4)
Draw3Dline(x4,y4,z4,msx,msy,z1)
End Sub
Sub Draw2DTriangle(a As integer, b As integer, y1 As integer, y2 As integer, y3 As integer )
dim c As integer
c = sqr(a*a + b*b)
line(a, y1)-(b,y2)
line(b, y2)-(c,y3)
line(c, y3)-(a,y1)
End Sub
Si acuma, demo-urile:
Draw3DPoint Demo:
Code:
#include once "brawn.bi"
dim x As integer, y As integer, z As integer
Screen 16
Do
cls
For x = 1 to 600 step 10
For y = 1 to 400 step 10
For z = 1 to 10
Draw3DPointCLR(x,y,z,2)
Next z
Next y
Next x
For x = 400 to 600 step 5
For y = 200 to 400 step 3
For z = 1 to 32
Draw3DPointCLR(x,y,z,5)
Next z
Next y
Next x
ScreenSync
loop
Incercarea de a crea un triunghi 3D care se roteste folosind Stanga si Dreapta:
Code:
#include once "brawn.bi"
#include "fbgfx.bi"
Using FB
'Punctele de origine
dim x1 As integer, y1 As integer, z1 As integer, x2 As integer, y2 As integer, z2 As integer, x3 As integer, y3 As integer, z3 As integer
x1 = 200
x2 = 200
x3 = 400
y1 = 150
y2 = 250
y3 = 150
z1 = 1
z2 = 1
z3 = 1
'Noile Puncte
dim old_x1 As integer, old_y1 As integer, old_z1 As integer, old_x2 As integer, old_y2 As integer, old_z2 As integer, old_x3 As integer, old_y3 As integer, old_z3 As integer
old_x1 = x1
old_x2 = x2
old_x3 = x3
old_y1 = y1
old_y2 = y2
old_y3 = y3
old_z1 = z1
old_z2 = z2
old_z3 = z3
Screen 16
Do
cls
If multikey(SC_RIGHT) Then
x1 = x1*Cos(45) - y1*sin(45)
y1 = y1*Cos(45) - x1*sin(45)
old_x1 = x1
old_y1 = y1
EndIf
If multikey(SC_Left) Then
x1 = -(x1*Cos(45) - y1*sin(45))
y1 = -(y1*Cos(45) - x1*sin(45))
old_x1 = x1
old_y1 = y1
EndIf
Draw3DTriangle(old_x1,old_y1,old_z1,old_x2,old_y2,old_z2,old_x3,old_y3,old_z3)
ScreenSync
loop
Desen facut folosind: Draw3DQuadrilater, Draw3DTriangle si Fill3D:
Code:
#include once "brawn.bi"
dim xm As integer, ym As integer, buttons As integer
dim react As integer
dim res As Integer
Screen 16
Do
cls
res = getmouse (xm, ym, , buttons)
Locate 1, 1
If res <> 0 Then
Print "Mouse not available or not on window"
Else
Print Using "Mouse position: ###:### "; xm; ym;
EndIf
Draw3DQuadrilater(100,80,1,200,80,1,200,180,1,600,100,3)
Fill3D(101,199,81,179,1,3)
ScreenSync
loop
Download: Demo-uri + Surse atasate!
Quote from: DarkByte on 13-12-2008, 11:51
Apropos de proiectari forme 3D intr-un spatiu 2D, incearca sa faci un program care sa simuleze screensaver-ul "Starfield" din Windows. Ai niste puncte ("stele") la distante variabile si se apropie de monitor.
Bafta
O idee buna, o sa ma ocup si de ea
Logged
13-12-2008, 23:33
Twitt
::
Pagini: [
1
]
Print
SkullBox Forum
|
Development
|
Basic si Fox
| Topic:
[FreeBASIC/QBasic]Functii desenare
Powered by SMF 1.1.11
|
SMF © 2006-2009, Simple Machines LLC
Loading...