]>
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 wxWidgets, and my quick
31 #pragma implementation
35 #include "wx/wxprec.h"
43 #endif //precompiled headers
46 #include "wx/stockitem.h"
51 #define Random(x) (rand() % x)
52 #define Randomize() (srand((unsigned int)time(NULL)))
54 static int detail
= 9; // CHANGE THIS... 7,8,9 etc
56 static bool running
= false;
57 static wxMenuBar
*menuBar
= NULL
;
59 // Define a new application type
60 class MyApp
: public wxApp
68 // Define a new frame type
69 class MyFrame
: public wxFrame
72 MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
74 void OnCloseWindow(wxCloseEvent
& event
);
75 void OnExit(wxCommandEvent
& event
);
80 // Define a new canvas which can receive some events
81 class MyCanvas
: public wxWindow
84 MyCanvas(wxFrame
*frame
);
88 void OnPaint(wxPaintEvent
& event
);
89 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
);
90 wxPen SnowPen
, MtnPen
, GreenPen
;
97 // `Main program' equivalent, creating windows and returning main app frame
100 // Create the main frame window
101 MyFrame
*frame
= new MyFrame(NULL
, _T("Fractal Mountains for wxWidgets"), wxDefaultPosition
, wxSize(640, 480));
104 wxMenu
*file_menu
= new wxMenu
;
105 file_menu
->Append(wxID_EXIT
, wxGetStockLabel(wxID_EXIT
));
106 menuBar
= new wxMenuBar
;
107 menuBar
->Append(file_menu
, _T("&File"));
108 frame
->SetMenuBar(menuBar
);
111 frame
->GetClientSize(&width
, &height
);
113 (void) new MyCanvas(frame
);
121 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
122 EVT_CLOSE(MyFrame::OnCloseWindow
)
123 EVT_MENU(wxID_EXIT
, MyFrame::OnExit
)
126 // My frame constructor
127 MyFrame::MyFrame(wxFrame
*frame
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
128 wxFrame(frame
, wxID_ANY
, title
, pos
, size
, wxDEFAULT_FRAME_STYLE
| wxFULL_REPAINT_ON_RESIZE
)
132 // Intercept menu commands
133 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
138 void MyFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
140 static bool destroyed
= false;
149 BEGIN_EVENT_TABLE(MyCanvas
, wxWindow
)
150 EVT_PAINT(MyCanvas::OnPaint
)
153 // Define a constructor for my canvas
154 MyCanvas::MyCanvas(wxFrame
*frame
):
155 wxWindow(frame
, wxID_ANY
)
157 wxColour
wxCol1(255,255,255);
158 SnowPen
= wxPen(wxCol1
, 2, wxSOLID
);
160 wxColour
wxCol2(128,0,0);
161 MtnPen
= wxPen(wxCol2
, 1, wxSOLID
);
163 wxColour
wxCol3(0,128,0);
164 GreenPen
= wxPen(wxCol3
, 1, wxSOLID
);
166 wxColour
wxCol4(0,0,128);
167 WaterBrush
= wxBrush(wxCol4
, wxSOLID
);
170 void MyCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
))
177 void MyCanvas::Draw(wxDC
& dc
)
182 menuBar
->EnableTop(0, false);
186 dc
.SetBackground(*wxLIGHT_GREY_BRUSH
);
189 int Left
, Top
, Right
, Bottom
;
190 GetClientSize(&Right
, &Bottom
);
192 Right
*= 3; Right
/= 4;
193 Bottom
*= 3; Bottom
/= 4;
198 Water
[0].x
= Left
; Water
[0].y
= Top
;
199 Water
[1].x
= Right
; Water
[1].y
= Top
;
200 Water
[2].x
= Right
+Bottom
/2; Water
[2].y
= Bottom
;
201 Water
[3].x
= Bottom
/2; Water
[3].y
= Bottom
;
203 dc
.SetBrush(WaterBrush
);
204 dc
.DrawPolygon(4, Water
);
207 double Scale
= Bottom
;
208 double Ratio
= 1.0 / pow(2.0, H
);
209 double Std
= Scale
* Ratio
;
210 Sealevel
= Random(18) - 8;
212 Fractal(dc
, Left
, Top
, Right
, Bottom
, 0, 0, 0, 0, detail
, Std
, Ratio
);
214 menuBar
->EnableTop(0, true);
218 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
)
220 int Xmid
= (X1
+ X2
) / 2;
221 int Ymid
= (Y1
+ Y2
) / 2;
222 int Z23
= (Z2
+ Z3
) / 2;
223 int Z41
= (Z4
+ Z1
) / 2;
224 int Newz
= (int)((Z1
+ Z2
+ Z3
+ Z4
) / 4 + (double)(Random(17) - 8) / 8.0 * Std
);
228 int Z12
= (Z1
+ Z2
) / 2;
229 int Z34
= (Z3
+ Z4
) / 2;
230 double Stdmid
= Std
* Ratio
;
232 Fractal(dc
, Xmid
, Y1
, X2
, Ymid
, Z12
, Z2
, Z23
, Newz
, Iteration
, Stdmid
, Ratio
);
233 Fractal(dc
, X1
, Y1
, Xmid
, Ymid
, Z1
, Z12
, Newz
, Z41
, Iteration
, Stdmid
, Ratio
);
234 Fractal(dc
, Xmid
, Ymid
, X2
, Y2
, Newz
, Z23
, Z3
, Z34
, Iteration
, Stdmid
, Ratio
);
235 Fractal(dc
, X1
, Ymid
, Xmid
, Y2
, Z41
, Newz
, Z34
, Z4
, Iteration
, Stdmid
, Ratio
);
239 if (Newz
<= Sealevel
)
242 P
[0].x
= Y1
/ 2 + X1
; P
[0].y
= Y1
+ Z1
;
243 P
[1].x
= Y1
/ 2 + X2
; P
[1].y
= Y1
+ Z2
;
244 P
[2].x
= Y2
/ 2 + X2
; P
[2].y
= Y2
+ Z3
;
245 P
[3].x
= Y2
/ 2 + X1
; P
[3].y
= Y2
+ Z4
;
247 dc
.SetPen(* wxBLACK_PEN
);
248 dc
.SetBrush(* wxBLACK_BRUSH
);
250 dc
.DrawPolygon(4, P
);
252 if (Z1
>= -(60+Random(25)))
254 else if (Z1
>= -(100+Random(25)))
259 dc
.DrawLine(Ymid
/2+X2
, Ymid
+Z23
, Ymid
/2+X1
, Ymid
+Z41
);