]>
git.saurik.com Git - wxWidgets.git/blob - demos/fractal/fractal.cpp
51df2ed7c2974c95d75c63841ab8cd35fe792ed3
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 wxWidgets, and my quick
31 #pragma implementation
35 #include "wx/wxprec.h"
43 #endif //precompiled headers
50 #define Random(x) (rand() % x)
51 #define Randomize() (srand((unsigned int)time(NULL)))
53 static int detail
= 9; // CHANGE THIS... 7,8,9 etc
55 static bool running
= false;
56 static wxMenuBar
*menuBar
= NULL
;
58 // Define a new application type
59 class MyApp
: public wxApp
67 // Define a new frame type
68 class MyFrame
: public wxFrame
71 MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
73 void OnCloseWindow(wxCloseEvent
& event
);
74 void OnExit(wxCommandEvent
& event
);
79 // Define a new canvas which can receive some events
80 class MyCanvas
: public wxWindow
83 MyCanvas(wxFrame
*frame
);
87 void OnPaint(wxPaintEvent
& event
);
88 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
);
89 wxPen SnowPen
, MtnPen
, GreenPen
;
96 // `Main program' equivalent, creating windows and returning main app frame
99 // Create the main frame window
100 MyFrame
*frame
= new MyFrame(NULL
, _T("Fractal Mountains for wxWidgets"), wxDefaultPosition
, wxSize(640, 480));
103 wxMenu
*file_menu
= new wxMenu
;
104 file_menu
->Append(wxID_EXIT
, _T("E&xit"));
105 menuBar
= new wxMenuBar
;
106 menuBar
->Append(file_menu
, _T("&File"));
107 frame
->SetMenuBar(menuBar
);
110 frame
->GetClientSize(&width
, &height
);
112 (void) new MyCanvas(frame
);
120 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
121 EVT_CLOSE(MyFrame::OnCloseWindow
)
122 EVT_MENU(wxID_EXIT
, MyFrame::OnExit
)
125 // My frame constructor
126 MyFrame::MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
127 wxFrame(frame
, wxID_ANY
, title
, pos
, size
, wxDEFAULT_FRAME_STYLE
| wxFULL_REPAINT_ON_RESIZE
)
131 // Intercept menu commands
132 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
137 void MyFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
139 static bool destroyed
= false;
148 BEGIN_EVENT_TABLE(MyCanvas
, wxWindow
)
149 EVT_PAINT(MyCanvas::OnPaint
)
152 // Define a constructor for my canvas
153 MyCanvas::MyCanvas(wxFrame
*frame
):
154 wxWindow(frame
, wxID_ANY
)
156 wxColour
wxCol1(255,255,255);
157 SnowPen
= wxPen(wxCol1
, 2, wxSOLID
);
159 wxColour
wxCol2(128,0,0);
160 MtnPen
= wxPen(wxCol2
, 1, wxSOLID
);
162 wxColour
wxCol3(0,128,0);
163 GreenPen
= wxPen(wxCol3
, 1, wxSOLID
);
165 wxColour
wxCol4(0,0,128);
166 WaterBrush
= wxBrush(wxCol4
, wxSOLID
);
169 void MyCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
))
176 void MyCanvas::Draw(wxDC
& dc
)
181 menuBar
->EnableTop(0, false);
185 dc
.SetBackground(*wxLIGHT_GREY_BRUSH
);
188 int Left
, Top
, Right
, Bottom
;
189 GetClientSize(&Right
, &Bottom
);
191 Right
*= 3; Right
/= 4;
192 Bottom
*= 3; Bottom
/= 4;
197 Water
[0].x
= Left
; Water
[0].y
= Top
;
198 Water
[1].x
= Right
; Water
[1].y
= Top
;
199 Water
[2].x
= Right
+Bottom
/2; Water
[2].y
= Bottom
;
200 Water
[3].x
= Bottom
/2; Water
[3].y
= Bottom
;
202 dc
.SetBrush(WaterBrush
);
203 dc
.DrawPolygon(4, Water
);
206 double Scale
= Bottom
;
207 double Ratio
= 1.0 / pow(2.0, H
);
208 double Std
= Scale
* Ratio
;
209 Sealevel
= Random(18) - 8;
211 Fractal(dc
, Left
, Top
, Right
, Bottom
, 0, 0, 0, 0, detail
, Std
, Ratio
);
213 menuBar
->EnableTop(0, true);
217 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
)
219 int Xmid
= (X1
+ X2
) / 2;
220 int Ymid
= (Y1
+ Y2
) / 2;
221 int Z23
= (Z2
+ Z3
) / 2;
222 int Z41
= (Z4
+ Z1
) / 2;
223 int Newz
= (int)((Z1
+ Z2
+ Z3
+ Z4
) / 4 + (double)(Random(17) - 8) / 8.0 * Std
);
227 int Z12
= (Z1
+ Z2
) / 2;
228 int Z34
= (Z3
+ Z4
) / 2;
229 double Stdmid
= Std
* Ratio
;
231 Fractal(dc
, Xmid
, Y1
, X2
, Ymid
, Z12
, Z2
, Z23
, Newz
, Iteration
, Stdmid
, Ratio
);
232 Fractal(dc
, X1
, Y1
, Xmid
, Ymid
, Z1
, Z12
, Newz
, Z41
, Iteration
, Stdmid
, Ratio
);
233 Fractal(dc
, Xmid
, Ymid
, X2
, Y2
, Newz
, Z23
, Z3
, Z34
, Iteration
, Stdmid
, Ratio
);
234 Fractal(dc
, X1
, Ymid
, Xmid
, Y2
, Z41
, Newz
, Z34
, Z4
, Iteration
, Stdmid
, Ratio
);
238 if (Newz
<= Sealevel
)
241 P
[0].x
= Y1
/ 2 + X1
; P
[0].y
= Y1
+ Z1
;
242 P
[1].x
= Y1
/ 2 + X2
; P
[1].y
= Y1
+ Z2
;
243 P
[2].x
= Y2
/ 2 + X2
; P
[2].y
= Y2
+ Z3
;
244 P
[3].x
= Y2
/ 2 + X1
; P
[3].y
= Y2
+ Z4
;
246 dc
.SetPen(* wxBLACK_PEN
);
247 dc
.SetBrush(* wxBLACK_BRUSH
);
249 dc
.DrawPolygon(4, P
);
251 if (Z1
>= -(60+Random(25)))
253 else if (Z1
>= -(100+Random(25)))
258 dc
.DrawLine(Ymid
/2+X2
, Ymid
+Z23
, Ymid
/2+X1
, Ymid
+Z41
);