猜猜这段代码实现了什么?出来的效果如何.

  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
 16CChildView::CChildView()
 17{
 18}

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

 23
 24
 25BEGIN_MESSAGE_MAP(CChildView, CWnd)
 26    ON_WM_PAINT()
 27    ON_WM_CREATE()
 28    ON_WM_SIZE()
 29    ON_WM_LBUTTONDOWN()
 30END_MESSAGE_MAP()
 31
 32
 33
 34// CChildView 消息处理程序
 35
 36BOOL 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
 49void CChildView::OnPaint() 
 50{
 51    CPaintDC dc(this); // 用于绘制的设备上下文
 52
 53    DrawTriangle(dc);
 54}

 55
 56void 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
 68Vertex CChildView::GetRandomVertex(const Triangle& triangle)
 69{
 70    return triangle.vertices[rand() % 3];
 71}

 72
 73int 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
 83void 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
 89Vertex 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
106void 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()/240);
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
124void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
125{
126    Invalidate();
127    UpdateWindow();
128}

129
130COLORREF 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的代码.