Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-1176729060
Still Swamp
2007-04-16 17:11
2007.10.21
Как отключить диск в системе.


2-1191009199
vasIZmax
2007-09-28 23:53
2007.10.21
Вот как можно ускорить программу?


15-1190295780
S@shka
2007-09-20 17:43
2007.10.21
Утилита досупа к MS SQL ?


8-1168236355
andr1962
2007-01-08 09:05
2007.10.21
Снежинка Коха


2-1190921326
Алик
2007-09-27 23:28
2007.10.21
Как правильно очищать буффер?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский