Superformel

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Steffen

Betreff: Superformel

BeitragMo, Jul 19, 2004 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit den beiden Funktionen lassen sich 2d und 3d Objekte nach der Superformel berechnen:
BlitzBasic: [AUSKLAPPEN]

Function CreateSuper%(m_1#,n1_1#,n2_1#,n3_1#,a_1#,b_1#,m_2#,n1_2#,n2_2#,n3_2#,a_2#,b_2#,detail%=40)
Local r1#,r2#,phi#,theta#,alpha#,i%,j%
Local mesh%=CreateMesh()
Local surface%=CreateSurface(mesh%)
alpha#=360/detail%
phi#=-90
r2#=super#(m_2#,n1_2#,n2_2#,n3_2#,a_2#,b_2#,phi#)
For j%=0 To detail%-1
theta#=j%*alpha#-180
r1#=super#(m_1#,n1_1#,n2_1#,n3_1#,a_1#,b_1#,theta#)
AddVertex(surface%,r1*Cos(theta#)*r2*Cos(phi#),r1*Sin(theta#)*r2*Cos(phi#),r2*Sin(phi#))
Next

For i%=1 To detail%/2
phi#=i%*alpha#-90
r2#=super#(m_2#,n1_2#,n2_2#,n3_2#,a_2#,b_2#,phi#)
For j%=0 To detail%-1
theta#=j%*alpha#-180
r1#=super#(m_1#,n1_1#,n2_1#,n3_1#,a_1#,b_1#,theta#)
AddVertex(surface%,r1*Cos(theta#)*r2*Cos(phi#),r1*Sin(theta#)*r2*Cos(phi#),r2*Sin(phi#))
Next
For j%=0 To detail%-1
AddTriangle(surface%,(i%-1)*detail+j,(i%-1)*detail%+((j+1)Mod detail%),(i%)*detail%+((j+1)Mod detail%))
AddTriangle(surface%,(i%-1)*detail+j,(i%)*detail%+((j+1)Mod detail%),i%*detail+j)
Next
Next
Return mesh%
End Function

Function super#(m#,n1#,n2#,n3#,a#,b#,phi#)
Return((Abs(Cos(m#*phi#/4)/a#))^n2#+(Abs(Sin(m#*phi#/4)/b#))^n3#)^(1/-n1#)
End Function

Mit der Funktion super#(m#,n1#,n2#,n3#,a#,b#,phi#) kann man 2d Formen berechnen. Die Parameter m, n1, n2, n3, a, b sind frei wählbar (a,b<>0). Wie sie die Form beeinflussen, kann man hier nachlesen. Der Rückgabewert der Funktion ist der Radius zum angegebenen Winkel Phi.
Ein Beispiel:
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,16,2

Color 255,255,255
Local r#, phi#
For phi#=0 To 359
r#=super#(3,1,1,1,1,1,phi#)
Plot r#*Cos(phi#)*100+400,-r#*Sin(phi#)*100+300
Next
While Not KeyHit(1):Wend


Die 3d Variante ist eine Überlagerung von zwei 2d Kurven: Die erste ist der Schnitt durch den Äquator, die andere ein Schnitt durch beide Pole.
Die Funktion CreateSuper(m_1#,n1_1#,n2_1#,n3_1#,a_1#,b_1#,m_2#,n1_2#,n2_2#,n3_2#,a_2#,b_2#,detail%=40) liefert ein 3d Objekt zurück. Die Parameter m_1, n1_1, n2_1, n3_1, a_1, b_1 beeinflussen das Objekt in der "Äquatorebene", m_2, n1_2, n2_2, n3_2, a_2, b_2 in einer Ebene durch die Pole. Hier gibt es was darüber zu lesen.
Ein Beispiel:
BlitzBasic: [AUSKLAPPEN]

Graphics3D 800,600,16,2
WireFrame 1

SetBuffer BackBuffer()
camera%=CreateCamera()

superobjekt%=CreateSuper%(0,1,1,1,1,1, 0,1,1,1,1,1)
PositionEntity superobjekt%,0,0,4


While Not KeyHit(1)
;Ich weiß, dass die Steuerung scheiße ist!!!
RotateEntity superobjekt%,MouseX(),MouseY(),0
RenderWorld
Flip
Wend
End

Ihr könnt mit den Werten rumspielen. Aus der 3d Variante kann man bestimmt was machen, einen Bildschirmschoner oder so.
>PC: Pentium III 750MHz, ATI Rage 128 mit 32Mb, Windows Me, Blitz3D 1.87
>Laptop: Pentium M 1,4GHz, 512 Mb DDR, ATI Mobility Radeon 9000 mit 64Mb DDR, Windows XP Home, Blitz3D 1.87

Markus2

BeitragMo, Jul 19, 2004 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
das ist ja mal geil Exclamation 8)

Ich habe mal ein Objekt ausprobiert und es geht !
Dazu fehlten aber noch die Normalen sonnst stimmt das Licht nicht Wink

BlitzBasic: [AUSKLAPPEN]

Graphics3D 800,600,16,2
;WireFrame 1

SetBuffer BackBuffer()
camera%=CreateCamera()

;Licht----------------------
AmbientLight 10,10,10
li=CreateLight()
PositionEntity li,-4,-4,0
LightRange li,10
;---------------------------

superobjekt%=CreateSuper%(8,60,100,30,1,1, 2,10,10,10, 1,1 , 36)
PositionEntity superobjekt%,0,0,4
UpdateNormals superobjekt ;<---

Bigmichi

BeitragDi, Jul 20, 2004 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
So hatte heute früh nicht soviel zu tun und ich fidne es schon echt cool was man mti der Formel alles machen kann ;D und da habich mir gedacht bau ich mir ein Editor dafür Very Happy

Screen:
http://server.future-coding.de/superformel.PNG


Download:
http://server.future-coding.de/superformel.rar

vielleicht könnte mane ien Sammlung an Objekten hier reinstellen mit einem screen davon Very Happy hab ein Bsp gemacht (siehe Screen) die ersten eisntellungen hab ich net verändert.

Steuerung:
Man wählt oben zwischen den ersten udn zweiten eisntellungen Very Happy
hätte es nicht aufeinmal dorthinbekommen deswegen -.-

und kann dan die Schritte wählen wie schnell man die werte ädnern mag Very Happy

udn dan eifnach an den Optionen spielen was die Optionen so recht mit namen weiß ich nicht vielleicht kann mir jemand helfen udn dan füg ich die namen noch an Very Happy

(ganz vergessen) wenn ihr Leertaste drückt köntn irh das Objekt mit der Maus steuern Very Happy
 

Steffen

BeitragDi, Jul 20, 2004 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön, aber die Werte machen viel zu große Sprünge. Schon kleine Änderungen an den Werten machen viel am Aussehen des Objektes.

Was die Parameter machen, steht da: http://astronomy.swin.edu.au/~...upershape/

Danke Markus, das mit dem Licht funktioniert jetzt. Aber wie macht man, dass man es Texturieren kann? Das hat doch irgentwas mit den U,V Koordinaten zu tun?!? Kann mir das mal jemand erklären, dann bau ich das noch ein.
>PC: Pentium III 750MHz, ATI Rage 128 mit 32Mb, Windows Me, Blitz3D 1.87
>Laptop: Pentium M 1,4GHz, 512 Mb DDR, ATI Mobility Radeon 9000 mit 64Mb DDR, Windows XP Home, Blitz3D 1.87

Bigmichi

BeitragDi, Jul 20, 2004 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
wieso zu grroße sprünge brauch man wirklich zahlen kleiner als 0.1 ? naja ok bauch ich das halt ein das man bis 0.01 machen kann aber das müsste doch reichen =) und mti den Erklärungen ich eiß net Very Happy kann mir da jemand der das echt versteht nicht schlagwörter geben ? =)
 

Steffen

BeitragDi, Jul 20, 2004 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit m kann man die Anzahl der Zacken beeinflussen. Nimm mal im 2d Programm die Werte
0,1,1,1,1,1
1,1,1,1,1,1
2,1,1,1,1,1
3,1,1,1,1,1
4,1,1,1,1,1
...
dann siehst du es

Die n1-n3 machen die Zacken spitz, rund, lang kurz. Wenn du n1=n2=n3 machst, dann ist es eher symmetrisch, wenn du ihnen unterschiedliche Werte gibst, dann sieht das Ergebnis eher schief aus.
5,1,1,1,1,1
5,0.5,0.5,0.5,1,1 (Die Zacken sind länger)
5,0.5,0.5,1,1,1 (Die Zacken sind ungleich)
viel weiter bin ich auch noch nicht.
>PC: Pentium III 750MHz, ATI Rage 128 mit 32Mb, Windows Me, Blitz3D 1.87
>Laptop: Pentium M 1,4GHz, 512 Mb DDR, ATI Mobility Radeon 9000 mit 64Mb DDR, Windows XP Home, Blitz3D 1.87

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group