|
Вопрос # 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;
- 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, 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|