Назад | Начало урока | Вперед
Содержание

Глава 4

Треугольник Серпинского
Треугольник Серпинского немного сложнее графически, но проще математически. В чертеже треугольника со стороной len, нижний левый угол которого находится в точке (x,y), нам потребуется знать координаты еще пяти точек (рис 4.7)

Подсказка

Следуя традициям, приведу сначала процедуру на псевдокоде:

построить черный треугольник ABC
ЕСЛИ order (порядок треугольника) больше нуля
построить белый треугольник MNK
построить треугольник Серпинского порядка order -1 со стороной len/2
в точках A, M и K.

Следующая функция реализует приведенный алгоритм на С++:


void CPaintDlg::Sierpinsky(CPaintDC *p, int order, int x, int y, int len) {
const double s3d2 = sqrt(3)/2;
CBrush *pOldBrush = NULL;

CBrush brSolidBrush(m_crColors[0]);
pOldBrush = p->SelectObject(&brSolidBrush);

CPoint ptTriangle[3];

ptTriangle[0].x = x+len/2;
ptTriangle[0].y = y-len*s3d2;

ptTriangle[1].x = x+len;
ptTriangle[1].y = y;

ptTriangle[2].x = x;
ptTriangle[2].y = y;

p->Polygon(ptTriangle,3);

if(order >0) {

CBrush brSolidBrush(m_crColors[7]);
p->SelectObject(&brSolidBrush);

CPoint ptTriangle1[3];

ptTriangle1[0].x = x+len/4;
ptTriangle1[0].y = y-len*s3d2/2;

ptTriangle1[1].x = x+3*len/4;
ptTriangle1[1].y = y-len*s3d2/2;

ptTriangle1[2].x = x+len/2;
ptTriangle1[2].y = y;

p->Polygon(ptTriangle1,3);
p->SelectObject(pOldBrush);

Sierpinsky(p, order - 1,x,y,len/2);
Sierpinsky(p, order - 1,x+len/2,y,len/2);
Sierpinsky(p, order - 1,x+len/4,y-len*s3d2/2,len/2);

}//end if
}

Для построения треугольника N-го порядка следует выполнить вызов:

Sierpinsky(pdc, 4, ptStart.x, ptStart.y, ((rRect.right-rRect.left)/2));

Передаем в параметры: контекст для рисования, порядок линии, начальную координату (x,y) и длину стороны треугольника.

Подсказка

Треугольник Серпинского 4-го порядка.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz