Posted: Tue Aug 06, 2002 10:35 am
Restored from previous forum. Originally posted by fweil.
I've just posted a FractalEdit file at Paul's ressource site (should be visible in a while).
I copy also the source code here for people who will prefer to copy it directly from there.
The program is not perfect (!) but works fine to display fractal curves based on vectorized patterns.
It is a kind of hobby I have and don't expect to find images beautiful if you don't like. But the program is interesting by the stuff it does, using a threaded drawing.
By the way if any people is interested we can share experience and ideas to embed this for PureBasic community.
Enjoy it.
;===============================================================
;
; Fractal Edit - 20020806
;
; François Weil
;
; This program displays fractal curves based on uniform vectors defined by angles from one to the following.
;
; The main part of the program handles window and menu creation and events.
; Curve drawing is threaded. This allow to keep hand when drawing a large number of vectors.
;
; Using threaded drawing enables also a possibility to kill the current drawing when starting another one if needed.
;
; The curve drawing is splitted in two procedures 'frame' which gets the drawing size to put in the window, and
; 'trace' which draws the curve itself with conversion from floating calculated values to screen points.
;
; Some interesting tricks are used here like :
;
; - automated menu generation
; - changing window title after a given time
;
; Formulas are listed in a Data section at end of the program. It could be stored in a separate file for an
; embedded version.
;
; Each formula consists is a list of angles giving orientation of each vector of the initial pattern.
;
; A pattern can have any number of vectors (here limited to 100). Recursion is used to replace each vector
; of a pattern by the full pattern itself.
;
; When starting the program you will see a well known Koch curve.
;
; Using the same concept, I listed a set of patterns of some interest.
;
; For interested users / designers, you will notice that it is somewhere better to use basic angles like 30, 45, 60, 90
; degrees steping pattern's items. But there is no limit to possible designs and according to complexity recursion may
; give surprizing results.
;
; By the way, the most interesting results are obtained "when curve end is not too far from origin" which is not
; easy to demonstrate but it is so.
;
#MaxFormulae = 100
#Maxvectors = 100
#Inf = 10000000
#Background = $502828
nvecteurs.l
WindowWidth.l
WindowHeight.l
Formula.l
ThreadID.l
Dim vecteurs.l(#MaxFormulae, #MaxVectors)
x1.f
y1.f
x2.f
y2.f
angle.f
xmin.f
xmax.f
ymin.f
ymax.f
kx.f
ky.f
cx.f
cy.f
Dim Sinus.f(720)
Dim Cosinus.f(720)
Dim sFormula.s(#MaxFormulae)
Global nvecteurs, WindowWidth, WindowHeight, Formula, ThreadID, vecteurs
Global x1, y1, x2, y2, angle, xmin, xmax, ymin, ymax, kx, ky, cx, cy, sinus, cosinus
Procedure.f FMax(x.f, y.f)
max.f
max = x
If y > x
max = y
EndIf
ProcedureReturn max
EndProcedure
Procedure.f FMin(x.f, y.f)
min.f
min = x
If y high
x = high
EndIf
ProcedureReturn x
EndProcedure
Procedure frame(recur.l)
j.l
If recur > 0
For j = 1 To vecteurs(Formula, 0)
angle = IMod(angle + vecteurs(Formula, j), 360) + 360
x2 = x1 + Cosinus(angle)
y2 = y1 + Sinus(angle)
frame(recur - 1)
xmin = FMin(xmin, x2)
ymin = FMin(ymin, y2)
xmax = FMax(xmax, x2)
ymax = FMax(ymax, y2)
x1 = x2
y1 = y2
Next j
EndIf
EndProcedure
Procedure trace(recur.l)
j.l
If recur > 0
For j = 1 To vecteurs(Formula, 0)
angle = IMod(angle + vecteurs(Formula, j), 360) + 360
x2 = x1 + Cosinus(angle)
y2 = y1 + Sinus(angle)
vx1 = kx * (x1 - xmin) + cx
vy1 = WindowHeight - ky * (y1 - ymin) - cy
vx2 = kx * (x2 - xmin) + cx
vy2 = WindowHeight - ky * (y2 - ymin) - cy
LineXY (vx1, vy1, vx2, vy2, #white)
trace(recur - 1)
x1 = x2
y1 = y2
Next j
EndIf
EndProcedure
Procedure Fractal(recur.l)
StatusBarText(0, 0, "Calculating ...", 0)
xmin = #Inf
ymin = #Inf
xmax = -#Inf
ymax = -#Inf
angle = 0
x1 = 0
y1 = 0
frame(recur)
kx = WindowWidth / (xmax - xmin)
ky = WindowHeight / (ymax - ymin)
kx = kx * WindowWidth / WindowHeight
kx = FMin(kx, ky) * 0.4
ky = kx
cx = WindowWidth / 2 - kx * (xmax - xmin) / 2
cy = WindowHeight / 2 - ky * (ymax - ymin) / 2
x1 = 0
y1 = 0
StatusBarText(0, 0, "Drawing ...", 0)
StartDrawing(WindowOutput())
Box(0, 0, WindowWidth, WindowHeight, #Background)
Plot(x1, y1, #white)
trace(recur)
StopDrawing()
StatusBarText(0, 0, "Formula : " + Str(Formula) + " - Recursion level : " + Str(recur) + " - Formula detail : " + sFormula(Formula), 0)
ThreadID = 0
EndProcedure
;
;
;
Formula.l
recur.l
hWnd.l
i.l
Quit.l
x.l
WEvent.l
EventMenuID.l
Group.l
ThreadID.l
tz.l
InitTextSignal.l
FontID.l
xi.f
InitTextSignal = #TRUE
For i = 0 To 720
xi = i * 0.01745329
Sinus(i) = Sin(xi)
Cosinus(i) = Cos(xi)
Next i
WindowWidth = 800
WindowHeight = 600
hWnd = OpenWindow(0, 0, 0, WindowWidth, WindowHeight + 40, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar, "Fractal Edit by FRW (Press F1 for help)")
tz = gettickcount_()
FontID = LoadFont(0, "Verdana", 10)
If hWnd
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 99)
AddKeyboardShortcut(0, #PB_Shortcut_F1, 201)
AddKeyboardShortcut(0, #PB_Shortcut_F2, 202)
AddKeyboardShortcut(0, #PB_Shortcut_F3, 203)
AddKeyboardShortcut(0, #PB_Shortcut_F4, 204)
AddKeyboardShortcut(0, #PB_Shortcut_F5, 205)
If CreateMenu(0, WindowID())
OpenSubMenu("General")
MenuItem(99,"Quit")
CloseSubMenu()
OpenSubMenu("Recursion Level")
For i = 1 To 9
MenuItem(10 + i, "Level " + Str(i))
Next
CloseSubMenu()
OpenSubMenu("Formula")
Quit = #FALSE
Formula = 1
Repeat
Read x
Select x
Case 997
CloseSubMenu()
Case 998
Group = Group + 1
OpenSubMenu("Group" + Str(Group))
Case 999
If nvecteurs #MaxFormulae
Quit = #TRUE
EndIf
EndIf
Default
nvecteurs = nvecteurs + 1
If nvecteurs =10 And EventMenuID = 0 And (EventMenuID - 20) 201
If ThreadID 0 ; Any Menu event corresponds to a new image setting
KillThread(ThreadID) ; The image calculation and drawing are threaded
StopDrawing() ; if a pending thread is still running, it is killed
EndIf ; previously. In case drawing was on at thread kill,
ThreadID = CreateThread(@Fractal(), recur) ; a StopDrawing() is executed.
EndIf
Case #PB_EventRepaint
If ThreadID 0
KillThread(ThreadID)
StopDrawing()
EndIf
ThreadID = CreateThread(@Fractal(), recur)
Default
EndSelect
If GetTickCount_() - tz > 5000 And InitTextSignal
setwindowtext_(hWnd, "Fractal Edit by FRW")
InitTextSignal = #FALSE
EndIf
Until Quit
RemoveKeyboardShortcut(0, #PB_Shortcut_All)
CloseWindow(0)
EndIf
End
DataSection
Data.l 998
Data.l 0, 30, 30, -30, 999
Data.l 0, 30, -30, -30, 999
Data.l 0, 30, 30, 30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, 30, 30, 30, 30, 30, 999
Data.l 997
Data.l 998
Data.l 0, 60, -60, 60, 999
Data.l 0, 60, 60, -60, -60, -60, -60, 60, 60, 999
Data.l 0, 60, 60, 60, -60, -60, -60, 60, 60, -60, -60, -60, 60, 60, -60, -60, -60, 60, 60, -60, -60, -60, 60, 60, 60, 999
Data.l 0, 60, 60, 60, -60, -60, -60, -60, 60, 60, 60, 60, -60, -60, -60, -60, 60, 60, -60, -60, -60, -60, 60, 60, 60, 60, -60, -60, -60, -60, 60, 60, 60, 999
Data.l 997
Data.l 998
Data.l 0, 90, -90, -90, 90, 999
Data.l 0, 90, 0, -90, -90, 0, 90, 999
Data.l 0, 90, 0, 0, -90, -90, 90, 90, -90, -90, 0, 0, 90, 999
Data.l 0, 90, 90, -90, -90, 90, -90, -90, 90, -90, -90, 90, 90, 999
Data.l 0, 0, 90, 90, -90, -90, 90, -90, -90, 90, -90, -90, 90, 90, 0, 999
Data.l 997
Data.l 998
Data.l 0, 45, -90, 45, 999
Data.l 0, 90, -45, -90, -45, 90, 999
Data.l 0, 90, -45, -45, -45, 45, 90, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 270, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 225, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 180, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 135, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 90, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 45, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 0, 999
Data.l 0, 90, 45, -90, -90, -90, 45, -45, 999
Data.l 0, 90, -45, 90, -90, -90, -90, 90, -45, 90, 999
Data.l 0, 45, 45, 45, -90, -45, -45, -90, 45, 45, 45, 999
Data.l 0, 90, 90, 90, 0, 45, 45, 45, 45, 0, 90, 90, 90, 999
Data.l 0, 90, 90, 90, 0, 45, 45, 0, 45, 45, 0, 90, 90, 90, 999
Data.l 0, 90, 90, 90, 0, 0, 45, 45, 0, 45, 45, 0, 0, 90, 90, 90, 999
Data.l 0, 45, 45, 45, -45, -45, -45, -45, -45, -45, 45, 45, 45, 999
Data.l 0, 90, -90, 90, 90, -90, -90, 0, -90, -90, 90, 90, -90, 90, 999
Data.l 0, 45, 45, -45, -45, 45, 45, 45, 45, 45, 45, 45, 45, -45, -45, 45, 45, 999
Data.l 0, 90, -90, 90, 90, -90, -90, -90, 90, 90, -90, -90, -90, 90, 90, -90, 90, 999
Data.l 0, 45, 45, 0, 90, 45, -45, -45, -45, -45, -45, -45, 45, 90, 45, -45, -45, -45, -45, -45, -45, 45, 90, 45, -45, -45, -45, -45, -45, -45, 45, 90, 0, 45, 45, 999
Data.l 0, 0, 0, 45, 45, 45, 90, -45, -45, -45, -45, -45, -45, 90, 90, -45, -45, -45, -45, -45, -45, 90, 90, -45, -45, -45, -45, -45, -45, 90, 45, 45, 45, 0, 0, 999
Data.l 997
Data.l 998
Data.l 0, 60,-120, 60, 999
Data.l 0, 120, -60,-120, -60, 120, 999
Data.l 0, 120, -60, -60, -60, -60, 120, 999
Data.l 0, 30, 60, 30, 60,-120, -30, -30, -30, -30,-120, 60, 30, 60, 30, 999
Data.l 0, 30, 30, 30, 0, 0, 90, 60, -60, -60, -60, -60, -60, 60, 90, 60, -60, -60, -60, -60, -60, 60, 90, 60, -60, -60, -60, -60, -60, 60, 90, 0, 0, 30, 30, 30, 999
Data.l 997
Data.l 998
Data.l 0, 72, 72, 72, -72, -72, -72, 72, 72, -72, -72, -72, 72, 72, -72, -72, -72, 72, 72, -72, -72, -72, 72, 72, 72, 999
Data.l 997
Data.l 999
EndDataSection
;===============================================================
Francois Weil
14, rue Douer
F64100 Bayonne
I've just posted a FractalEdit file at Paul's ressource site (should be visible in a while).
I copy also the source code here for people who will prefer to copy it directly from there.
The program is not perfect (!) but works fine to display fractal curves based on vectorized patterns.
It is a kind of hobby I have and don't expect to find images beautiful if you don't like. But the program is interesting by the stuff it does, using a threaded drawing.
By the way if any people is interested we can share experience and ideas to embed this for PureBasic community.
Enjoy it.
;===============================================================
;
; Fractal Edit - 20020806
;
; François Weil
;
; This program displays fractal curves based on uniform vectors defined by angles from one to the following.
;
; The main part of the program handles window and menu creation and events.
; Curve drawing is threaded. This allow to keep hand when drawing a large number of vectors.
;
; Using threaded drawing enables also a possibility to kill the current drawing when starting another one if needed.
;
; The curve drawing is splitted in two procedures 'frame' which gets the drawing size to put in the window, and
; 'trace' which draws the curve itself with conversion from floating calculated values to screen points.
;
; Some interesting tricks are used here like :
;
; - automated menu generation
; - changing window title after a given time
;
; Formulas are listed in a Data section at end of the program. It could be stored in a separate file for an
; embedded version.
;
; Each formula consists is a list of angles giving orientation of each vector of the initial pattern.
;
; A pattern can have any number of vectors (here limited to 100). Recursion is used to replace each vector
; of a pattern by the full pattern itself.
;
; When starting the program you will see a well known Koch curve.
;
; Using the same concept, I listed a set of patterns of some interest.
;
; For interested users / designers, you will notice that it is somewhere better to use basic angles like 30, 45, 60, 90
; degrees steping pattern's items. But there is no limit to possible designs and according to complexity recursion may
; give surprizing results.
;
; By the way, the most interesting results are obtained "when curve end is not too far from origin" which is not
; easy to demonstrate but it is so.
;
#MaxFormulae = 100
#Maxvectors = 100
#Inf = 10000000
#Background = $502828
nvecteurs.l
WindowWidth.l
WindowHeight.l
Formula.l
ThreadID.l
Dim vecteurs.l(#MaxFormulae, #MaxVectors)
x1.f
y1.f
x2.f
y2.f
angle.f
xmin.f
xmax.f
ymin.f
ymax.f
kx.f
ky.f
cx.f
cy.f
Dim Sinus.f(720)
Dim Cosinus.f(720)
Dim sFormula.s(#MaxFormulae)
Global nvecteurs, WindowWidth, WindowHeight, Formula, ThreadID, vecteurs
Global x1, y1, x2, y2, angle, xmin, xmax, ymin, ymax, kx, ky, cx, cy, sinus, cosinus
Procedure.f FMax(x.f, y.f)
max.f
max = x
If y > x
max = y
EndIf
ProcedureReturn max
EndProcedure
Procedure.f FMin(x.f, y.f)
min.f
min = x
If y high
x = high
EndIf
ProcedureReturn x
EndProcedure
Procedure frame(recur.l)
j.l
If recur > 0
For j = 1 To vecteurs(Formula, 0)
angle = IMod(angle + vecteurs(Formula, j), 360) + 360
x2 = x1 + Cosinus(angle)
y2 = y1 + Sinus(angle)
frame(recur - 1)
xmin = FMin(xmin, x2)
ymin = FMin(ymin, y2)
xmax = FMax(xmax, x2)
ymax = FMax(ymax, y2)
x1 = x2
y1 = y2
Next j
EndIf
EndProcedure
Procedure trace(recur.l)
j.l
If recur > 0
For j = 1 To vecteurs(Formula, 0)
angle = IMod(angle + vecteurs(Formula, j), 360) + 360
x2 = x1 + Cosinus(angle)
y2 = y1 + Sinus(angle)
vx1 = kx * (x1 - xmin) + cx
vy1 = WindowHeight - ky * (y1 - ymin) - cy
vx2 = kx * (x2 - xmin) + cx
vy2 = WindowHeight - ky * (y2 - ymin) - cy
LineXY (vx1, vy1, vx2, vy2, #white)
trace(recur - 1)
x1 = x2
y1 = y2
Next j
EndIf
EndProcedure
Procedure Fractal(recur.l)
StatusBarText(0, 0, "Calculating ...", 0)
xmin = #Inf
ymin = #Inf
xmax = -#Inf
ymax = -#Inf
angle = 0
x1 = 0
y1 = 0
frame(recur)
kx = WindowWidth / (xmax - xmin)
ky = WindowHeight / (ymax - ymin)
kx = kx * WindowWidth / WindowHeight
kx = FMin(kx, ky) * 0.4
ky = kx
cx = WindowWidth / 2 - kx * (xmax - xmin) / 2
cy = WindowHeight / 2 - ky * (ymax - ymin) / 2
x1 = 0
y1 = 0
StatusBarText(0, 0, "Drawing ...", 0)
StartDrawing(WindowOutput())
Box(0, 0, WindowWidth, WindowHeight, #Background)
Plot(x1, y1, #white)
trace(recur)
StopDrawing()
StatusBarText(0, 0, "Formula : " + Str(Formula) + " - Recursion level : " + Str(recur) + " - Formula detail : " + sFormula(Formula), 0)
ThreadID = 0
EndProcedure
;
;
;
Formula.l
recur.l
hWnd.l
i.l
Quit.l
x.l
WEvent.l
EventMenuID.l
Group.l
ThreadID.l
tz.l
InitTextSignal.l
FontID.l
xi.f
InitTextSignal = #TRUE
For i = 0 To 720
xi = i * 0.01745329
Sinus(i) = Sin(xi)
Cosinus(i) = Cos(xi)
Next i
WindowWidth = 800
WindowHeight = 600
hWnd = OpenWindow(0, 0, 0, WindowWidth, WindowHeight + 40, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar, "Fractal Edit by FRW (Press F1 for help)")
tz = gettickcount_()
FontID = LoadFont(0, "Verdana", 10)
If hWnd
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 99)
AddKeyboardShortcut(0, #PB_Shortcut_F1, 201)
AddKeyboardShortcut(0, #PB_Shortcut_F2, 202)
AddKeyboardShortcut(0, #PB_Shortcut_F3, 203)
AddKeyboardShortcut(0, #PB_Shortcut_F4, 204)
AddKeyboardShortcut(0, #PB_Shortcut_F5, 205)
If CreateMenu(0, WindowID())
OpenSubMenu("General")
MenuItem(99,"Quit")
CloseSubMenu()
OpenSubMenu("Recursion Level")
For i = 1 To 9
MenuItem(10 + i, "Level " + Str(i))
Next
CloseSubMenu()
OpenSubMenu("Formula")
Quit = #FALSE
Formula = 1
Repeat
Read x
Select x
Case 997
CloseSubMenu()
Case 998
Group = Group + 1
OpenSubMenu("Group" + Str(Group))
Case 999
If nvecteurs #MaxFormulae
Quit = #TRUE
EndIf
EndIf
Default
nvecteurs = nvecteurs + 1
If nvecteurs =10 And EventMenuID = 0 And (EventMenuID - 20) 201
If ThreadID 0 ; Any Menu event corresponds to a new image setting
KillThread(ThreadID) ; The image calculation and drawing are threaded
StopDrawing() ; if a pending thread is still running, it is killed
EndIf ; previously. In case drawing was on at thread kill,
ThreadID = CreateThread(@Fractal(), recur) ; a StopDrawing() is executed.
EndIf
Case #PB_EventRepaint
If ThreadID 0
KillThread(ThreadID)
StopDrawing()
EndIf
ThreadID = CreateThread(@Fractal(), recur)
Default
EndSelect
If GetTickCount_() - tz > 5000 And InitTextSignal
setwindowtext_(hWnd, "Fractal Edit by FRW")
InitTextSignal = #FALSE
EndIf
Until Quit
RemoveKeyboardShortcut(0, #PB_Shortcut_All)
CloseWindow(0)
EndIf
End
DataSection
Data.l 998
Data.l 0, 30, 30, -30, 999
Data.l 0, 30, -30, -30, 999
Data.l 0, 30, 30, 30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, -30, -30, 999
Data.l 0, 30, 30, 30, 30, 30, -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, 30, 30, 30, 30, 30, 999
Data.l 997
Data.l 998
Data.l 0, 60, -60, 60, 999
Data.l 0, 60, 60, -60, -60, -60, -60, 60, 60, 999
Data.l 0, 60, 60, 60, -60, -60, -60, 60, 60, -60, -60, -60, 60, 60, -60, -60, -60, 60, 60, -60, -60, -60, 60, 60, 60, 999
Data.l 0, 60, 60, 60, -60, -60, -60, -60, 60, 60, 60, 60, -60, -60, -60, -60, 60, 60, -60, -60, -60, -60, 60, 60, 60, 60, -60, -60, -60, -60, 60, 60, 60, 999
Data.l 997
Data.l 998
Data.l 0, 90, -90, -90, 90, 999
Data.l 0, 90, 0, -90, -90, 0, 90, 999
Data.l 0, 90, 0, 0, -90, -90, 90, 90, -90, -90, 0, 0, 90, 999
Data.l 0, 90, 90, -90, -90, 90, -90, -90, 90, -90, -90, 90, 90, 999
Data.l 0, 0, 90, 90, -90, -90, 90, -90, -90, 90, -90, -90, 90, 90, 0, 999
Data.l 997
Data.l 998
Data.l 0, 45, -90, 45, 999
Data.l 0, 90, -45, -90, -45, 90, 999
Data.l 0, 90, -45, -45, -45, 45, 90, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 270, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 225, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 180, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 135, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 90, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 45, 999
Data.l 0, 90, 45, -90, -90, -90, 45, 0, 999
Data.l 0, 90, 45, -90, -90, -90, 45, -45, 999
Data.l 0, 90, -45, 90, -90, -90, -90, 90, -45, 90, 999
Data.l 0, 45, 45, 45, -90, -45, -45, -90, 45, 45, 45, 999
Data.l 0, 90, 90, 90, 0, 45, 45, 45, 45, 0, 90, 90, 90, 999
Data.l 0, 90, 90, 90, 0, 45, 45, 0, 45, 45, 0, 90, 90, 90, 999
Data.l 0, 90, 90, 90, 0, 0, 45, 45, 0, 45, 45, 0, 0, 90, 90, 90, 999
Data.l 0, 45, 45, 45, -45, -45, -45, -45, -45, -45, 45, 45, 45, 999
Data.l 0, 90, -90, 90, 90, -90, -90, 0, -90, -90, 90, 90, -90, 90, 999
Data.l 0, 45, 45, -45, -45, 45, 45, 45, 45, 45, 45, 45, 45, -45, -45, 45, 45, 999
Data.l 0, 90, -90, 90, 90, -90, -90, -90, 90, 90, -90, -90, -90, 90, 90, -90, 90, 999
Data.l 0, 45, 45, 0, 90, 45, -45, -45, -45, -45, -45, -45, 45, 90, 45, -45, -45, -45, -45, -45, -45, 45, 90, 45, -45, -45, -45, -45, -45, -45, 45, 90, 0, 45, 45, 999
Data.l 0, 0, 0, 45, 45, 45, 90, -45, -45, -45, -45, -45, -45, 90, 90, -45, -45, -45, -45, -45, -45, 90, 90, -45, -45, -45, -45, -45, -45, 90, 45, 45, 45, 0, 0, 999
Data.l 997
Data.l 998
Data.l 0, 60,-120, 60, 999
Data.l 0, 120, -60,-120, -60, 120, 999
Data.l 0, 120, -60, -60, -60, -60, 120, 999
Data.l 0, 30, 60, 30, 60,-120, -30, -30, -30, -30,-120, 60, 30, 60, 30, 999
Data.l 0, 30, 30, 30, 0, 0, 90, 60, -60, -60, -60, -60, -60, 60, 90, 60, -60, -60, -60, -60, -60, 60, 90, 60, -60, -60, -60, -60, -60, 60, 90, 0, 0, 30, 30, 30, 999
Data.l 997
Data.l 998
Data.l 0, 72, 72, 72, -72, -72, -72, 72, 72, -72, -72, -72, 72, 72, -72, -72, -72, 72, 72, -72, -72, -72, 72, 72, 72, 999
Data.l 997
Data.l 999
EndDataSection
;===============================================================
Francois Weil
14, rue Douer
F64100 Bayonne