Die Test-Datei (für z.B. eigene Verschlüsselungen) sollte schon einige KB groß sein, begrenzt nach oben habe ich es auf 100.000 Bytes.
Code: Alles auswählen
;- Phasenraumplot
;- "Helle" Klaus Helbing, 07.04.2008, PB4.10
;- Dieser Phasenraumplot stellt die Bytes z.B. einer Datei 3-dimensional als Raumpunkte dar
;- Die Raum-Koordinaten errechnen sich folgendermaßen:
;- Punkt1=(Byte1-Byte2, Byte2-Byte3, Byte3-Byte4), Punkt2=(Byte2-Byte3, Byte3-Byte4, Byte4-Byte5) usw.
;- Gut verschlüsselte Daten und gute Zufallszahlen ergeben im Phasenraumplot eine gleichmäßig
;- verteilte Punktewolke, ansonsten sieht man Strukturen (z.B. Linien)
;- Z wurde aus Platzgründen um Faktor 2 gestaucht
;- Zur besseren Übersicht wurde der Koordinaten-Ursprung nach oben verschoben
Cos10.f = Cos(10*#PI/180)
Sin10.f = Sin(10*#PI/180)
Cos60.f = 0.5 ;Cos(60°)
Sin60.f = Sin(60*#PI/180)
AX.l = 50
AY.l = 548
BX.l = AX + 0.75*510*Sin60 ;0.75=Verkürzungsfaktor
BY.l = AY - 0.75*510*Cos60
CX.l = BX + 510*Cos10
CY.l = BY + 510*Sin10
DX.l = AX + 510*Cos10
DY.l = AY + 510*Sin10
Buffer = AllocateMemory(100000) ;100000 Bytes für die zu testende Datei
If OpenWindow(0, 0, 0, 900, 675, "Phasenraumplot", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
TextGadget(0,200,10,500,20,"Zu testende Datei auswählen :",#PB_Text_Center)
ExplorerTreeGadget(1, 10, 30, 880, 620,"",#PB_Explorer_NoDriveRequester)
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until EventType()=#PB_EventType_LeftDoubleClick And GetGadgetState(1)=#PB_Explorer_File
File$=GetGadgetText(1)
ReadFile(0,File$) ;nur zum Lesen öffnen
FileL=Lof(0)
If FileL > 100000
FileL = 100000 ;hier auf 100000 Bytes begrenzt
EndIf
ReadData(0, Buffer, FileL)
If StartDrawing(WindowOutput(0))
Box(0, 0, 900, 675, RGB(255,255,255))
;Z-Bemaßung
LineXY(AX, AY, AX, 170)
LineXY(45, 170, 55, 170) ;Querstrich +255
LineXY(45, 298, 55, 298) ;Querstrich 0
LineXY(45, 425, 55, 425) ;Querstrich -255
DrawText(35 ,150, "( Z )") ;ist nicht die Achse, sondern die Bemaßung!
DrawText(5, 165, "+255")
DrawText(25, 290, "0")
DrawText(5, 420, "-255")
DrawText(475, 15, "Z", RGB(0, 0, 255), RGB(255, 255, 255))
;Y-Bemaßung
LineXY(AX, AY, DX, DY) ;unten
LineXY(BX, BY, CX, CY) ;oben
YMXU = AX + (DX-AX)/2
YMYU = AY + (DY-AY)/2
YMXO = BX + (CX-BX)/2
YMYO = BY + (CY-BY)/2
LineXY(YMXU, YMYU, YMXO, YMYO, RGB(0, 0, 255)) ;blau
DrawText(DX-40, DY, "( Y )") ;ist nicht die Achse, sondern die Bemaßung!
DrawText(DX-10, DY+10, "+255")
DrawText(YMXU-8, YMYU+3, "0")
DrawText(AX-10, AY+5, "-255")
DrawText(670, 535, "Y", RGB(0, 0, 255), RGB(255, 255, 255))
;X-Bemaßung
LineXY(AX, AY, BX, BY) ;links
LineXY(DX, DY, CX, CY) ;rechts
XMXL = AX + (BX-AX)/2
XMYL = BY + (AY-BY)/2
XMXR = DX + (CX-DX)/2
XMYR = CY + (DY-CY)/2
LineXY(XMXL, XMYL, XMXR, XMYR, RGB(0, 0, 255)) ;blau
DrawText(DX+10, DY-5, "( X )") ;ist nicht die Achse, sondern die Bemaßung!
DrawText(XMXR+5, XMYR, "0")
DrawText(CX-10, CY-20, "-255")
DrawText(335, 575, "X", RGB(0, 0, 255), RGB(255, 255, 255))
;"echte" Z-Achse
MXZ = YMXU + (YMXO-YMXU)/2
MYZ = YMYO + (YMYU-YMYO)/2
;Nullpunkt = (MXZ, MYZ-AY+170+128)
MX = MXZ
MY = MYZ-AY+170+128
;--------------------------------------------------------------------------------------------------
For R=0 To FileL - 4
T = PeekL(Buffer + R)
A.c = T & 255
B.c = T >> 8
T>>8
C.c = T >> 8
T>>8
D.c = T >> 8
PX = A-B
PY = B-C
PZ = C-D
PXX = MX - 0.75*PX*Sin60
PXY = MY + 0.75*PX*Cos60
PYX = PXX + PY*Cos10
PYY = PXY + PY*Sin10
PZY = PYY - PZ/2
Plot(PYX, PZY, RGB(255, 0, 0)) ;roten Punkt zeichnen
Next
;"echte" Z-Achse mit Koordinaten-Ursprung zur Orientierung nachträglich einzeichnen
LineXY(MXZ, MYZ, MXZ, MYZ-AY+70, RGB(0, 0, 255)) ;blau
LineXY(MXZ-5, MYZ-AY+170+128,MXZ+5, MYZ-AY+170+128)
DrawText(MXZ+5, MYZ-AY+170+128-8, "(0,0,0)")
StopDrawing()
EndIf
Repeat : Event = WaitWindowEvent() : Until Event = #PB_Event_CloseWindow
EndIf
Helle