Ein n-Dimensionaler Würfel

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Steffen

Betreff: Ein n-Dimensionaler Würfel

BeitragSo, Dez 14, 2003 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit diesem Code kann man einen "n-Dimensionalen Würfel" anzeigen lassen. Mit folgenden Tasten lässt er sich manipulieren:
-Mit F1 und F2 wählt man die aktive Achse(grün) aus.
-1 und 2 verlängern/verkürzen die Achse.
-Mit Q,W,A,S,Y,X wird die Achse gedreht.
-Mit E,R,D,F,C,V kann man das ganze Koordinatensystem drehen

Ihr könnt gerne mit dem Code rumspielen oder sonst was damit machen.

Code: [AUSKLAPPEN]
;Auflösung
Const aufl_x%=1024
Const aufl_y%=768
;Anzahl der Dimensionen
Const dimension%=4
;maximale Länge der Achsen beim Start
Const laenge%=200
;Faktor beim verlängern der Achsen
Const faktor#=1.1
;Winkel um den gedreht wird
Const winkel%=1

;Nullpunkt auf dem Bildschirm
Local null_x%=aufl_x%/2
Local null_y%=aufl_y%/2

;Achsen erstellen
Dim achsen#(dimension%-1,2)
SeedRnd MilliSecs()
For i%=0 To (dimension%-1)
   achsen#(i%,0)=Rand(-Sqr(laenge%^2/3),Sqr(laenge%^2/3))
   achsen#(i%,1)=Rand(-Sqr(laenge%^2/3),Sqr(laenge%^2/3))
   achsen#(i%,2)=Rand(-Sqr(laenge%^2/3),Sqr(laenge%^2/3))
Next

;Punkte erstellen:
;Für die Koordinaten ergeben sich alle Kombinationen aus 1en und 0en
;z.B. (0,1,1,0,0) für einen 5D Punkt
Local anzahl_punkte%=2^dimension%
Dim koordinaten%(anzahl_punkte%-1,dimension%-1)
For i%=0 To (anzahl_punkte%-1)
   For j%=0 To (dimension%-1)
      koordinaten%(i%,j%)=((2^j%)And(i%))/(2^j%)
   Next
Next
;verbundene Punkte festlegen:
;Jeder Punkt ist mit den Punkten verbunden,
;die sich nur in einer Koordinate von ihm unterscheiden
Dim verbundene_punkte%(anzahl_punkte%-1,dimension%-1)
For i%=0 To (anzahl_punkte%-1)
   For j%=0 To (dimension%-1)
      verbundene_punkte%(i%,j%)=i% Xor 2^j
   Next
Next
;ein Array für die Koordinaten auf dem Bildschirm
Dim echte_koordinaten%((anzahl_punkte%-1),1)

;Grafik initialisieren
Graphics aufl_x%,aufl_y%
SetBuffer BackBuffer()
SetFont LoadFont("Arial",16,False,False,False)
Local zeit1%=MilliSecs()-1
Local aktive_achse%=0
;Mainloop
Repeat
   ;aktive Achse festlegen
   aktive_achse%=(aktive_achse%+KeyHit(59)-KeyHit(60)+dimension%)Mod dimension%
   ;Achse verlängern
   laeng%=KeyDown(2)-KeyDown(3)
   achsen#(aktive_achse%,0)=achsen#(aktive_achse%,0)*faktor#^laeng%
   achsen#(aktive_achse%,1)=achsen#(aktive_achse%,1)*faktor#^laeng%
   achsen#(aktive_achse%,2)=achsen#(aktive_achse%,2)*faktor#^laeng%
   ;Drehung der aktiven Achse im 3D Raum
   dreh1%=KeyDown(16)-KeyDown(17);um z-Achse
      achsen#(aktive_achse%,0)=achsen#(aktive_achse%,0)*Cos(winkel%*dreh1%)+achsen#(aktive_achse%,1)*Sin(winkel%*dreh1%)
      achsen#(aktive_achse%,1)=-achsen#(aktive_achse%,0)*Sin(winkel%*dreh1%)+achsen#(aktive_achse%,1)*Cos(winkel%*dreh1%)
   dreh2%=KeyDown(30)-KeyDown(31);um y-Achse
      achsen#(aktive_achse%,1)=achsen#(aktive_achse%,1)*Cos(winkel%*dreh2%)+achsen#(aktive_achse%,2)*Sin(winkel%*dreh2%)
      achsen#(aktive_achse%,2)=-achsen#(aktive_achse%,1)*Sin(winkel%*dreh2%)+achsen#(aktive_achse%,2)*Cos(winkel%*dreh2%)
   dreh3%=KeyDown(44)-KeyDown(45);um x-Achse
      achsen#(aktive_achse%,2)=achsen#(aktive_achse%,2)*Cos(winkel%*dreh3%)+achsen#(aktive_achse%,0)*Sin(winkel%*dreh3%)
      achsen#(aktive_achse%,0)=-achsen#(aktive_achse%,2)*Sin(winkel%*dreh3%)+achsen#(aktive_achse%,0)*Cos(winkel%*dreh3%)
   ;Drehung des gesamten Koordinatensystem im 3D Raum
   dreh1%=KeyDown(18)-KeyDown(19);um z-Achse
   dreh2%=KeyDown(32)-KeyDown(33);um y-Achse
   dreh3%=KeyDown(46)-KeyDown(47);um x-Achse
   For i=0 To (dimension%-1)
      achsen#(i%,0)=achsen#(i%,0)*Cos(winkel%*dreh1%)+achsen#(i%,1)*Sin(winkel%*dreh1%)
      achsen#(i%,1)=-achsen#(i%,0)*Sin(winkel%*dreh1%)+achsen#(i%,1)*Cos(winkel%*dreh1%)
      achsen#(i%,1)=achsen#(i%,1)*Cos(winkel%*dreh2%)+achsen#(i%,2)*Sin(winkel%*dreh2%)
      achsen#(i%,2)=-achsen#(i%,1)*Sin(winkel%*dreh2%)+achsen#(i%,2)*Cos(winkel%*dreh2%)
      achsen#(i%,2)=achsen#(i%,2)*Cos(winkel%*dreh3%)+achsen#(i%,0)*Sin(winkel%*dreh3%)
      achsen#(i%,0)=-achsen#(i%,2)*Sin(winkel%*dreh3%)+achsen#(i%,0)*Cos(winkel%*dreh3%)
   Next
   ;Die Punkte auf dem Bildschirm berechnen
   For i%=0 To (anzahl_punkte%-1)
      ;Auf den Nullpunkt setzen
      echte_koordinaten%(i%,0)=null_x%
      echte_koordinaten%(i%,1)=null_y%
      
      For j%=0 To (dimension%-1)
         echte_koordinaten%(i%,0)=echte_koordinaten%(i%,0)+achsen#(j%,0)*koordinaten%(i%,j%)
         echte_koordinaten%(i%,1)=echte_koordinaten%(i%,1)+achsen#(j%,1)*koordinaten%(i%,j%)
      Next
   Next
   ;Linien Anzeigen
   Cls
   Color 255,255,255
   zeit2%=zeit1%
   zeit1%=MilliSecs()
   Text 10,10,(1000/(zeit1%-zeit2%))+" fps"
   For i%=0 To (anzahl_punkte%-1)
      For j%=0 To dimension%-1
         Line echte_koordinaten%(i%,0),echte_koordinaten%(i%,1),echte_koordinaten%((verbundene_punkte%(i%,j%)),0),echte_koordinaten%((verbundene_punkte%(i%,j%)),1)
      Next
   Next
   ;Achsen anzeigen
   ;Die ausgewählte Achse ist grün, die anderen rot
   For i%=0 To dimension%-1
      If (aktive_achse%=i%) Then
         Color 0,255,0
      Else
         Color 255,0,0
      EndIf
      Line null_x%,null_y%,null_x%+achsen#(i%,0),null_y%+achsen#(i%,1)
   Next
   Color 255,0,0
   Flip
Until KeyHit(1)
End
 

morszeck

Gast

BeitragSo, Dez 14, 2003 12:44
Antworten mit Zitat
Sieht cool aus!

mr x

BeitragDi, Dez 23, 2003 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
is ja goil!! Very Happy Very Happy Very Happy Very Happy Very Happy
besser heimlich schlau, als unheimlich blöd
 

Eisrabe

BeitragFr, Jan 30, 2004 3:55
Antworten mit Zitat
Benutzer-Profile anzeigen
mach daraus doch mal ein kleines demo.

lass sich den würfel in einem algorythmus verformen und drehen, während tekkno hämmert Smile wäre bestimmt nett
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group