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

Глава 4

Кривая Коха

Исходники и exe-файл программы находятся ЗДЕСЬ

Для того, чтобы построить кривую Коха, необходимо научиться чертить приведенную на рис 4.6 фигуру, для любых данных точек (X1, Y1) и (X2, Y2).

Подсказка

Точки (Xa, Ya)(Xb, Yb) и (Xc, Yc) определяются по формулам:

alpha = atan2(Y2-Y1, X2-X1);
R = sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1));

Xa = X1 + R*cos(alpha)/3

Xc = Xa + R*cos(alpha - M_PI/3)/3

Xb = X1 + 2*R*cos(alpha)/3

На псевдокоде алгоритм построения кривой Коха порядка .. на отрезке (X1,Y1,X2,Y2) выглядит следующим образом:

ЕСЛИ order = 0, просто построить отрезок (X1,Y1,X2,Y2)
ИНАЧЕ
построить кривую Коха порядка order - 1 на отрезке (X1,Y1,Xa,Ya)
построить кривую Коха порядка order - 1 на отрезке (Xa,Ya,Xc,Yc)
построить кривую Коха порядка order - 1 на отрезке (Xc,Yc,Xb,Yb)
построить кривую Коха порядка order - 1 на отрезке (Xb,Yb,X2,Y2)

Соответствующий код на С++ абсолютно прямолинеен:


void Koch(CPaintDC* pdc1, int order, int X1, int Y1, int X2, int Y2) {
if(order == 0) {
pdc1->MoveTo(X1,Y1);
pdc1->LineTo(X2,Y2);

}
else {
double alpha = atan2(Y2-Y1, X2-X1);
double R = sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1));

double Xa = X1 + R*cos(alpha)/3,
Ya = Y1 + R*sin(alpha)/3;

double Xc = Xa + R*cos(alpha - M_PI/3)/3,
Yc = Ya + R*sin(alpha - M_PI/3)/3;

double Xb = X1 + 2*R*cos(alpha)/3,
Yb = Y1 + 2*R*sin(alpha)/3;

int Xa1 = (int)Xa;
int Ya1 = (int)Ya;

int Xc1 = (int)Xc;
int Yc1 = (int)Yc;

int Xb1 = (int)Xb;
int Yb1 = (int)Yb;

Koch(pdc1,order - 1, X1, Y1, Xa1, Ya1);
Koch(pdc1,order - 1, Xa1, Ya1, Xc1, Yc1);
Koch(pdc1,order - 1, Xc1, Yc1, Xb1, Yb1);
Koch(pdc1,order - 1, Xb1, Yb1, X2, Y2);

}
}

Построить кривую N-го порядка теперь можно с помощью вызова функции:

Koch(pdc, 4, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);

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

Подсказка

Кривая Коха четвертого порядка.


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

Hosted by uCoz