Vektorgrafik mit PB
Verfasst: 19.07.2010 13:39
Hallo,
mein Ziel ist es, geschlossene Polygone (und später vieleicht mal Beziergone) als einfarbige Flächen auf dem Bildschirm darzustellen. Der einfachste Weg ist mit LineXY das Polygon zu zeichnen und mit FillArea das ganze auszumalen (siehe Code). Da ich aber auf 2DDrawing verzichten möchte (da vermutlich langsam und für Bezierkurven nicht geeignet) und das ganze in Echtzeit verändert werden soll (Rotation und Verzerrung), würde ich gerne anhand der gegebenen Eckpunkte eine andere Herangehensweise (Pixel direkt im Bildschirmspeicher manipulieren o.ä.) vorziehen. Habt ihr Ideen oder interessante Links zum Thema? Letztendlich ist das ja nichts anderes als Vektorgrafik. Oder gibt es vielleicht eine in PB nutzbare Bibliothek, die so etwas kann?
mein Ziel ist es, geschlossene Polygone (und später vieleicht mal Beziergone) als einfarbige Flächen auf dem Bildschirm darzustellen. Der einfachste Weg ist mit LineXY das Polygon zu zeichnen und mit FillArea das ganze auszumalen (siehe Code). Da ich aber auf 2DDrawing verzichten möchte (da vermutlich langsam und für Bezierkurven nicht geeignet) und das ganze in Echtzeit verändert werden soll (Rotation und Verzerrung), würde ich gerne anhand der gegebenen Eckpunkte eine andere Herangehensweise (Pixel direkt im Bildschirmspeicher manipulieren o.ä.) vorziehen. Habt ihr Ideen oder interessante Links zum Thema? Letztendlich ist das ja nichts anderes als Vektorgrafik. Oder gibt es vielleicht eine in PB nutzbare Bibliothek, die so etwas kann?
Code: Alles auswählen
; ------------------------------------- Polygon erstellen
Structure poly
x.l
y.l
EndStructure
Global NewList poly.poly()
Procedure newpoint(x,y)
LastElement(poly())
AddElement(poly())
poly()\x = x
poly()\y = y
EndProcedure
newpoint(126,339)
newpoint(170,269)
newpoint(328,246)
newpoint(257,201)
newpoint(234, 43)
newpoint(190,114)
newpoint(32, 137)
newpoint(103,182)
; ------------------------------------- Polygon anzeigen
Procedure polydraw(farbe)
StartDrawing(ScreenOutput())
anzahl = ListSize(poly())
For p1 = 0 To anzahl - 1
p2 = (p1 + 1) % anzahl
SelectElement(poly(), p1)
x1 = poly()\x
y1 = poly()\y
SelectElement(poly(), p2)
x2 = poly()\x
y2 = poly()\y
LineXY(x1, y1, x2, y2, farbe)
Next p1
FillArea(200, 200, farbe, farbe)
StopDrawing()
EndProcedure
; ------------------------------------- Hauptprogramm
OpenWindow(0, 0, 0, 400, 400, "Polygon", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
InitKeyboard()
InitSprite()
OpenWindowedScreen(WindowID(0), 0, 0, 400, 400, 0, 0, 0)
Repeat
Ereignis = WindowEvent()
ExamineKeyboard()
ClearScreen(0)
polydraw($FF0000)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Ereignis = #PB_Event_CloseWindow