Berzier-Kurven in 2D von walski /
Da ich kaum Infos zu Bezier-Kurven in ner 2D Darstellung gefunden hab und Wunderkind mich drauf ansprach habe ich nach vielem rumfragen und fummeln mal das hier gebastelt:

[code:1:5b1e1e21c5]
;eine kleine Bezier-Kurven 2D Demo
;(c) 2003 by walski

;Type der Kontroll Punkte
;X und Y sollten klar sein :)
;OX und OY sind die Originalen X- und Y-Werte, da X# und Y# später verändert werden
;und ich die eben backuppen muss. Kann man natürlich auch anders lösen...
;aber das is ne andre Geschichte!
Type KontrollPunkt
Field X#,Y#
Field OX#,OY#
End Type


;Hier speiße ich jetzt mal ein paar Punkte ein. Wichtig bei diesem System ist nur:
;Der erste Punkt der Liste ist der StartPunkt.
;Der letzte Punkt der Liste ist der EndPunkt.
;Alle andren Punkte dazwischen sind die sogenannten Kontrollpunkte zwischen denen die Linie
;verläuft
KP.KontrollPunkt = New KontrollPunkt
KPX# = 100
KPY# = 100
KPOX# = 100
KPOY# = 100
KP.KontrollPunkt = New KontrollPunkt
KPX# = 500
KPY# = 100
KPOX# = 500
KPOY# = 100
KP.KontrollPunkt = New KontrollPunkt
KPX# = 300
KPY# = 200
KPOX# = 300
KPOY# = 200
KP.KontrollPunkt = New KontrollPunkt
KPX# = 500
KPY# = 400
KPOX# = 500
KPOY# = 400

;So, damit man auch was sieht:
Graphics 800,600,32,1
;Der Paramter gibt die Auflösung an! Also wieviel Punkte gezeichnet werden von der Linie
DrawBezier(1000)
WaitKey()

Function DrawBezier(res#)
;Ein BlitzArray das eben am Anfang die Types einmal aufnimmt.
;Das macht die Organisation einfacher, da später das jewils nachfolgende Objekt gefragt ist
;und ich das mit Before usw nicht so schön finde. Deshalb hier das TemporäreArray
Local XTemp[10000],YTemp[10000]
;n gibt die Gesammtzahl aller Punkte an.
n = 0
For KP.KontrollPunkt = Each KontrollPunkt
n=n+1
XTemp[n] = KPOX#
YTemp[n] = KPOY#
;Hier markiere ich mal die Punkte mitm Kreis
Oval XTemp[n]-2,YTemp[n]-2,5,5,0
Next
;O.k. glaubt mir einfach das man n-1 nehmen muss :)
n=n-1
;Hier beginnt der eigentliche Algo des netten Herren "de Casteljau"
;Bitte fragt mich nicht wie er funktioniert *g
;Ich lege euch http://www.apm.tuwien.ac.at/docs/lva/mmgdv/k1___013.htm dafür ans Herz!
For t = 1 To res - 1
For m = 1 To n
For i = 1 To n - m + 1
XTemp[i] = t / res * XTemp[i + 1] + (1 - t / res) * XTemp[i]
YTemp[i] = t / res * YTemp[i + 1] + (1 - t / res) * YTemp[i]
Next
Next
;Hier wird dann eben der Punkt gemalt.
Plot XTemp[1],YTemp[1]

;Jetzt wird noch das oben angesprochene Backup zurückgeholt.
n = 0
For KP.KontrollPunkt = Each Kontrollpunkt
n=n+1
XTemp[n] = KPOX#
YTemp[n] = KPOY#
Next
n=n-1
;Und tada, Funktion durch!
Next
End Function
[/code:1:5b1e1e21c5]

Ich hoffe ich konnte wem helfen.

walski
===
von ???
hmm tja...

http://www.blitzbase.de/quellcode/bezierspline.bb

aber toll das du auch eine implementierung gemacht hast ^^
===
von ???
Das Beispiel bezieht nur 2 Kontrollpunkte ein, oder?
Meins kann unendlich viele aufnehmen!

walski
===
Bezier 4 Punkt und über alle Punkte in 3D/2D von ???
Hab auch noch was dazu aber in 3D .
4 Punkt oder über alle wie man es braucht .
Ist auch direkt mit Beispiel ohne das Z benutzt wird .

[code:1:adaf25ab49]

;Bezier Interpolation BlitzBasic 3D Example from Markus Rauch

;MR 14.04.2003

;--------------------------------------------------------

Graphics3D 800,600,16,0
SetBuffer BackBuffer()

AppTitle " Bezier Interpolation BlitzBasic 3D Example from Markus Rauch"

;--------------------------------------------------------

Global camp=CreatePivot()
Global cam=CreateCamera(camp)
CameraZoom cam,1
CameraRange cam,1,10000

;PositionEntity camp,-200,0,-200
;TurnEntity camp,0,-45,0

PositionEntity camp,0,0,-200
TurnEntity camp,0,0,0

;--------------------------------------------------------

Type Vector3D
Field x#,y#,z#
Field nx#
Field ny#
Field nz#
End Type

Dim ve.Vector3D(100)

ve.Vector3D(0)=New Vector3D
ve.Vector3D(1)=New Vector3D
ve.Vector3D(2)=New Vector3D
ve.Vector3D(3)=New Vector3D

Global VectorMax=4

Global p.Vector3D=New Vector3D

ve(0)x=-100
ve(0)y=-25
ve(0)z=0
VectorNormal ve(0),45,0,0

ve(1)x=-50
ve(1)y=25
ve(1)z=0
VectorNormal ve(1),45,0,0

ve(2)x=50
ve(2)y=-25
ve(2)z=0
VectorNormal ve(2),-45,0,0

ve(3)x=100
ve(3)y=25
ve(3)z=0
VectorNormal ve(3),-45,0,0

While Not KeyHit(1)

RenderWorld

;-------------------- Moving Point (3)

;Local w#

;ve(3)x=50+Sin(w)*100
;ve(3)y= 0+Cos(w)*100

;w#=w#+1 :If w>360.0 Then w=w-360.0

;--------------------

Color 255,255,0

Local mu#
Local st#=0.01

mu=0.0
Repeat

Bezier4 p,ve(0),ve(1),ve(2),ve(3),mu ;Only 4 Points

;Bezier p,mu ;All Points

Plot3D p

mu=mu+st
If mu>1.0 Then Exit
Forever

;Show all Points
For v=0 To VectorMax-1
Color 128,128,128
Text3D ve(v),"V "+V
Color 255,0,0
Plot3D ve(v)
Next

Flip
Wend
End

;##########################################################################

Function Bezier3(p.Vector3D,p1.Vector3D,p2.Vector3D,p3.Vector3D,mu#)

;MR 13.04.2003

;Three control point Bezier interpolation
;mu ranges from 0 To 1, start To End of curve

Local mum1#,mum12#,mu2#

mu2 = mu * mu
mum1 = 1 - mu
mum12 = mum1 * mum1

px = p1x * mum12 + 2 * p2x * mum1 * mu + p3x * mu2
py = p1y * mum12 + 2 * p2y * mum1 * mu + p3y * mu2
pz = p1z * mum12 + 2 * p2z * mum1 * mu + p3z * mu2

End Function

Function Bezier4(p.Vector3D,p1.Vector3D,p2.Vector3D,p3.Vector3D,p4.Vector3D,mu#)

;MR 13.04.2003

;Four control point Bezier interpolation
;mu ranges from 0 To 1, start To End of curve

Local mum1#,mum13#,mu3#

mum1 = 1.0 - mu
mum13 = mum1 * mum1 * mum1
mu3 = mu * mu * mu

px = mum13*p1x + 3.0*mu*mum1*mum1*p2x + 3.0*mu*mu*mum1*p3x + mu3*p4x
py = mum13*p1y + 3.0*mu*mum1*mum1*p2y + 3.0*mu*mu*mum1*p3y + mu3*p4y
pz = mum13*p1z + 3.0*mu*mum1*mum1*p2z + 3.0*mu*mu*mum1*p3z + mu3*p4z

p
x = mum13*p1
x + 3.0*mu*mum1*mum1*p2
x + 3.0*mu*mu*mum1*p3
x + mu3*p4
x
p
y = mum13*p1
y + 3.0*mu*mum1*mum1*p2
y + 3.0*mu*mu*mum1*p3
y + mu3*p4
y
p
z = mum13*p1
z + 3.0*mu*mum1*mum1*p2
z + 3.0*mu*mu*mum1*p3
z + mu3*p4
z

End Function

;##########################################################################

Function Bezier(p.Vector3D,mu#)

;MR 14.04.2003

;General Bezier curve
;Number of control points is n+1
;mu 0 bis 1 IMPORTANT, the Last point is Not computed

Local k,kn,nn,nkn
Local blend#,muk#,munk#

Local px#,py#,pz#

Local n=VectorMax-1

px=0.0
py=0.0
pz=0.0

muk = 1.0
munk = pow(1.0-mu,Float(n))

For k=0 To n
nn = n
kn = k
nkn = n - k
blend = muk * munk
muk =muk * mu
munk = munk / (1.0-mu)
While nn => 1
blend=blend * nn
nn=nn-1
If kn > 1 Then
blend=blend / Float(kn)
kn=kn-1
EndIf
If nkn > 1 Then
blend=blend / Float(nkn)
nkn=nkn-1
EndIf
Wend
px=px+ve(k)x * blend
py=py+ve(k)y * blend
pz=pz+ve(k)z * blend
Next

End Function

;##########################################################################

Function pow#(a#,b#)

;MR 14.04.2003

;C Like :-)

Return a^b

End Function

;##########################################################################

Function Plot3D(p.Vector3D)

;MR 16.04.2003

;cam ist Global und das Handle der Camera

Local x1,y1
Local x2,y2

Local l#=20.0

CameraProject cam,px,py,pz
x1=ProjectedX()
y1=ProjectedY()

CameraProject cam,px+p
x*l,py+p
y*l,pz+p
z*l
x2=ProjectedX()
y2=ProjectedY()

Line x1,y1,x2,y2
Color 0,255,0
Plot x1,y1

End Function

;##########################################################################

Function Text3D(p.Vector3D,t$)

;MR 14.04.2003

;cam ist Global und das Handle der Camera

Local x,y

CameraProject cam,px,py,pz
x=ProjectedX()
y=ProjectedY()

Text x,y,t$,True,True

End Function

;##########################################################################

Function CubicInterpolate#(y0#,y1#,y2#,y3#,mu#)

;MR 13.04.2003

Local a0#,a1#,a2#,a3#,mu2#

mu2 = mu*mu
a0 = y3 - y2 - y0 + y1
a1 = y0 - y1 - a0
a2 = y2 - y0
a3 = y1

Return (a0*mu*mu2+a1*mu2+a2*mu+a3)

End Function

;##########################################################################

Function VectorNormal(n.Vector3D,pitch,yaw,roll)

;MR 16.04.2003

Local piv=CreatePivot()

RotateEntity piv,pitch,yaw,roll
MoveEntity piv,0,1.0,0

n
x=EntityX(piv)
n
y=EntityY(piv)
n
z=EntityZ(piv)

FreeEntity piv

End Function

;##########################################################################
[/code:1:adaf25ab49]
===
von ???
Irre ich ich oder hattest du den Code schonmal gepostet?
Ich bin sicher er funzt super, aber ist eben doch sehr komplex!
Um einen leichteren Einstieg zu finden habe ich eben versucht es so schmal wie möglich zu halten.

walski
===
von ???
Weiß ich auch nicht mehr .
Komplex ist der nicht wenn man das Beispiel zum anzeigen wegläßt .
Und man kann ihn ja auch für 2d benutzen wenn man Z wegläßt .

Hatte nur gesehen das man bei deiner Funk. nicht von 0-1
angeben kann .
Naja , egal ,
wenn du mein Source in einem anderen Thread wieder findest sag bescheid
dann lösche ich ihn hier wieder ...
===
von ???
Dieses Mu könnt man bei mir auch einabauen. Muss man halt an der res n bissel was ändern oder so.

Naja, was solls :)

walski



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: