]>
git.saurik.com Git - wxWidgets.git/blob - demos/fractal/fractal.cpp
1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: demo of wxConfig and related classes
4 // Author: Andrew Davison
7 // Copyright: (c) 1994 Andrew Davison
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
13 Date: Tue, 5 Apr 1994 12:01:18 +1000
14 From: Andrew Davison <andrewd@au.com.sfe>
15 To: wxwin-users@ed.aiai
16 Subject: Fractal mountains
20 This is a quick port of a fractal mountain generator originally
21 done for MS-Windows. On a Sun the colours look a little washed
22 out and there is not as much snow or high mountains (maybe the
23 random number generators fault). The viewing plane is not
24 quite right as the original code used SetViewportOrg() which there
25 doesn't seem to be an equivalent of under wxWidgets, and my quick
29 #include "wx/wxprec.h"
37 #endif //precompiled headers
40 #include "wx/stockitem.h"
45 #define Random(x) (rand() % x)
46 #define Randomize() (srand((unsigned int)time(NULL)))
48 static int detail
= 9; // CHANGE THIS... 7,8,9 etc
50 static bool running
= false;
51 static wxMenuBar
*menuBar
= NULL
;
53 // Define a new application type
54 class MyApp
: public wxApp
62 // Define a new frame type
63 class MyFrame
: public wxFrame
66 MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
68 void OnCloseWindow(wxCloseEvent
& event
);
69 void OnExit(wxCommandEvent
& event
);
74 // Define a new canvas which can receive some events
75 class MyCanvas
: public wxWindow
78 MyCanvas(wxFrame
*frame
);
82 void OnPaint(wxPaintEvent
& event
);
83 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
);
84 wxPen SnowPen
, MtnPen
, GreenPen
;
91 // `Main program' equivalent, creating windows and returning main app frame
94 // Create the main frame window
95 MyFrame
*frame
= new MyFrame(NULL
, wxT("Fractal Mountains for wxWidgets"), wxDefaultPosition
, wxSize(640, 480));
98 wxMenu
*file_menu
= new wxMenu
;
99 file_menu
->Append(wxID_EXIT
, wxGetStockLabel(wxID_EXIT
));
100 menuBar
= new wxMenuBar
;
101 menuBar
->Append(file_menu
, wxT("&File"));
102 frame
->SetMenuBar(menuBar
);
105 frame
->GetClientSize(&width
, &height
);
107 (void) new MyCanvas(frame
);
115 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
116 EVT_CLOSE(MyFrame::OnCloseWindow
)
117 EVT_MENU(wxID_EXIT
, MyFrame::OnExit
)
120 // My frame constructor
121 MyFrame::MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
122 wxFrame(frame
, wxID_ANY
, title
, pos
, size
, wxDEFAULT_FRAME_STYLE
| wxFULL_REPAINT_ON_RESIZE
)
126 // Intercept menu commands
127 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
132 void MyFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
134 static bool destroyed
= false;
143 BEGIN_EVENT_TABLE(MyCanvas
, wxWindow
)
144 EVT_PAINT(MyCanvas::OnPaint
)
147 // Define a constructor for my canvas
148 MyCanvas::MyCanvas(wxFrame
*frame
):
149 wxWindow(frame
, wxID_ANY
)
151 wxColour
wxCol1(255,255,255);
152 SnowPen
= wxPen(wxCol1
, 2, wxSOLID
);
154 wxColour
wxCol2(128,0,0);
155 MtnPen
= wxPen(wxCol2
, 1, wxSOLID
);
157 wxColour
wxCol3(0,128,0);
158 GreenPen
= wxPen(wxCol3
, 1, wxSOLID
);
160 wxColour
wxCol4(0,0,128);
161 WaterBrush
= wxBrush(wxCol4
, wxSOLID
);
164 void MyCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
))
171 void MyCanvas::Draw(wxDC
& dc
)
176 menuBar
->EnableTop(0, false);
180 dc
.SetBackground(*wxLIGHT_GREY_BRUSH
);
183 int Left
, Top
, Right
, Bottom
;
184 GetClientSize(&Right
, &Bottom
);
186 Right
*= 3; Right
/= 4;
187 Bottom
*= 3; Bottom
/= 4;
192 Water
[0].x
= Left
; Water
[0].y
= Top
;
193 Water
[1].x
= Right
; Water
[1].y
= Top
;
194 Water
[2].x
= Right
+Bottom
/2; Water
[2].y
= Bottom
;
195 Water
[3].x
= Bottom
/2; Water
[3].y
= Bottom
;
197 dc
.SetBrush(WaterBrush
);
198 dc
.DrawPolygon(4, Water
);
201 double Scale
= Bottom
;
202 double Ratio
= 1.0 / pow(2.0, H
);
203 double Std
= Scale
* Ratio
;
204 Sealevel
= Random(18) - 8;
206 Fractal(dc
, Left
, Top
, Right
, Bottom
, 0, 0, 0, 0, detail
, Std
, Ratio
);
208 menuBar
->EnableTop(0, true);
212 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
)
214 int Xmid
= (X1
+ X2
) / 2;
215 int Ymid
= (Y1
+ Y2
) / 2;
216 int Z23
= (Z2
+ Z3
) / 2;
217 int Z41
= (Z4
+ Z1
) / 2;
218 int Newz
= (int)((Z1
+ Z2
+ Z3
+ Z4
) / 4 + (double)(Random(17) - 8) / 8.0 * Std
);
222 int Z12
= (Z1
+ Z2
) / 2;
223 int Z34
= (Z3
+ Z4
) / 2;
224 double Stdmid
= Std
* Ratio
;
226 Fractal(dc
, Xmid
, Y1
, X2
, Ymid
, Z12
, Z2
, Z23
, Newz
, Iteration
, Stdmid
, Ratio
);
227 Fractal(dc
, X1
, Y1
, Xmid
, Ymid
, Z1
, Z12
, Newz
, Z41
, Iteration
, Stdmid
, Ratio
);
228 Fractal(dc
, Xmid
, Ymid
, X2
, Y2
, Newz
, Z23
, Z3
, Z34
, Iteration
, Stdmid
, Ratio
);
229 Fractal(dc
, X1
, Ymid
, Xmid
, Y2
, Z41
, Newz
, Z34
, Z4
, Iteration
, Stdmid
, Ratio
);
233 if (Newz
<= Sealevel
)
236 P
[0].x
= Y1
/ 2 + X1
; P
[0].y
= Y1
+ Z1
;
237 P
[1].x
= Y1
/ 2 + X2
; P
[1].y
= Y1
+ Z2
;
238 P
[2].x
= Y2
/ 2 + X2
; P
[2].y
= Y2
+ Z3
;
239 P
[3].x
= Y2
/ 2 + X1
; P
[3].y
= Y2
+ Z4
;
241 dc
.SetPen(* wxBLACK_PEN
);
242 dc
.SetBrush(* wxBLACK_BRUSH
);
244 dc
.DrawPolygon(4, P
);
246 if (Z1
>= -(60+Random(25)))
248 else if (Z1
>= -(100+Random(25)))
253 dc
.DrawLine(Ymid
/2+X2
, Ymid
+Z23
, Ymid
/2+X1
, Ymid
+Z41
);