]>
git.saurik.com Git - wxWidgets.git/blob - demos/fractal/fractal.cpp
1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: demo of wxConfig and related classes
4 // Author: Andrew Davison
8 // Copyright: (c) 1994 Andrew Davison
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
14 Date: Tue, 5 Apr 1994 12:01:18 +1000
15 From: Andrew Davison <andrewd@au.com.sfe>
16 To: wxwin-users@ed.aiai
17 Subject: Fractal mountains
21 This is a quick port of a fractal mountain generator originally
22 done for MS-Windows. On a Sun the colours look a little washed
23 out and there is not as much snow or high mountains (maybe the
24 random number generators fault). The viewing plane is not
25 quite right as the original code used SetViewportOrg() which there
26 doesn't seem to be an equivalent of under wxWindows, and my quick
31 #pragma implementation
35 #include "wx/wxprec.h"
43 #endif //precompiled headers
49 #define Random(x) (rand() % x)
50 #define Randomize() (srand((unsigned int)time(NULL)))
52 static int detail
= 9; // CHANGE THIS... 7,8,9 etc
54 static bool running
= FALSE
;
55 static wxMenuBar
*menuBar
= NULL
;
57 // Define a new application type
58 class MyApp
: public wxApp
65 // Define a new frame type
66 class MyFrame
: public wxFrame
69 MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
71 void OnCloseWindow(wxCloseEvent
& event
);
72 void OnExit(wxCommandEvent
& event
);
76 // Define a new canvas which can receive some events
77 class MyCanvas
: public wxWindow
80 MyCanvas(wxFrame
*frame
);
84 void OnPaint(wxPaintEvent
& event
);
85 void Fractal(wxDC
& dc
, int X1
, int Y1
, int X2
, int Y2
, int Z1
, int Z2
, int Z3
, int Z4
, int Iteration
, double Std
, double Ratio
);
86 wxPen SnowPen
, MtnPen
, GreenPen
;
93 // `Main program' equivalent, creating windows and returning main app frame
96 // Create the main frame window
97 MyFrame
*frame
= new MyFrame(NULL
, _T("Fractal Mountains for wxWindows"), wxPoint(-1, -1), wxSize(640, 480));
100 wxMenu
*file_menu
= new wxMenu
;
101 file_menu
->Append(wxID_EXIT
, _T("E&xit"));
102 menuBar
= new wxMenuBar
;
103 menuBar
->Append(file_menu
, _T("&File"));
104 frame
->SetMenuBar(menuBar
);
107 frame
->GetClientSize(&width
, &height
);
109 (void) new MyCanvas(frame
);
117 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
118 EVT_CLOSE(MyFrame::OnCloseWindow
)
119 EVT_MENU(wxID_EXIT
, MyFrame::OnExit
)
122 // My frame constructor
123 MyFrame::MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
124 wxFrame(frame
, -1, title
, pos
, size
, wxDEFAULT_FRAME_STYLE
| wxFULL_REPAINT_ON_RESIZE
)
128 // Intercept menu commands
129 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
134 void MyFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
136 static bool destroyed
= FALSE
;
145 BEGIN_EVENT_TABLE(MyCanvas
, wxWindow
)
146 EVT_PAINT(MyCanvas::OnPaint
)
149 // Define a constructor for my canvas
150 MyCanvas::MyCanvas(wxFrame
*frame
):
153 wxColour
wxCol1(255,255,255);
154 SnowPen
= wxPen(wxCol1
, 2, wxSOLID
);
156 wxColour
wxCol2(128,0,0);
157 MtnPen
= wxPen(wxCol2
, 1, wxSOLID
);
159 wxColour
wxCol3(0,128,0);
160 GreenPen
= wxPen(wxCol3
, 1, wxSOLID
);
162 wxColour
wxCol4(0,0,128);
163 WaterBrush
= wxBrush(wxCol4
, wxSOLID
);
166 void MyCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
))
172 void MyCanvas::Draw(wxDC
& dc
)
177 menuBar
->EnableTop(0, FALSE
);
181 int Left
, Top
, Right
, Bottom
;
182 GetClientSize(&Right
, &Bottom
);
184 Right
*= 3; Right
/= 4;
185 Bottom
*= 3; Bottom
/= 4;
190 Water
[0].x
= Left
; Water
[0].y
= Top
;
191 Water
[1].x
= Right
; Water
[1].y
= Top
;
192 Water
[2].x
= Right
+Bottom
/2; Water
[2].y
= Bottom
;
193 Water
[3].x
= Bottom
/2; Water
[3].y
= Bottom
;
195 dc
.SetBrush(WaterBrush
);
196 dc
.DrawPolygon(4, Water
);
199 double Scale
= Bottom
;
200 double Ratio
= 1.0 / pow(2.0, H
);
201 double Std
= Scale
* Ratio
;
202 Sealevel
= Random(18) - 8;
204 Fractal(dc
, Left
, Top
, Right
, Bottom
, 0, 0, 0, 0, detail
, Std
, Ratio
);
206 menuBar
->EnableTop(0, TRUE
);
210 void MyCanvas::Fractal(wxDC
& dc
, int X1
, int Y1
, int X2
, int Y2
, int Z1
, int Z2
, int Z3
, int Z4
, int Iteration
, double Std
, double Ratio
)
212 int Xmid
= (X1
+ X2
) / 2;
213 int Ymid
= (Y1
+ Y2
) / 2;
214 int Z23
= (Z2
+ Z3
) / 2;
215 int Z41
= (Z4
+ Z1
) / 2;
216 int Newz
= (int)((Z1
+ Z2
+ Z3
+ Z4
) / 4 + (double)(Random(17) - 8) / 8.0 * Std
);
220 int Z12
= (Z1
+ Z2
) / 2;
221 int Z34
= (Z3
+ Z4
) / 2;
222 double Stdmid
= Std
* Ratio
;
224 Fractal(dc
, Xmid
, Y1
, X2
, Ymid
, Z12
, Z2
, Z23
, Newz
, Iteration
, Stdmid
, Ratio
);
225 Fractal(dc
, X1
, Y1
, Xmid
, Ymid
, Z1
, Z12
, Newz
, Z41
, Iteration
, Stdmid
, Ratio
);
226 Fractal(dc
, Xmid
, Ymid
, X2
, Y2
, Newz
, Z23
, Z3
, Z34
, Iteration
, Stdmid
, Ratio
);
227 Fractal(dc
, X1
, Ymid
, Xmid
, Y2
, Z41
, Newz
, Z34
, Z4
, Iteration
, Stdmid
, Ratio
);
231 if (Newz
<= Sealevel
)
234 P
[0].x
= Y1
/ 2 + X1
; P
[0].y
= Y1
+ Z1
;
235 P
[1].x
= Y1
/ 2 + X2
; P
[1].y
= Y1
+ Z2
;
236 P
[2].x
= Y2
/ 2 + X2
; P
[2].y
= Y2
+ Z3
;
237 P
[3].x
= Y2
/ 2 + X1
; P
[3].y
= Y2
+ Z4
;
239 dc
.SetPen(* wxBLACK_PEN
);
240 dc
.SetBrush(* wxBLACK_BRUSH
);
242 dc
.DrawPolygon(4, P
);
244 if (Z1
>= -(60+Random(25)))
246 else if (Z1
>= -(100+Random(25)))
251 dc
.DrawLine(Ymid
/2+X2
, Ymid
+Z23
, Ymid
/2+X1
, Ymid
+Z41
);