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

Глава 4

Драконова линия
Начертить драконову ломаную пожалуй несколько труднее. Для начала рассмотрим каким образом драконова ломаная N-го порядка строится на основании ломаной порядка N-1 (рис 4.8).

Подсказка

рис 4.8 Построение Драконовой ломаной второго и третьего порядка

При увеличении порядка ломаной, каждый сегмент заменяется двумя отрезками, расположенными под прямым углом. Первая пара отрезков находится слева от сегмента ломаной предыдущего порядка, вторая - справа, третья слева и тд.

Построение ломаной удобно разбить на две функции. Первая возвращает массив точек, соответствующих углам сломаной:

CObArray* GetDragonPolyline(CPaintDC* pdc1, int order)

Вторая (главная) запрашивает ломаную в виде массива точек и выводит ее на экран:


void Dragon(CPaintDC* p, int order) {
CObArray* line = new CObArray;
line = GetDragonPolyline(p, order);

CPoint* pt = new CPoint(0,0);
pt = (CPoint*)line->GetAt(0);
p->MoveTo(pt->x, pt->y);

for(unsigned i =1; i < (line->GetCount()); i++){

CPoint* pt1 = new CPoint(0,0);
pt1 = (CPoint*)line->GetAt(i);
p->LineTo(pt1->x, pt1->y);
}
}

Алгоритму функции GetDragonPolyline() запись на псевдокоде не добавит понятности, поэтому я сразу приведу окончательный код функции:



CObArray* GetDragonPolyline(CPaintDC* pdc1, int order) {
if(order == 0) {

CObArray* dragLine = new CObArray();
int DirSign = 1;

CPoint* p1 = NULL;
CPoint* p2 = NULL;

p1 = new CPoint(50,100);
p2 = new CPoint(200,100);

dragLine->Add((CObject*)p1);
dragLine->Add((CObject*)p2);

CObArray* ar = NULL;
ar = new CObArray();
ar = dragLine;
return ar;

}
CObArray* prevline = new CObArray();
prevline = GetDragonPolyline(pdc1, order - 1);

CPoint* p_temp = new CPoint(0,0);
p_temp = (CPoint*)prevline->GetAt(0);

CObArray* dragLine = new CObArray();
dragLine->Add((CObject*)p_temp);

int DirSign = 1;

for(int i = 0; i < prevline->GetCount()-1;i++) {

CPoint* p1 = new CPoint(0,0);
CPoint* p2 = new CPoint(0,0);
p1 = new CPoint(0,0);
p2 = new CPoint(0,0);
p1 = (CPoint*)prevline->GetAt(i);
p2 = (CPoint*)prevline->GetAt(i+1);

double alpha = atan2(p2->y - p1->y, p2->x - p1->x) - DirSign * M_PI/4;
double R = sqrt((p1->x - p2->x)*(p1->x - p2->x) + (p1->y - p2->y)*(p1->y - p2->y))/sqrt(2);

CPoint* pc = NULL;
pc = new CPoint(p1->x + R*cos(alpha),p1->y + R*sin(alpha));

dragLine->Add((CObject*)pc);
dragLine->Add((CObject*)p2);

DirSign = -DirSign;

}
return dragLine;
}


Подсказка

Драконовая ломаная 12-го порядка.


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

Hosted by uCoz