| 
| 
 | Вопрос # 5 789/ вопрос решён / | 
 |  Здравствуйте, эксперты!Имеется программа на паскале, которая рисует снежинку Коха.
 фрагмент кода
 Очень нужно, чтобы эта снежинка рисовалась в Delphi.
 Раньше не работала с графиками, поэтому даже не представляю как все это сделать.
 Надеюсь на вас!
 
|  |   Вопрос задала: Lauren (статус: Посетитель)Вопрос отправлен: 1 декабря 2011, 00:11
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: puporev Здравствуйте, Lauren!Если Вам все же нужна именно снежинка Коха, то я предлагаю такой вариант программы.
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Spin; type  TForm1 = class(TForm)    SpinEdit1: TSpinEdit;    Button1: TButton;    procedure Button1Click(Sender: TObject);    procedure FormCreate(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm}//рекурсивная процедура рисования РєСЂРёРІРѕР№ РљРѕС…Р°procedure koh(x1,y1,x2,y2,x3,y3,k:integer; Cn:TCanvas);var xxs,yys,xx1,yy1,xx2,yy2,xx3,yy3:integer;begin if k>0 then begin //средняя треть отрезка xx1:=round((2*x1+x2)/3); yy1:=round((2*y1+y2)/3); xx2:=round((2*x2+x1)/3); yy2:=round((2*y2+y1)/3); //стираем ее Cn.Pen.Color:=Form1.Color; Cn.Pen.Width:=3; Cn.MoveTo(xx1,yy1); Cn.LineTo(xx2,yy2);  xxs:=round((x1+x2)/2); yys:=round((y1+y2)/2); xx3:=abs(round((4*xxs-x3)/3)); yy3:=abs(round((4*yys-y3)/3)); //рисуем его Cn.Pen.Color:=clWhite; Cn.Pen.Width:=3; Cn.MoveTo(xx1,yy1); Cn.LineTo(xx3,yy3); Cn.LineTo(xx2,yy2); //рекурсивно вызываем процедуру РЅСѓР¶РЅРѕРµ число раз koh(xx1,yy1,xx3,yy3,xx2,yy2,k-1,Cn); koh(xx3,yy3,xx2,yy2,xx1,yy1,k-1,Cn); koh(x1,y1,xx1,yy1,round((2*x1+x3)/3),round((2*y1+y3)/3),k-1,Cn); koh(x2,y2,xx2,yy2,round((2*x2+x3)/3),round((2*y2+y3)/3),k-1,Cn); end;end; procedure TForm1.Button1Click(Sender: TObject);var n,xc,yc,x1,y1,x2,y2,x3,y3,a:integer;    h:real;beginn:=SpinEdit1.Value;xc:=ClientWidth div 2; //центр формыyc:=ClientHeight div 2;a:=xc-50; //длина стороны РёСЃС…РѕРґРЅРѕРіРѕ треугольникаh:=a*sin(pi/3);//высота треугольникаx1:=xc-a div 2; //определим координаты РёСЃС…РѕРґРЅРѕРіРѕ
треугольникаy1:=yc+round(h/3);x2:=xc;y2:=yc-round(2*h/3);x3:=xc+a div 2;y3:=y1;//нарисуем три кривых РљРѕС…Р° РЅР° сторонах треугольникаwith Canvas do begin  Pen.Color:=clWhite;  Moveto(x1,y1);  LineTo(x2,y2);  LineTo(x3,y3);  LineTo(x1,y1);  koh(x1,y1,x2,y2,x3,y3,n,Canvas);  koh(x2,y2,x3,y3,x1,y1,n,Canvas);  koh(x3,y3,x1,y1,x2,y2,n,Canvas); end;end;  procedure TForm1.FormCreate(Sender: TObject);beginForm1.Color:=clBlue;Form1.Caption:=\'Снежинка РљРѕС…Р°\';end; end.
|  | Ответ отправил: puporev (статус: 2-ой класс)Время отправки: 1 декабря 2011, 07:12
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 1 декабря 2011, 21:31; участников в обсуждении: 2. 
|   | puporev (статус: 2-ой класс), 1 декабря 2011, 07:15 [#2]:Не знаю как у кого, у меня весь русский текст моего ответа написан иероглифами, поэтому продублирую. 
 Здравствуйте, Lauren!
 Если Вам все же нужна именно снежинка Коха, то я предлагаю такой вариант программы.
 
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Spin;
 
 type
 TForm1 = class(TForm)
 SpinEdit1: TSpinEdit;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 //рекурсивная процедура рисования кривой Коха
 procedure koh(x1,y1,x2,y2,x3,y3,k:integer; Cn:TCanvas);
 var xxs,yys,xx1,yy1,xx2,yy2,xx3,yy3:integer;
 begin
 if k>0 then
 begin
 //средняя треть отрезка
 xx1:=round((2*x1+x2)/3);
 yy1:=round((2*y1+y2)/3);
 xx2:=round((2*x2+x1)/3);
 yy2:=round((2*y2+y1)/3);
 //стираем ее
 Cn.Pen.Color:=Form1.Color;
 Cn.Pen.Width:=3;
 Cn.MoveTo(xx1,yy1);
 Cn.LineTo(xx2,yy2);
 //координаты вершины угла
 xxs:=round((x1+x2)/2);
 yys:=round((y1+y2)/2);
 xx3:=abs(round((4*xxs-x3)/3));
 yy3:=abs(round((4*yys-y3)/3));
 //рисуем его
 Cn.Pen.Color:=clWhite;
 Cn.Pen.Width:=3;
 Cn.MoveTo(xx1,yy1);
 Cn.LineTo(xx3,yy3);
 Cn.LineTo(xx2,yy2);
 //рекурсивно вызываем процедуру нужное число раз
 koh(xx1,yy1,xx3,yy3,xx2,yy2,k-1,Cn);
 koh(xx3,yy3,xx2,yy2,xx1,yy1,k-1,Cn);
 koh(x1,y1,xx1,yy1,round((2*x1+x3)/3),round((2*y1+y3)/3),k-1,Cn);
 koh(x2,y2,xx2,yy2,round((2*x2+x3)/3),round((2*y2+y3)/3),k-1,Cn);
 end;
 end;
 
 procedure TForm1.Button1Click(Sender: TObject);
 var n,xc,yc,x1,y1,x2,y2,x3,y3,a:integer;
 h:real;
 begin
 n:=SpinEdit1.Value;
 xc:=ClientWidth div 2; //центр формы
 yc:=ClientHeight div 2;
 a:=xc-50; //длина стороны исходного треугольника
 h:=a*sin(pi/3);//высота треугольника
 x1:=xc-a div 2; //определим координаты исходного треугольника
 y1:=yc+round(h/3);
 x2:=xc;
 y2:=yc-round(2*h/3);
 x3:=xc+a div 2;
 y3:=y1;
 //нарисуем три кривых Коха на сторонах треугольника
 with Canvas do
 begin
 Pen.Color:=clWhite;
 Moveto(x1,y1);
 LineTo(x2,y2);
 LineTo(x3,y3);
 LineTo(x1,y1);
 koh(x1,y1,x2,y2,x3,y3,n,Canvas);
 koh(x2,y2,x3,y3,x1,y1,n,Canvas);
 koh(x3,y3,x1,y1,x2,y2,n,Canvas);
 end;
 end;
 
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 Form1.Color:=clBlue;
 Form1.Caption:='Снежинка Коха';
 end;
 
 end.
 |  
|   | puporev (статус: 2-ой класс), 1 декабря 2011, 09:29 [#3]:Можете прочитать это. http://www.scribd.com/doc/3145393/%D0%A4%D1%80%D0%B0%D0%BA%D1%82%D0%B0%D0%BB%D1%8B
 Там описано как строить простые фракталы и рисовать их в Делфи, есть там и готовый код Вашей снежинки.
 
 Вот пример обычной 6-лучевой снежинки.
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Spin;
 
 type
 TForm1 = class(TForm)
 SpinEdit1: TSpinEdit;
 Button1: TButton;
 Label1: TLabel;
 procedure Button1Click(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 const k=6;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 //рекурсивная процедура рисования снежинки
 //параметры центр снежинки, радиус, глубина рекурсии
 procedure snow(x0,y0,r,n:integer;Cn:TCanvas);
 var i,x,y:integer;
 begin
 if n=0 then exit;//условие выхода из рекурсии
 for i:=1 to k do //по количеству лучей
 begin
 x:=x0+round(r*cos(2*pi*(i-1)/k)); //координаты концов лучей
 y:=y0+round(r*sin(2*pi*(i-1)/k));
 with Cn do  //рисуем лучи
 begin
 Pen.Color:=clWhite;
 MoveTo(x0,y0);
 LineTo(x,y);
 end;
 snow(x,y,r div 3,n-1,Cn); //рекурсивно повторяем, уменьшая радиус
 end;
 end;
 
 
 procedure TForm1.Button1Click(Sender: TObject);
 var n,x,y,r:integer;
 begin
 n:=SpinEdit1.Value;
 x:=ClientWidth div 2; //центр формы
 y:=ClientHeight div 2;
 r:=y div 2; //начальный рвдиус
 snow(x,y,r,n,Canvas);
 end;
 
 //заготовка формы
 procedure TForm1.FormCreate(Sender: TObject);
 begin
 ClientWidth:=600;
 ClientHeight:=500;
 Color:=clBlue;
 Caption:='Снежинка';
 Button1.Top:=ClientHeight-40;
 SpinEdit1.Top:=ClientHeight-30;
 Label1.Top:=ClientHeight-50;
 Label1.Color:=clWhite;
 end;
 
 end.
 |  
|   | Lauren (статус: Посетитель), 1 декабря 2011, 21:31 [#4]:Спасибо огромное, вы очень помогли! |  7 декабря 2011, 15:44: Статус вопроса изменён на решённый (изменил автор вопроса — Lauren) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |