Ich habe ein Koordinatensystem, das ich drehen möchte.
Aber nicht im Kreis, sondern im Quadrat.
Das Koordinatensystem geht von:
Xrichtung: 0,0 bis 4,0
Yrichtung: 0,0 bis 0,4
Ich habe bereits nach "Matrix drehen" gegoogelt.
Aber ich gestehe, ich kann mit den Beschreibungen nichts anfangen.
Ich lerne besser aus funktionierenden Beispielen.
Ich habe da mal was ausgetüfftelt, damit Ihr seht, wie ich mir das vorstelle.
(Bitte nicht schimpfen, ich weiss, das Prg ist noch sehr kuddelmuddelig).
Könnt Ihr mir helfen, das zu verbessern?
Ich möchte meine Symbole nicht einfach im Kreis drehen,
weil, meine Symbole dann entweder über die Kanten hinaus
oder nicht bis in die Ecken hinein zeichnen.
Ich hoffe, Ihr versteht, was ich meine.
Gruß & Dank im Voraus:
Bernd
Code: Alles auswählen
Global Dim m1.Point(16)
Global Dim m2.Point( 8)
Global PBlack=CreatePen_(#PS_SOLID|#PS_ENDCAP_SQUARE , 7, $000000)
Global PGelb =CreatePen_(#PS_SOLID|#PS_ENDCAP_SQUARE , 3, $00D7FF)
Global raster=10
Restore matrix
Read.s a$
For i=1 To 16
m$=StringField(a$,i,",")
m1(i-1)\x=Val(StringField(m$,1,"."))
m1(i-1)\y=Val(StringField(m$,2,"."))
Next
Read.s a$
For i=1 To 8
m$=StringField(a$,i,",")
m2(i-1)\x=Val(StringField(m$,1,"."))
m2(i-1)\y=Val(StringField(m$,2,"."))
Next
DataSection
matrix:
Data.s "0.2,0.1,0.0,1.0,2.0,3.0,4.0,4.1,4.2,4.3,4.4,3.4,2.4,1.4,0.4,0.3"
Data.s "1.2,1.1,2.1,3.1,3.2,3.3,2.3,1.3"
EndDataSection
;- ====== Konstanten
; - Fenster
Enumeration
#hwnd
EndEnumeration
Procedure Create_Window()
fl=#PB_Window_SystemMenu
fl|#PB_Window_ScreenCentered
OpenWindow(#hwnd,0,0,300,400,"Gleisplan- Editor",fl)
EndProcedure
Procedure objekt(hdc,a$,xpos,ypos,winkel,pen)
dgi$=StringField(a$,1,",") ; Zeichnenfunktion
xy$=Mid(a$,Len(dgi$)+2)
Select dgi$
Case "pol" ; pol = Polyline als eine mögliche Zeichnenfunktion
ip=(CountString(xy$,","))/2 +1
Dim p.point(ip)
For j=0 To ip-1
x =Val(StringField(xy$,1+j*2,",")); *fx
y =Val(StringField(xy$,2+j*2,",")); *fy
ok=0
For w=0 To 15
If x=m1(w)\x And y=m1(w)\y
w1=w+winkel*2
If w1>15:w1-16:EndIf
p(j)\x =m1(w1)\x*raster +raster
p(j)\y =m1(w1)\y*raster +raster
ok=1
Break
EndIf
Next
If Not ok
For w=0 To 7
If x=m2(w)\x And y=m2(w)\y
w1=w+winkel
If w1>7:w1-8:EndIf
p(j)\x =m2(w1)\x*raster +raster
p(j)\y =m2(w1)\y*raster +raster
ok=1
Break
EndIf
Next
EndIf
If Not ok
p(j)\x =2*raster +raster
p(j)\y =2*raster +raster
EndIf
Next
SelectObject_(hdc,pen)
Polyline_(hdc,@p(),ip)
EndSelect
EndProcedure
Procedure zeichne_objekt(hdc,objekt$,x,y,winkel,richtung)
Box(raster-4,raster-4,4*raster+8,4*raster+8,$A9A9A9)
For i=1 To CountString(objekt$,"+") +1
a$=StringField(objekt$,i,"+")
objekt(hdc,a$,x,y,winkel,PBlack)
Next
If richtung
a$=StringField(objekt$,richtung,"+")
objekt(hdc,a$,x,y,winkel,PGelb)
EndIf
EndProcedure
Create_Window()
hdc=StartDrawing(WindowOutput(#hwnd))
Box(0,0,WindowWidth(#hwnd),WindowHeight(#hwnd),$00ff00)
StopDrawing()
x=10
y=150
objekt$= "pol,0,2,4,2"
objekt$+ "+pol,0,2,1,2,3,3,4,4"
objekt$+ "+pol,0,2,2,2,4,4"
richtung=2
Repeat
If ElapsedMilliseconds()-zeit>1000
zeit=ElapsedMilliseconds()
hdc=StartDrawing(WindowOutput(#hwnd))
zeichne_objekt(hdc,objekt$,x,y,winkel,richtung)
winkel+1:If winkel>7:winkel-8:EndIf
StopDrawing()
EndIf
ev = WaitWindowEvent(20)
Select ev
Case #PB_Event_CloseWindow
ende=1
EndSelect
Until ende
DeleteObject_(PBlack)
DeleteObject_(PGelb)
End