Глава 4
рис 4.8 Построение Драконовой ломаной второго и третьего порядка
При увеличении порядка ломаной, каждый сегмент заменяется двумя отрезками, расположенными под прямым углом. Первая пара отрезков находится слева от сегмента ломаной предыдущего порядка, вторая - справа, третья слева и тд.
Построение ломаной удобно разбить на две функции. Первая возвращает массив точек, соответствующих углам сломаной:
CObArray* GetDragonPolyline(CPaintDC* pdc1, int order)
Вторая (главная) запрашивает ломаную в виде массива точек и выводит ее на экран:
CPoint* pt = new CPoint(0,0);
for(unsigned i =1; i < (line->GetCount()); i++){
void Dragon(CPaintDC* p, int order)
{
line = GetDragonPolyline(p, order);
pt = (CPoint*)line->GetAt(0);
p->MoveTo(pt->x, pt->y);
pt1 = (CPoint*)line->GetAt(i);
p->LineTo(pt1->x, pt1->y);
Алгоритму функции GetDragonPolyline() запись на псевдокоде не добавит понятности, поэтому я сразу приведу окончательный код функции:
CObArray* dragLine = new CObArray();
CPoint* p1 = NULL;
p1 = new CPoint(50,100);
dragLine->Add((CObject*)p1);
CObArray* ar = NULL;
CPoint* p_temp = new CPoint(0,0);
CObArray* dragLine = new CObArray();
int DirSign = 1;
for(int i = 0; i < prevline->GetCount()-1;i++)
{
double alpha = atan2(p2->y - p1->y, p2->x - p1->x) - DirSign * M_PI/4;
CPoint* pc = NULL;
dragLine->Add((CObject*)pc);
DirSign = -DirSign;
CObArray* GetDragonPolyline(CPaintDC* pdc1, int order)
{
int DirSign = 1;
CPoint* p2 = NULL;
p2 = new CPoint(200,100);
dragLine->Add((CObject*)p2);
ar = new CObArray();
ar = dragLine;
return ar;
CObArray* prevline = new CObArray();
prevline = GetDragonPolyline(pdc1, order - 1);
p_temp = (CPoint*)prevline->GetAt(0);
dragLine->Add((CObject*)p_temp);
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 R = sqrt((p1->x - p2->x)*(p1->x - p2->x) + (p1->y - p2->y)*(p1->y - p2->y))/sqrt(2);
pc = new CPoint(p1->x + R*cos(alpha),p1->y + R*sin(alpha));
dragLine->Add((CObject*)p2);
return dragLine;
Драконовая ломаная 12-го порядка.
Назад |
Начало урока |
Вверх |
Вперед
Содержание