猜猜这段代码实现了什么?出来的效果如何.
1
// ChildView.cpp : CChildView 类的实现
2
//
3
4
#include "stdafx.h"
5
#include "Sierpinski.h"
6
#include "ChildView.h"
7
#include ".\childview.h"
8
9
#ifdef _DEBUG
10
#define new DEBUG_NEW
11
#endif
12
13
14
// CChildView
15
16
CChildView::CChildView()
17
{
18
}
19
20
CChildView::~CChildView()
21
{
22
}
23
24
25
BEGIN_MESSAGE_MAP(CChildView, CWnd)
26
ON_WM_PAINT()
27
ON_WM_CREATE()
28
ON_WM_SIZE()
29
ON_WM_LBUTTONDOWN()
30
END_MESSAGE_MAP()
31
32
33
34
// CChildView 消息处理程序
35
36
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
37
{
38
if (!CWnd::PreCreateWindow(cs))
39
return FALSE;
40
41
cs.dwExStyle |= WS_EX_CLIENTEDGE;
42
cs.style &= ~WS_BORDER;
43
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
44
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
45
46
return TRUE;
47
}
48
49
void CChildView::OnPaint()
50
{
51
CPaintDC dc(this); // 用于绘制的设备上下文
52
53
DrawTriangle(dc);
54
}
55
56
void CChildView::DrawTriangle(CPaintDC& dc)
57
{
58
COLORREF color;
59
60
for (int i=0; i<100000; i++)
61
{
62
FindMidPoint(m_vertex, GetRandomVertex(m_triangle));
63
color = GetColor();
64
dc.SetPixelV(m_vertex._x, m_vertex._y, color);
65
}
66
}
67
68
Vertex CChildView::GetRandomVertex(const Triangle& triangle)
69
{
70
return triangle.vertices[rand() % 3];
71
}
72
73
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
74
{
75
if (CWnd::OnCreate(lpCreateStruct) == -1)
76
return -1;
77
78
srand((unsigned)time(0));
79
80
return 0;
81
}
82
83
void CChildView::FindMidPoint(Vertex& v1, const Vertex& v2)
84
{
85
v1._x = (v1._x + v2._x) / 2;
86
v1._y = (v1._y + v2._y) / 2;
87
}
88
89
Vertex CChildView::FindRandomPoint(const Triangle& triangle)
90
{
91
int x, y, dx, dy;
92
93
x = rand() % (triangle.vertices[2]._x - triangle.vertices[1]._x)
94
+ triangle.vertices[1]._x;
95
96
dx = min(x-triangle.vertices[1]._x, triangle.vertices[2]._x-x);
97
98
dy = 2 * (triangle.vertices[1]._y - triangle.vertices[0]._y)
99
* dx / (triangle.vertices[2]._x - triangle.vertices[1]._x);
100
101
y = rand() % dy + triangle.vertices[1]._y - dy;
102
103
return Vertex(x, y);
104
}
105
106
void CChildView::OnSize(UINT nType, int cx, int cy)
107
{
108
CWnd::OnSize(nType, cx, cy);
109
110
CRect rect;
111
GetClientRect(&rect);
112
113
//构造一个等边三角形
114
m_nHeight = rect.bottom-90;
115
m_triangle.vertices[0] = Vertex(rect.Width()/2, 40);
116
m_triangle.vertices[1] = Vertex(rect.Width()/2-m_nHeight*tan(3.1416/6.0), rect.bottom-50);
117
m_triangle.vertices[2] = Vertex(rect.Width()/2+m_nHeight*tan(3.1416/6.0), rect.bottom-50);
118
119
m_vertex = FindRandomPoint(m_triangle);
120
121
m_fLength = m_nHeight / cos(3.1416/6.0);
122
}
123
124
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
125
{
126
Invalidate();
127
UpdateWindow();
128
}
129
130
COLORREF CChildView::GetColor()
131
{
132
double r, g, b;
133
134
b = sqrt((double)(m_vertex._x - m_triangle.vertices[0]._x) * (m_vertex._x - m_triangle.vertices[0]._x)
135
+ (m_vertex._y - m_triangle.vertices[0]._y) * (m_vertex._y - m_triangle.vertices[0]._y));
136
137
r = sqrt((double)(m_vertex._x - m_triangle.vertices[1]._x) * (m_vertex._x - m_triangle.vertices[1]._x)
138
+ (m_vertex._y - m_triangle.vertices[1]._y) * (m_vertex._y - m_triangle.vertices[1]._y));
139
140
g = sqrt((double)(m_vertex._x - m_triangle.vertices[2]._x) * (m_vertex._x - m_triangle.vertices[2]._x)
141
+ (m_vertex._y - m_triangle.vertices[2]._y) * (m_vertex._y - m_triangle.vertices[2]._y));
142
143
b = 255.0 - b / m_fLength * 255.0;
144
r = 255.0 - r / m_fLength * 255.0;
145
g = 255.0 - g / m_fLength * 255.0;
146
147
return RGB((int)r, (int)g, (int)b);
148
}
注:只提供了ChildView.cpp的代码.
// ChildView.cpp : CChildView 类的实现2
//3

4
#include "stdafx.h"5
#include "Sierpinski.h"6
#include "ChildView.h"7
#include ".\childview.h"8

9
#ifdef _DEBUG10
#define new DEBUG_NEW11
#endif12

13

14
// CChildView15

16
CChildView::CChildView()17
{18
}19

20
CChildView::~CChildView()21
{22
}23

24

25
BEGIN_MESSAGE_MAP(CChildView, CWnd)26
ON_WM_PAINT()27
ON_WM_CREATE()28
ON_WM_SIZE()29
ON_WM_LBUTTONDOWN()30
END_MESSAGE_MAP()31

32

33

34
// CChildView 消息处理程序35

36
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 37
{38
if (!CWnd::PreCreateWindow(cs))39
return FALSE;40

41
cs.dwExStyle |= WS_EX_CLIENTEDGE;42
cs.style &= ~WS_BORDER;43
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 44
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);45

46
return TRUE;47
}48

49
void CChildView::OnPaint() 50
{51
CPaintDC dc(this); // 用于绘制的设备上下文52

53
DrawTriangle(dc);54
}55

56
void CChildView::DrawTriangle(CPaintDC& dc)57
{58
COLORREF color;59

60
for (int i=0; i<100000; i++)61
{62
FindMidPoint(m_vertex, GetRandomVertex(m_triangle));63
color = GetColor();64
dc.SetPixelV(m_vertex._x, m_vertex._y, color);65
}66
}67

68
Vertex CChildView::GetRandomVertex(const Triangle& triangle)69
{70
return triangle.vertices[rand() % 3];71
}72

73
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)74
{75
if (CWnd::OnCreate(lpCreateStruct) == -1)76
return -1;77

78
srand((unsigned)time(0));79

80
return 0;81
}82

83
void CChildView::FindMidPoint(Vertex& v1, const Vertex& v2)84
{85
v1._x = (v1._x + v2._x) / 2;86
v1._y = (v1._y + v2._y) / 2;87
}88

89
Vertex CChildView::FindRandomPoint(const Triangle& triangle)90
{91
int x, y, dx, dy;92

93
x = rand() % (triangle.vertices[2]._x - triangle.vertices[1]._x)94
+ triangle.vertices[1]._x;95

96
dx = min(x-triangle.vertices[1]._x, triangle.vertices[2]._x-x);97

98
dy = 2 * (triangle.vertices[1]._y - triangle.vertices[0]._y)99
* dx / (triangle.vertices[2]._x - triangle.vertices[1]._x);100

101
y = rand() % dy + triangle.vertices[1]._y - dy;102

103
return Vertex(x, y);104
}105

106
void CChildView::OnSize(UINT nType, int cx, int cy)107
{108
CWnd::OnSize(nType, cx, cy);109

110
CRect rect;111
GetClientRect(&rect);112

113
//构造一个等边三角形114
m_nHeight = rect.bottom-90;115
m_triangle.vertices[0] = Vertex(rect.Width()/2, 40);116
m_triangle.vertices[1] = Vertex(rect.Width()/2-m_nHeight*tan(3.1416/6.0), rect.bottom-50);117
m_triangle.vertices[2] = Vertex(rect.Width()/2+m_nHeight*tan(3.1416/6.0), rect.bottom-50);118

119
m_vertex = FindRandomPoint(m_triangle);120

121
m_fLength = m_nHeight / cos(3.1416/6.0);122
}123

124
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)125
{126
Invalidate();127
UpdateWindow();128
}129

130
COLORREF CChildView::GetColor()131
{132
double r, g, b;133

134
b = sqrt((double)(m_vertex._x - m_triangle.vertices[0]._x) * (m_vertex._x - m_triangle.vertices[0]._x)135
+ (m_vertex._y - m_triangle.vertices[0]._y) * (m_vertex._y - m_triangle.vertices[0]._y));136

137
r = sqrt((double)(m_vertex._x - m_triangle.vertices[1]._x) * (m_vertex._x - m_triangle.vertices[1]._x)138
+ (m_vertex._y - m_triangle.vertices[1]._y) * (m_vertex._y - m_triangle.vertices[1]._y));139

140
g = sqrt((double)(m_vertex._x - m_triangle.vertices[2]._x) * (m_vertex._x - m_triangle.vertices[2]._x)141
+ (m_vertex._y - m_triangle.vertices[2]._y) * (m_vertex._y - m_triangle.vertices[2]._y));142

143
b = 255.0 - b / m_fLength * 255.0;144
r = 255.0 - r / m_fLength * 255.0;145
g = 255.0 - g / m_fLength * 255.0;146

147
return RGB((int)r, (int)g, (int)b);148
}


浙公网安备 33010602011771号