Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.21;
Скачать: CL | DM;

Вниз

Снежинка Коха   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
2-1190800205
max-wo
2007-09-26 13:50
2007.10.21
TStrings - TStringList


2-1191129184
SveTTT
2007-09-30 09:13
2007.10.21
стирание последнего символа


2-1191036769
Arkadiy
2007-09-29 07:32
2007.10.21
числа в строковом поле


2-1190726011
Yurikon
2007-09-25 17:13
2007.10.21
Вопрос по RecNO


1-1186491223
Kolan
2007-08-07 16:53
2007.10.21
Как сделать TabEnabled у PageControl а?