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.