Vector Drawing

Anfängerfragen zum Programmieren mit PureBasic.
tdiehl
Beiträge: 3
Registriert: 22.03.2017 19:54

Vector Drawing

Beitrag von tdiehl »

Hallo, ich bin gerade dabei ein GW Basic Programm nach PureBasic zu portieren. Ich habe ein Problem mit Vector Drawing, bei dem ich nicht weiter komme. Ich habe zwei Integer Arrays (BBRecordx /y) , welche die X und die Y Koordinaten eines Objektes im 2D Koordinatensystem repräsentieren. Ich würde jetzt gerne das gezeichnete Objekt (hier das rote Quadrat) skalieren und dann beim verkleinerten Objekt (blau) die veränderten Koordinaten auslesen.
Aber leider sind alle Versuche bisher erfolglos. Die Ergebnisx.d = PathBoundsX() Zeile liefert bei beiden Durchläufen das gleiche Ergebnis.

Hat jemand eine Idee wie ich das bewerkstelligen könnte.
danke Thomas




Code: Alles auswählen

Global Dim BBRecordx.i      (100)
Global Dim BBrecordy.i      (100)

If OpenWindow(0, 0, 0, 400, 300, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 0, 0, 400, 300)
    
    BBRecordX(1) = 100 : BBRecordY(1) = 100
    BBRecordX(2) = 200 : BBRecordY(2) = 100
    BBRecordX(3) = 200 : BBRecordY(3) = 200
    BBRecordX(4) = 100 : BBRecordY(4) = 200
    BBRecordX(5) = 100 : BBRecordY(5) = 100
    
; erstes Rechteck in rot    
    
    If StartVectorDrawing(CanvasVectorOutput(0))
     For i = 2 To 5
      MovePathCursor(BBRecordx(i-1),BBrecordy(i-1))
      AddPathLine   (BBRecordx(i)  ,BBrecordy(i))
      Ergebnisx.d = PathBoundsX()
      Ergebnisy.d = PathBoundsY()
     Next i
      
     VectorSourceColor(RGBA(255, 0, 0, 255))
     StrokePath(1)
     
; skalieren     
     
     ScaleCoordinates(0.7, 0.7)
     
; zweites Rechteck in blau     
     
     For i = 2 To 5
      MovePathCursor(BBRecordx(i-1),BBrecordy(i-1))
      AddPathLine   (BBRecordx(i)  ,BBrecordy(i))
      Ergebnisx.d = PathBoundsX()
      Ergebnisy.d = PathBoundsY()
     Next i
      
     VectorSourceColor(RGBA(0, 0,255, 255))
     StrokePath(1)
     
     StopVectorDrawing()
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
__________________________________________________
Code-Tags hinzugefügt
04.04.2018
RSBasic
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Vector Drawing

Beitrag von ccode_new »

Hallo tdiehl!

Code: Alles auswählen

Global Dim BBRecordx.i      (100)
Global Dim BBrecordy.i      (100)

Global ScaleFactorX.d = 0.7, ScaleFactorY.d = 0.7

If OpenWindow(0, 0, 0, 400, 300, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 0, 0, 400, 300)
   
    BBRecordX(1) = 100 : BBRecordY(1) = 100
    BBRecordX(2) = 200 : BBRecordY(2) = 100
    BBRecordX(3) = 200 : BBRecordY(3) = 200
    BBRecordX(4) = 100 : BBRecordY(4) = 200
    BBRecordX(5) = 100 : BBRecordY(5) = 100
   
    ; erstes Rechteck in rot
    
   
    If StartVectorDrawing(CanvasVectorOutput(0))
      
     For i = 2 To 5
      MovePathCursor(BBRecordx(i-1),BBrecordy(i-1))
      AddPathLine   (BBRecordx(i),BBrecordy(i))
      Ergebnisx.d = PathBoundsX()
      Ergebnisy.d = PathBoundsY()
      Debug Ergebnisx
     Next i
     
     VectorSourceColor(RGBA(255, 0, 0, 255))
     StrokePath(1)
     
; skalieren     
     
     ScaleCoordinates(ScaleFactorX, ScaleFactorY) ;Skalierung des gesamten Koordinatensystems
     
; zweites Rechteck in blau     
     
     For i = 2 To 5
      MovePathCursor(BBRecordx(i-1)*ScaleFactorX, BBrecordy(i-1)*ScaleFactorY)
      AddPathLine   (BBRecordx(i)*ScaleFactorX, BBrecordy(i)*ScaleFactorY)
      Ergebnisx.d = PathBoundsX()
      Ergebnisy.d = PathBoundsY()
      Debug Ergebnisx
     Next i
     
     VectorSourceColor(RGBA(0, 0,255, 255))
     StrokePath(1)
     
     StopVectorDrawing()
    EndIf
   
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
Besser ? Oder falsche Lösung ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Vector Drawing

Beitrag von Omi »

Hallo Thomas,

es ist zwar in der Hilfe nicht ersichtlich, aber die PathBoundsX/Y/Width/Height beziehen sich (scheinbar) auf unskalierte Pfade. Der Grund dürfte sein, dass mit diesen Werten einfach begrenzende Orthogonale / Rahmen gezeichnet werden können, die automatisch passend mitskaliert werden.
Werden nur die Werte der neuen Koordinaten benötigt, hilft (ich sag mal vorsichtig) "vermutlich" nur die Rückgabewerte selbständig mit den Skalierfaktoren umrechnen.
Aber vielleicht hat ja noch jemand anders einen passenden Trick parat :wink:

Gruß, Charly
PureBasic Linux-API-Library: http://www.chabba.de
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Vector Drawing

Beitrag von ccode_new »

Mal anders dargestellt:

->Du beginnst deinen ersten Pfad hier:

Code: Alles auswählen

; erstes Rechteck in rot
    If StartVectorDrawing(CanvasVectorOutput(0))
     For i = 2 To 5
      MovePathCursor(BBRecordx(i-1),BBrecordy(i-1)) ;hier!
- Danach erweiterst du den Pfad

Code: Alles auswählen

AddPathLine   (BBRecordx(i),BBrecordy(i))
Mit dem nächsten "MovePathCursor" -Befehl beginnst du einen neuen Pfad.
->
Was hier passiert!

Code: Alles auswählen

; zweites Rechteck in blau     
     For i = 2 To 5
      MovePathCursor(BBRecordx(i-1)*ScaleFactorX, BBrecordy(i-1)*ScaleFactorY)
Der Befehl "PathBoundsX()": Ich zitiere die Hilfe:
Gibt die X-Koordinate (linke obere Ecke) vom Begrenzungsrahmen (englisch "bounding box") des aktuellen Vektorzeichnen-Pfads zurück. Das Ergebnis ist die niedrigste X-Koordinate, welche beim Zeichnen/Ausfüllen des aktuellen Pfads erreicht würde.
Bei deinem Pfad (roten Rechteck) ist der niedrigste X-Wert nun mal 100 bei dir.
Bei deinem zweiten Pfad (blaues Rechteck) ist der niedrigste X-Wert auch 100.

Dein erstes Rechteck wurde gezeichnet.
Danach veränderst du die Ausmaße (Skalierung) des Koordinatensystem.
(Was gezeichnet ist bleibt gezeichnet.)

Code: Alles auswählen

ScaleCoordinates(0.7, 0.7)
Der Wert bei "PathBoundsX()" wird aber nicht mit skaliert.

Deine Koordinaten-Werte bleiben gleich. (100, ...) und werden nur bei der Ausgabe skaliert dargestellt.

Daher denke ich mal wie "Omi":
es ist zwar in der Hilfe nicht ersichtlich, aber die PathBoundsX/Y/Width/Height beziehen sich (scheinbar) auf unskalierte Pfade. Der Grund dürfte sein, dass mit diesen Werten einfach begrenzende Orthogonale / Rahmen gezeichnet werden können, die automatisch passend mitskaliert werden.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten