Форум: "Media";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизСнежинка Коха Найти похожие ветки
← →
andr1962 © (2007-01-08 09:05) [0]Добрый день! Пытаюсь построить снежинку Коха но вместо нее рисуются линии а не снежинка. Вод код если кто найдет ошибку заранее спасибо с уважением Андрей
procedure DRaw(x,y,l,u:real;t:integer); forward;
procedure draw(x,y,l,u:real;t:integer);
procedure draw2(var x,y:real;u,l:real;t:integer);
begin
draw(x,y,l,u,t);
x:=x+l*cos(u);
y:=y-l*sin(u);
end;
begin
if t>0 then begin
l:=l/3;
draw2(x,u,l,u,t-1);
draw2(x,u,l,u+pi/3,t-1);
draw2(x,u,l,u-pi/3,t-1);
draw2(x,u,l,u,t-1);
end
else
kox1.imWork.Canvas.polyline([point(round(x),round(y)),point(round(x+cos(u)*l),round(y-sin(u)*l))]);
end;
//imWork- канва на которой происходит рисование , kox1- имя формы ))
ну и построение
procedure TKox1.FormActivate(Sender: TObject);
begin
draw(410,10,400,-pi,4);
draw(10,410,400,0,4);
draw(10,10,400,-pi/2,4);
draw(410,410,400,pi/2,4);
end;
← →
Virgo_Style © (2007-01-08 13:00) [1]Не, ну я, конечно, понимаю, что всякий образованный человек должен знать, как рисуется снежинка Коха, и мне, конечно, жутко стыдно от своей дремучести...
Но не стоило бы все же привести и алгоритм?
← →
vrem (2007-01-08 13:06) [2]У Коха же палочка?
← →
antonn © (2007-01-08 13:28) [3]
> У Коха же палочка?
ансамбль палочек Коха - фигура "снежинка" :)
← →
andr1962 © (2007-01-08 13:50) [4]Граница снежинки, придуманной Гельгом фон Кохом в 1904 году (рис.2.2.1), описывается кривой, составленной их трех одинаковых фракталов размерности d ~ 1,2618. Каждая треть снежинки строится итеративно, начиная с одной из сторон равностороннего треугольника. Пусть Ko --- начальный отрезок. Уберем среднюю треть и добавим два новых отрезка такой же длины, как показано на рис. 2.2.2. Назовем полученное множество K1 . Повторим данную процедуру многократно, на каждом шаге заменяя среднюю треть двумя новыми отрезками. Обозначим через Kn фигуру, полученную после n-го шага.
Интуитивно ясно, что последовательность кривых Kn при n стремящемся к бесконечности сходится к некоторой предельной кривой К. Рассмотрим некоторые свойства этой кривой.
Если взять копию К, уменьшенную в три раза (r = 1/3), То всё множество К можно составить из N = 4 таких копий. Следовательно, отношение самоподобия (2.1) выполняется при указанных N и r, а размерность фрактала будет:
d = log(4)/log(3) ~ 1,2618
Еще одно важное свойство, которым обладает граница снежинки Коха --- ее бесконечная длина. Это может показаться удивительным, потому что мы привыкли иметь дело с кривыми из курса математического анализа. Обычно гладкие или хотя бы кусочно-гладкие кривые всегда имеют конечную длину (в чем можно убедиться интегрированием). Мандельброт в этой связи опубликовал ряд увлекательных работ, в которых исследуется вопрос об измерении длины береговой линии Великобритании. В качестве модели он
использовал фрактальную кривую, напоминающую границу снежинки за тем исключением, что в нее введен элемент случайности, учитывающий случайность в природе. В результате оказалось, что кривая, описывающая береговую линию, имеет бесконечную длину.
← →
Vovan #2 (2007-01-08 16:52) [5]Всё давно сделано.
http://www.efg2.com/Lab/FractalsAndChaos/vonKochCurve.htm
А фрактал Минского не нужен, а то недавно делал?
← →
Vovan #2 (2007-01-08 17:17) [6]Вижу ошибку:
draw2(x,u,l,u,t-1);
draw2(x,u,l,u+pi/3,t-1);
draw2(x,u,l,u-pi/3,t-1);
draw2(x,u,l,u,t-1);
← →
Vovan #2 (2007-01-08 17:24) [7]Так, всё ясно. Тебя подвела косвенность рекурсии...
В Draw2 ты вызываешь Draw и продвигаешь координаты x и y по прямой. Но ведь Draw их же использует! Она тоже будет продвигать эти координаты.
← →
Vovan #2 (2007-01-08 17:49) [8]Ну а вот исправленный пример:
procedure TformKox.Draw(x, y, L, u: Real; t: Integer);
begin
if t > 0 then
begin
L := L / 3;
Draw(x, y, L, u, t-1);
x := x + L * cos(u);
y := y - L * sin(u);
Draw(x, y, L, u + pi/3, t-1);
Draw(x + L * cos(u + pi/3), y - L * (sin(u + pi/3)), L, (u - pi/3), t-1);
x := x + L * cos(u);
y := y - L * sin(u);
Draw(x, y, L, u, t-1);
end
else
begin
Canvas.MoveTo(Round(x), Round(y));
Canvas.LineTo(Round(x + Cos(u) * L), Round(y - Sin(u) * L));
end;
end;
procedure TformKox.FormPaint(Sender: TObject);
begin
Draw(410, 10, 400, -pi, 4);
Draw(10, 410, 400, 0, 4);
Draw(10, 410, 400, -pi/2, 4);
Draw(410, 410, 400, pi/2, 4);
end;
Рассказываю. Помимо путаницы с координатами, там были другие ошибки. Например, ты рисовал четвёртую линию начиная не с тех координат! Тебе нужно было пройти 2/3 линии, а ты прошёл 3/3 линии - ведь когда ты начинаешь рисовать четвёртую линию, Draw2 была вызвана уже 3 раза, а не 2. Потом у тебя была проблема с третьей линией. Ты хотел попасть в координату 2/3 линии и вращать в другую сторону. Но вращал не на тот угол (надо было на диаметрально противоположный, т.е. добавить +pi, а ты просто прибавил отрицательный угол). И это, кстати, неправильный подход. В таком случае треугольник на этой линии глядел бы внутрь! Надо было находить координаты вершины треугольника и оттуда брать линию.
← →
vrem (2007-01-08 19:28) [9]------|
|
|
------|
|
|
|
[8] Vovan #2 (08.01.07 17:49)
Вот так рисуется, левая сторона вниз уходит
← →
vrem (2007-01-08 19:32) [10]Предлагаю в третьем draw:
procedure TformKox.FormPaint(Sender: TObject);
begin
Draw(410, 10, 400, -pi, 4);
Draw(10, 410, 400, 0, 4);
Draw(10, 10, 400, -pi/2, 4);
Draw(410, 410, 400, pi/2, 4);
end;
← →
andr1962 © (2007-01-08 20:25) [11]Большое спасибо за помощь Разобрался
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c