Hi again, ...
Dostej hat geschrieben:Die Funktion mit den Mullroom-splines ist von daher besser (man kann einfacher die Höhe, die Anzahl der Gipfel und die Täler festlegen. soweit sehr praktisch. Nur das sie Kurve immer wieder geschlossen wird, das irritiert mich. Nebenbei muss ich sagen, kapier ich die Funktion nicht wirklich, das ich das ändern könnte.
Hab Dir die Routine nochmal ein wenig angepasst:
- Kurve wird nun nicht mehr geschlossen.
- Falls Du Dich mal verklickt hast oder Du mit dem Ergebnis mal nicht zufrieden bist, kannst Du nun immer den letzten Punkt mit "Backspace" löschen.
- Im Debug-Fenster werden Dir nun immer die aktuellen Werte Deiner Spline ausgegeben.
Wenn Du also nun eine Spline erstellt hast, die Dir gefällt, so brauchst Du Dir nun nur die Werte zu notieren und mit diesen dann später in Deinem eigenen Programm das p()-Array zu füllen um die gleiche Spline dann in Deinem Programm erzeugen zu können.
Um die Spline in Deinem eigenen Programm zu erstellen, benötigst Du von dem geposteten Code eigentlich nur die Struktur, die Prozeduren (also alles bis Zeile 51) sowie die Zeilen zwischen ;>>> und ;<<< (Zeile 122-139).
Zuvor wie gesagt noch das p()-Array erstellen (siehe Zeile 107) und mit den notierten Werten füllen (siehe oben).
Dann noch (bevor Du den Code aus Zeile 122-139 ausführt) in die Variable C die Anzahl der Punkte eintragen - das sollte schon alles sein (ohne Gewähr - da ungetestet).
Anbei mal der erweiterte Code auf den dann o.g. Änderungen sowie die genannten Zeilennummern zutreffen:
Code: Alles auswählen
#SUBDIVS=40
Structure Point2D
x.w
y.w
EndStructure
;---------Interpolating Splines-----------
Procedure AbsLNG(a.l)
If a >> 31
a * -1
EndIf
ProcedureReturn a
EndProcedure
Procedure Mod(a, b)
Erg.l = a - a / b * b
If a >> 31 : Erg + AbsLNG(b) : EndIf
ProcedureReturn Erg
EndProcedure
Procedure.w InterpolateSpline (tTime.f,tpx1.f,tpy1.f,tpx2.f,tpy2.f,tpx3.f,tpy3.f,tpx4.f,tpy4.f)
Shared Final.Point2D
tTime2.f = tTime * tTime
tTime3.f = tTime2 * tTime
;--------------------------------------------------
tpOneX= (-tpx1 + 3 * tpx2 - 3 * tpx3 + tpx4) * tTime3
tpOneY= (-tpy1 + 3 * tpy2 - 3 * tpy3 + tpy4) * tTime3
;--------------------------------------------------
tpTwoX= (2 * tpx1 - 5 * tpx2 + 4 * tpx3 - tpx4) * tTime2
tpTwoY= (2 * tpy1 - 5 * tpy2 + 4 * tpy3 - tpy4) * tTime2
;--------------------------------------------------
tpThreeX=(-tpx1 + tpx3) * tTime
tpThreeY=(-tpy1 + tpy3) * tTime
;--------------------------------------------------
tpFourX= (2 * tpx2)
tpFourY= (2 * tpy2)
;==================================================
Final\x=(tpOneX+tpTwoX+tpThreeX+tpFourX)/2
Final\y=(tpOneY+tpTwoY+tpThreeY+tpFourY)/2
;--------------------------------------------------
EndProcedure
InitSprite()
InitKeyboard()
InitMouse()
ExamineDesktops()
LastDebug = 2
OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),"Spline", #PB_Window_BorderLess)
If OpenWindowedScreen(WindowID(0),0,0,DesktopWidth(0),DesktopHeight(0),0,0,0)
NewList PointList.Point2D()
CreateSprite(0,10,10)
StartDrawing(SpriteOutput(0))
Circle(5,5,5,RGB(255,155,155))
StopDrawing()
Repeat
ExamineKeyboard()
If ExamineMouse()
xm=MouseX()
ym=MouseY()
If MouseButton(1)<>0
AddElement(PointList())
PointList()\x=xm
PointList()\y=ym
EndIf
EndIf
Repeat
ExamineMouse()
Until MouseButton(1)=0
FlipBuffers()
ClearScreen(RGB(0,0,0))
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(RGB(255,255,255))
StopDrawing()
c=ListSize(PointList())
FirstElement(PointList())
For n=1 To c
StartDrawing(ScreenOutput())
Circle(PointList()\x,PointList()\y,5,RGB(255,0,0))
StopDrawing()
NextElement(PointList())
Next
DisplaySprite(0,xm-5,ym-5)
Delay(1)
If C>1
FirstElement(PointList())
Dim p.Point2D(100)
If c > LastDebug : Debug "" : Debug "Werte im p()-Array:" : EndIf
For n=1 To C
p(n)\x=PointList()\x
p(n)\y=PointList()\y
If c > LastDebug
Debug "p("+Str(n)+")\x = "+Str(p(n)\x)+" , p("+Str(n)+")\y = "+Str(p(n)\y)
EndIf
NextElement(PointList())
Next
LastDebug = c
xold = -1000
yold = -1000
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
If StartDrawing(ScreenOutput())
For n=1 To C-1
t0 = mod((n - 2 + C) , C + 1)
t1 = n
t2 = Mod(n, C) + 1
t3 = mod((n + 1),C) + 1
For m=1 To #SUBDIVS
Time.f=(m-1.0)/#SUBDIVS
InterpolateSpline(Time,p(t0)\x,p(t0)\y,p(t1)\x,p(t1)\y,p(t2)\x,p(t2)\y,p(t3)\x,p(t3)\y)
If xold <> -1000 Or yold <> -1000
LineXY(xold, yold, Final\x, Final\y, RGB(255,255,255))
EndIf
xold = Final\x
yold = Final\y
Next
Next
StopDrawing()
EndIf
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ExamineKeyboard()
EndIf
If KeyboardPushed(#PB_Key_Back)
If c > 0
LastElement(PointList())
DeleteElement(PointList())
LastDebug = -1
Delay(200)
EndIf
EndIf
Until KeyboardPushed(#PB_Key_Escape)
EndIf
Hoffe Du kannst damit was anfangen und kommst damit nun ein wenig weiter.
Gruß und viel Erfolg, PL.