Главная страница
    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.043 c
15-1190354682
vajo
2007-09-21 10:04
2007.10.21
Vista & XP


2-1191017226
SveTTT
2007-09-29 02:07
2007.10.21
как вернуть значение из TEdit в TEdit другой формы


2-1190895046
igo0or
2007-09-27 16:10
2007.10.21
FindFirstFile


8-1168288879
Jimmy
2007-01-08 23:41
2007.10.21
Аналог StretchBlt для TMetaCanvas


1-1186674079
Lexa11_2002
2007-08-09 19:41
2007.10.21
Как передать формулу в Excel.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский