Torus mit zwei Kugeln (dreidimensional angeordnete punkte) von ??? |
rotation mit den cursortasten, maustasten heran- oder herauszoomen. [code:1:4b83013b0a] size=4000 ;anzahl der punkte auf der kugeloberflaeche wd=800 ;vertikale und horizontale aufloesung ht=600 u#=17 ;entfernung des zentrums der kugel vom ursprung(kamera) r0#=10 ;radius=10 einheiten rspeed=2 ;rotationsgeschwindigkeit in grad pro schritt uu#=0 ;beide winkel sind am anfang 0 ii#=0 Const m3d=820 ;multiplikator fuer die umwandlung 3d->2d Dim x#(size) Dim y#(size) Dim z#(size) ;kugel For i=0 To Int(size/3) r#=2;Rnd#(-r0,r0) h#=Rnd#(-r0,r0) ;hoehe und winkel werden zufaellig gewaehlt r#=Sin#(h#)+Sin#(h#*3)+Cos#(h#)+Cos#(h#*4)+10*Sin#(h#/2) a#=Rnd#(0,360) yy#=h# rr#=Sqr(r^2-h#^2) ;berechnung der x und z-koordinate des punktes xx#=Cos#(a)*rr# zz#=Sin#(a)*rr# x#(i)=xx# y#(i)=yy#-5 z#(i)=zz# Next ;torus For i=Int(size/3) To Int(size/3*2) r1#=5;Rnd#(-r0,r0) r2#=2 a#=Rnd#(0,360) ;hoehe und winkel werden zufaellig gewaehlt b#=Rnd#(0,360) xx#=Cos#(a)*r1#+Cos#(a)*Cos#(b)*r2 ;berechnung der x und z-koordinate des punktes zz#=Sin#(a)*r1#+Sin#(a)*Cos#(b)*r2 yy#=Sin#(b)*r2 x#(i)=xx# y#(i)=yy# z#(i)=zz# Next For i=Int(size/3*2) To size r#=2;Rnd#(-r0,r0) h#=Rnd#(-r0,r0) ;hoehe und winkel werden zufaellig gewaehlt r#=Sin#(h#)+Sin#(h#*3)+Cos#(h#)+Cos#(h#*4)+10*Sin#(h#/2) a#=Rnd#(0,360) yy#=h# rr#=Sqr(r^2-h#^2) ;berechnung der x und z-koordinate des punktes xx#=Cos#(a)*rr# zz#=Sin#(a)*rr# x#(i)=xx# y#(i)=yy#+5 z#(i)=zz# Next ;xy3d wandelt einen dreidimensionalen punkt in einen zweidimensionalen ;pixel um Function xy3d(xm#, xz#) If xz#<>0 Then Return Int(m3d * xm# / xz#) End Function Graphics wd,ht,16,1 SetBuffer BackBuffer() Repeat ;rotation: cursor oben/unten - ebene YZ ; cursor links/rechts - ebene XZ If KeyDown(200) Then uu#=uu#+rspeed If KeyDown(208) Then uu#=uu#-rspeed If KeyDown(203) Then ii#=ii#+rspeed If KeyDown(205) Then ii#=ii#-rspeed ;zoom in/out mit linker/rechter maustaste If MouseDown(1) Then u#=u#-0.1 If MouseDown(2) Then u#=u#+0.1 ;wenn eine der variablen 360 grad ueberschreitet, wird sie ;auf 0 zurueckgesetzt, damit sie nicht ueberlaeuft If ii>360 Then ii=0 If uu>360 Then uu=0 For i=0 To size ;sin-cos-transformationen rx# = (Cos#(ii#) * x#(i) + Sin#(ii#) * z#(i)) rz# = (Sin#(ii#) * x#(i) - Cos#(ii#) * z#(i)) ry# = (Cos#(uu#) * y#(i) + Sin#(uu#) * rz#) rz# = (Sin#(uu#) * y#(i) - Cos#(uu#) * rz#) p#=rz#+u# If (p#*5)>255 Then p#=255/5 Color 255-(p#)*5,255-(p#)*5,255-(p#)*5 ;aenderung der intensitaet ;eines pixels abhaengig von ;seiner z-koordinate nx=xy3d(rx#,rz#+u#) ny=xy3d(ry#,rz#+u#) px=nx+wd/2 py=ny+ht/2 cond=(px>=1) And (px<=wd-1) And (py>=1) And (py<=ht-1) ;If cond Then Plot px,py ; End If ;ein punkt wird nur dann ;gezeichnet,wenn seine z-koordinate ;>0 ist Next ;For zby=0 To ht ; For zbx=0 To wd ; ; zbuf#(zbx,zby)=1000 ; Next ; Next Flip Cls Until KeyHit(1) ; [/code:1:4b83013b0a] |
von ??? |
Hey, das sieht mal extrem phat aus! |
von ??? |
cool... |
von ??? |
Hi, ist sehr schön ! Leider nicht optimiert ! Bei 20000 Pixel geht das ganze ganz schön in die Knie ! Toni |
von ??? |
Hi, Wer das noch nicht hat, sollte es sich downloaden ! Source-code ist dabei ! Die Bilder können durch eigene ersetzt werden. Voraussetzung: sie sollen nicht größer als 320*40 Pixel sein. Und den gleichen Namen haben. http://members.chello.at/hot-bit/diverses/intro45.zip Toni |
von ??? |
Hi, hab ich mir zuerst auch überlegt. Habe es aber soo gemacht- und die Anleitung dazu, wie man eigene Bilder verwenden kann. Sonst hätte ich Links zu den Bildern geben müssen. Ich glaube, so ist es am besten. Toni |
von ??? |
sidn doch gut aus! |
von ??? |
ok, hab das ganze mal ein bissle optimiert... frage: wieso hast du das mit plot gemacht??? das is so grottenlahm :kotz:, aber nun gut. jetzt läufts bei mir mit 10fps in der einstellung :D [code:1:1471ce7ca0] size=100000 ;anzahl der punkte auf der kugeloberflaeche Const wd=1280 ;vertikale und horizontale aufloesung Const ht=1024 u#=17 ;entfernung des zentrums der kugel vom ursprung(kamera) r0#=10 ;radius=10 einheiten Const rspeed=3 ;rotationsgeschwindigkeit in grad pro schritt uu#=0 ;beide winkel sind am anfang 0 ii#=0 Const m3d=820 ;multiplikator fuer die umwandlung 3d->2d Dim x#(size) Dim y#(size) Dim z#(size) ;kugel For i=0 To Int(size/3) r#=2;Rnd#(-r0,r0) h#=Rnd#(-r0,r0) ;hoehe und winkel werden zufaellig gewaehlt r#=Sin#(h#)+Sin#(h#*3)+Cos#(h#)+Cos#(h#*4)+10*Sin#(h#/2) a#=Rnd#(0,360) yy#=h# rr#=Sqr(r^2-h#^2) ;berechnung der x und z-koordinate des punktes xx#=Cos#(a)*rr# zz#=Sin#(a)*rr# x#(i)=xx# y#(i)=yy#-5 z#(i)=zz# Next ;torus For i=Int(size/3)To Int(size/3*2) r1#=5;Rnd#(-r0,r0) r2#=2 a#=Rnd#(0,360) ;hoehe und winkel werden zufaellig gewaehlt b#=Rnd#(0,360) xx#=Cos#(a)*r1#+Cos#(a)*Cos#(b)*r2 ;berechnung der x und z-koordinate des punktes zz#=Sin#(a)*r1#+Sin#(a)*Cos#(b)*r2 yy#=Sin#(b)*r2 x#(i)=xx# y#(i)=yy# z#(i)=zz# Next For i=Int(size/3*2) To size r#=2;Rnd#(-r0,r0) h#=Rnd#(-r0,r0) ;hoehe und winkel werden zufaellig gewaehlt r#=Sin#(h#)+Sin#(h#*3)+Cos#(h#)+Cos#(h#*4)+10*Sin#(h#/2) a#=Rnd#(0,360) yy#=h# rr#=Sqr(r^2-h#^2);berechnung der x und z-koordinate des punktes xx#=Cos#(a)*rr# zz#=Sin#(a)*rr# x#(i)=xx# y#(i)=yy#+5 z#(i)=zz# Next ;xy3d wandelt einen dreidimensionalen punkt in einen zweidimensionalen ;pixel um Function xy3d(xm#, xz#) If xz#<>0 Then Return Int(m3d * xm# / xz#) End Function Graphics wd,ht,0,1 SetBuffer BackBuffer() Repeat ;Text 0,0,u Text 0,0,"Pixelanzahl: "+size Text 0,20,"Auflösung: "+wd+"x"+ht Text 0,40,"FPS: " + Str(fpscounter) ;fps berechnung fpscounter2 = fpscounter2 + 1 If fpstimer + 1000 < MilliSecs() Then fpscounter = fpscounter2 fpscounter2 = 0 fpstimer = MilliSecs() End If LockBuffer BackBuffer() ;rotation: cursor oben/unten - ebene YZ ; cursor links/rechts - ebene XZ ;If KeyDown(200) Then uu#=uu#+rspeed ;If KeyDown(208) Then uu#=uu#-rspeed ;If KeyDown(203) Then ii#=ii#+rspeed ;If KeyDown(205) Then ii#=ii#-rspeed ;zoom in/out mit linker/rechter maustaste ;If MouseDown(1) Then u#=u#-0.1 ;If MouseDown(2) Then u#=u#+0.1 ;autodolly uu#=uu#+rspeed ii#=ii#+rspeed If u#>35 Or u#<5 Then dir=1-dir Select dir Case 0 u#=(u#+0.5) Case 1 u#=(u#-0.5) End Select ;wenn eine der variablen 360 grad ueberschreitet, wird sie ;auf 0 zurueckgesetzt, damit sie nicht ueberlaeuft ii=ii+1 Mod 360 For i=0 To size ;sin-cos-transformationen rx# = (Cos#(ii#) * x#(i) + Sin#(ii#) * z#(i)) rz# = (Sin#(ii#) * x#(i) - Cos#(ii#) * z#(i)) ry# = (Cos#(uu#) * y#(i) + Sin#(uu#) * rz#) rz# = (Sin#(uu#) * y#(i) - Cos#(uu#) * rz#) p#=rz#+u If (p#*5)>255 Then p#=255/5 ;Color 255-(p#)*5,255-(p#)*5,255-(p#)*5 ;aenderung der intensitaet ;eines pixels abhaengig von ;seiner z-koordinate nx=xy3d(rx#,rz#+u) ny=xy3d(ry#,rz#+u) px=nx+wd/2 py=ny+ht/2 cond=(px>=1) And (px<=wd-1) And (py>=1) And (py<=ht-1) If cond Then farbe=255-(p#*5) rgb=farbe*$10000 + farbe*$100 + farbe WritePixelFast px,py,rgb ;Plot px,py End If ;ein punkt wird nur dann ;gezeichnet,wenn seine z-koordinate ;>0 ist Next ;For zby=0 To ht ; For zbx=0 To wd ; ; zbuf#(zbx,zby)=1000 ; Next ; Next UnlockBuffer BackBuffer() Flip Cls Until KeyHit(1) ; [/code:1:1471ce7ca0] edit:arghhh! wieso funzen die code tags net?! :evil: editedit:geht doch! :P :?: 8) |
speed von ??? |
das läuft noch einen kleinen tick schneller. aber ich hab keine ahnung wie man es weiter optimieren könnte. [code:1:cdfe9f6e45] size=10000 ;anzahl der punkte auf der kugeloberflaeche Const wd=800 ;vertikale und horizontale aufloesung Const ht=600 u#=17 ;entfernung des zentrums der kugel vom ursprung(kamera) r0#=10 ;radius=10 einheiten Const rspeed=3 ;rotationsgeschwindigkeit in grad pro schritt uu#=0 ;beide winkel sind am anfang 0 ii#=0 Const m3d=500 ;multiplikator fuer die umwandlung 3d->2d Dim x#(size) Dim y#(size) Dim z#(size) ;kugel For i=0 To Int(size/3) r#=2;Rnd#(-r0,r0) h#=Rnd#(-r0,r0) ;hoehe und winkel werden zufaellig gewaehlt r#=Sin#(h#)+Sin#(h#*3)+Cos#(h#)+Cos#(h#*4)+10*Sin#(h#/2) a#=Rnd#(0,360) yy#=h# rr#=Sqr(r^2-h#^2) ;berechnung der x und z-koordinate des punktes xx#=Cos#(a)*rr# zz#=Sin#(a)*rr# x#(i)=xx# y#(i)=yy#-5 z#(i)=zz# Next ;torus For i=Int(size/3)To Int(size/3*2) r1#=5;Rnd#(-r0,r0) r2#=2 a#=Rnd#(0,360) ;hoehe und winkel werden zufaellig gewaehlt b#=Rnd#(0,360) xx#=Cos#(a)*r1#+Cos#(a)*Cos#(b)*r2 ;berechnung der x und z-koordinate des punktes zz#=Sin#(a)*r1#+Sin#(a)*Cos#(b)*r2 yy#=Sin#(b)*r2 x#(i)=xx# y#(i)=yy# z#(i)=zz# Next For i=Int(size/3*2) To size r#=2;Rnd#(-r0,r0) h#=Rnd#(-r0,r0) ;hoehe und winkel werden zufaellig gewaehlt r#=Sin#(h#)+Sin#(h#*3)+Cos#(h#)+Cos#(h#*4)+10*Sin#(h#/2) a#=Rnd#(0,360) yy#=h# rr#=Sqr(r^2-h#^2);berechnung der x und z-koordinate des punktes xx#=Cos#(a)*rr# zz#=Sin#(a)*rr# x#(i)=xx# y#(i)=yy#+5 z#(i)=zz# Next ;xy3d wandelt einen dreidimensionalen punkt in einen zweidimensionalen ;pixel um Function xy3d(xm#, xz#) If xz#<>0 Then Return Int(m3d * xm# / xz#) End Function Graphics wd,ht,16,1 SetBuffer BackBuffer() d=1 Mod 360 Repeat ;Text 0,0,u Text 0,0,"Pixelanzahl: "+size Text 0,20,"Auflösung: "+wd+"x"+ht Text 0,40,"FPS: " + Str(fpscounter) ;fps berechnung fpscounter2 = fpscounter2 + 1 If fpstimer + 1000 < MilliSecs() Then fpscounter = fpscounter2 fpscounter2 = 0 fpstimer = MilliSecs() End If LockBuffer BackBuffer() ;rotation: cursor oben/unten - ebene YZ ; cursor links/rechts - ebene XZ ;If KeyDown(200) Then uu#=uu#+rspeed ;If KeyDown(208) Then uu#=uu#-rspeed ;If KeyDown(203) Then ii#=ii#+rspeed ;If KeyDown(205) Then ii#=ii#-rspeed ;zoom in/out mit linker/rechter maustaste ;If MouseDown(1) Then u#=u#-0.1 ;If MouseDown(2) Then u#=u#+0.1 ;autodolly uu#=uu#+rspeed ii#=ii#+rspeed If u#>35 Or u#<5 Then dir=1-dir Select dir Case 0 u#=(u#+0.5) Case 1 u#=(u#-0.5) End Select ;wenn eine der variablen 360 grad ueberschreitet, wird sie ;auf 0 zurueckgesetzt, damit sie nicht ueberlaeuft ii=ii+d cosii#=Cos#(ii) sinii#=Sin#(ii) cosuu#=Cos#(uu#) sinuu#=Sin#(uu#) For i=0 To size ;sin-cos-transformationen rx# = (cosii# * x#(i) + sinii# * z#(i)) rz# = (sinii# * x#(i) - cosii# * z#(i)) ry# = (cosuu# * y#(i) + sinuu# * rz#) rz# = (sinuu# * y#(i) - cosuu# * rz#) p#=rz#+u If (p#*5)>255 Then p#=51 ;Color 255-(p#)*5,255-(p#)*5,255-(p#)*5 ;aenderung der intensitaet ;eines pixels abhaengig von ;seiner z-koordinate nx=xy3d(rx#,rz#+u) ny=xy3d(ry#,rz#+u) px=nx+wd/2 py=ny+ht/2 cond=(px>=1) And (px<=wd-1) And (py>=1) And (py<=ht-1) If cond Then farbe=255-(p#*5) rgb=farbe*$10000 + farbe*$100 + farbe WritePixelFast px,py,rgb ;Plot px,py End If Next UnlockBuffer BackBuffer() Flip Cls Until KeyHit(1) [/code:1:cdfe9f6e45] ich habe plot benutzt, weil das am einfachsten zu handhaben ist und weil es mir hauptsächlich um die darstellung und weniger um die geschwindigkeit ging... |