Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 789

/ вопрос решён /

Здравствуйте, эксперты!
Имеется программа на паскале, которая рисует снежинку Коха.
фрагмент кода
Очень нужно, чтобы эта снежинка рисовалась в Delphi.
Раньше не работала с графиками, поэтому даже не представляю как все это сделать.
Надеюсь на вас!

Lauren Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Lauren (статус: Посетитель)
Вопрос отправлен: 1 декабря 2011, 00:11
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: puporev

Здравствуйте, Lauren!
Если Вам все же нужна именно снежинка Коха, то я предлагаю такой вариант программы.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, Spin;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. SpinEdit1: TSpinEdit;
  12. Button1: TButton;
  13. procedure Button1Click(Sender: TObject);
  14. procedure FormCreate(Sender: TObject);
  15. private
  16. { Private declarations }
  17. public
  18. { Public declarations }
  19. end;
  20.  
  21. var
  22. Form1: TForm1;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27. //рекурсивная процедура рисования кривой Коха
  28. procedure koh(x1,y1,x2,y2,x3,y3,k:integer; Cn:TCanvas);
  29. var xxs,yys,xx1,yy1,xx2,yy2,xx3,yy3:integer;
  30. begin
  31. if k>0 then
  32. begin
  33. //средняя треть отрезка
  34. xx1:=round((2*x1+x2)/3);
  35. yy1:=round((2*y1+y2)/3);
  36. xx2:=round((2*x2+x1)/3);
  37. yy2:=round((2*y2+y1)/3);
  38. //стираем ее
  39. Cn.Pen.Color:=Form1.Color;
  40. Cn.Pen.Width:=3;
  41. Cn.MoveTo(xx1,yy1);
  42. Cn.LineTo(xx2,yy2);
  43.  
  44. xxs:=round((x1+x2)/2);
  45. yys:=round((y1+y2)/2);
  46. xx3:=abs(round((4*xxs-x3)/3));
  47. yy3:=abs(round((4*yys-y3)/3));
  48. //рисуем его
  49. Cn.Pen.Color:=clWhite;
  50. Cn.Pen.Width:=3;
  51. Cn.MoveTo(xx1,yy1);
  52. Cn.LineTo(xx3,yy3);
  53. Cn.LineTo(xx2,yy2);
  54. //рекурсивно вызываем процедуру нужное число раз
  55. koh(xx1,yy1,xx3,yy3,xx2,yy2,k-1,Cn);
  56. koh(xx3,yy3,xx2,yy2,xx1,yy1,k-1,Cn);
  57. koh(x1,y1,xx1,yy1,round((2*x1+x3)/3),round((2*y1+y3)/3),k-1,Cn);
  58. koh(x2,y2,xx2,yy2,round((2*x2+x3)/3),round((2*y2+y3)/3),k-1,Cn);
  59. end;
  60. end;
  61.  
  62. procedure TForm1.Button1Click(Sender: TObject);
  63. var n,xc,yc,x1,y1,x2,y2,x3,y3,a:integer;
  64. h:real;
  65. begin
  66. n:=SpinEdit1.Value;
  67. xc:=ClientWidth div 2; //центр формы
  68. yc:=ClientHeight div 2;
  69. a:=xc-50; //длина стороны исходного треугольника
  70. h:=a*sin(pi/3);//высота треугольника
  71. x1:=xc-a div 2; //определим координаты исходного треугольника
  72. y1:=yc+round(h/3);
  73. x2:=xc;
  74. y2:=yc-round(2*h/3);
  75. x3:=xc+a div 2;
  76. y3:=y1;
  77. //нарисуем три кривых Коха на сторонах треугольника
  78. with Canvas do
  79. begin
  80. Pen.Color:=clWhite;
  81. Moveto(x1,y1);
  82. LineTo(x2,y2);
  83. LineTo(x3,y3);
  84. LineTo(x1,y1);
  85. koh(x1,y1,x2,y2,x3,y3,n,Canvas);
  86. koh(x2,y2,x3,y3,x1,y1,n,Canvas);
  87. koh(x3,y3,x1,y1,x2,y2,n,Canvas);
  88. end;
  89. end;
  90.  
  91.  
  92. procedure TForm1.FormCreate(Sender: TObject);
  93. begin
  94. Form1.Color:=clBlue;
  95. Form1.Caption:=\'Снежинка Коха\';
  96. end;
  97.  
  98. end.


Ответ отправил: puporev (статус: 2-ой класс)
Время отправки: 1 декабря 2011, 07:12
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 1 декабря 2011, 21:31; участников в обсуждении: 2.
puporev

puporev (статус: 2-ой класс), 1 декабря 2011, 06:45 [#1]:

Вам нужно именно эту снежинку, которая не является снежинкой Коха
http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D0%9A%D0%BE%D1%85%D0%B0
Или все таки снежинку Коха?
puporev

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

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

Lauren (статус: Посетитель), 1 декабря 2011, 21:31 [#4]:

Спасибо огромное, вы очень помогли!

7 декабря 2011, 15:44: Статус вопроса изменён на решённый (изменил автор вопроса — Lauren)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.02 сек.