Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Фрактал

Автор: -=Считывающий=- 23.02.2007 20:58

Доброе время суток!
Итак, задача состоит в том, чтобы создать, а точнее воссоздать фрактал который есть в примере. Практически (пока на листе) сделал... Но есть один вопрос:
Каждая звезда строится за счет деления круга на сегменты, т.е. каждый X, Y задается уравнением:
x1:=x0+Trunc(R*Sin(i*2*Pi/n))
y1:=y0+Trunc(R*Cos(i*2*Pi/n))
Но вот вопрос, деление круга на сегменты происходит от самой нижней его точки...
Можно ли задавать эту нулевую точку, или нет?
Если нет, то как потом можно созданные координаты повернуть по или против чс на нужный угол...

p.s. Форум смотрел... Нашел похожую программу но для построение многоугольников... собственно ей и пользовался... а вот на счет поворота не совсем понял...

p.s.s. Выкладываю программу пример, и самую основу создания звезд (не судите строго)

EXE-файл удален...


Прикрепленные файлы
Прикрепленный файл  STARS.PAS ( 1.93 килобайт ) Кол-во скачиваний: 205

Автор: volvo 23.02.2007 21:12

Цитата
воссоздать фрактал который есть в примере
Пример - это EXE-файл? Sorry, удалено, мало ли что в этом файле находится, ЭТО противоречит правилам. Нужна помощь - нарисуй графически, как это должно выглядеть...

Автор: -=Считывающий=- 23.02.2007 21:22

Хм... нет, с рисованием у меня всегда были траблы....))
Попробую описать:

Звездочку с эмблемы мерседеса представляете? Ну вот. А теперь, на каждом конце этой звезды постройте звездочки с такими же пропорциями, но уже с 4 концами и размером меньше исходной... ну наверное на треть...
и так далее: на каждом конце созданной звезды еще звезды с большим количеством концов.

Главное, что каждая новая звезда должна соприкасаться с предыдуще только самими крайними точками, т.е.

<^><^>

А вот)


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Артемий2 23.02.2007 21:51

А ещё больше мог прикрепить файл??? norespect.gif blink.gif Сделай файл меньше!

Автор: -=Считывающий=- 23.02.2007 21:55

Цитата(Артемий2 @ 23.02.2007 17:51) *

А ещё больше мог прикрепить файл??? norespect.gif blink.gif Сделай файл меньше!

исправил

Автор: volvo 24.02.2007 4:32

Ну, начал бы я вот так:

uses graph;

var
grDriver, grMode, ErrCode: Integer;

function get_angle(x: integer): integer;
begin
if x < 0 then inc(x, 360);
get_angle := x;
end;

procedure drawstar(n: integer; cx, cy: integer;
size: integer; start_angle: integer);
var
i, every, angle: integer;
const
r = 15;

begin
if n < 5 then begin

putpixel(cx, cy, lightred);

every := 360 div n;
for i := 0 to pred(n) do begin

angle := i * every - start_angle;
if angle < 0 then inc(angle, 360);

line(
cx+trunc(r*sin(get_angle(angle-(360 div (2*n)))/(180/Pi))),
cy+trunc(r*cos(get_angle(angle-(360 div (2*n)))/(180/Pi))),
cx + trunc(size * sin(angle/(180/Pi))),
cy + trunc(size * cos(angle/(180/Pi)))
);
line(
cx+trunc(r*sin(get_angle(angle+(360 div (2*n)))/(180/Pi))),
cy+trunc(r*cos(get_angle(angle+(360 div (2*n)))/(180/Pi))),
cx + trunc(size * sin(angle/(180/Pi))),
cy + trunc(size * cos(angle/(180/Pi)))
);

drawstar(n+1, cx + trunc(size * sin(angle/(180/Pi))),
cy + trunc(size * cos(angle/(180/Pi))), size div 3, 360 - angle);
end;

end;

end;


var n: integer;
begin

grDriver := Detect;
InitGraph(grDriver, grMode, '');
ErrCode := GraphResult;

if ErrCode <> grOk then begin
Writeln('Graphics error:', GraphErrorMsg(ErrCode)); halt(100)
end;

n := 3;
drawstar(n, getmaxx div 2, getmaxy div 2, 200, 180);
readln;

end.


(форма есть, теперь дело за шлифованием...)

Автор: -=Считывающий=- 24.02.2007 4:46

Огромное спасибище!

Как доделаю закачаю.

volvo, а можно пару вопросов (не сочтите за наглость))):
1. где можно переназначить цент каждой последующей звезды
2. где изменить размер внутреннего радиуса понял, но при замене глючит...

Автор: volvo 24.02.2007 5:52

Положение центра последующих звезд зависит только от параметра Size... Что именно глючит при изменении внутреннего радиуса, и зачем вообще понадобилось его изменять?

Автор: -=Считывающий=- 24.02.2007 6:04

просто задача состоит в том, чтобы каждая новая звезда крайней точкой своего луча совпадала с крайней точкой луча предыдущей звезды.

Автор: volvo 24.02.2007 6:18

smile.gif Ну, так поправь ТОЛЬКО рекурсивный вызов... Сделай его таким, например:

      drawstar(n+1, cx + trunc((size+(size div 3)) * sin(angle/(180/Pi))),
cy + trunc((size+(size div 3)) * cos(angle/(180/Pi))),
size div 3, 360 - angle);

Зачем же менять внутренний радиус? Он совсем за другое отвечает...

Автор: -=Считывающий=- 24.02.2007 6:33

вот, с первым понял...
ааа))) а вот на счет внутреннего как раз надо) пропорции должны оставаться постоянными. иначе угол луча будет становиться тупым.

Автор: volvo 24.02.2007 6:38

Я не знаю, что там будет становиться чем - вот соблюдение пропорций:

uses graph;

var
grDriver, grMode, ErrCode: Integer;

function get_angle(x: integer): integer;
begin
if x < 0 then inc(x, 360);
get_angle := x;
end;

const
const_r = 50;

procedure drawstar(n: integer; cx, cy: integer;
size: integer; start_angle: integer);
var
i, every, angle: integer;
r: integer;

begin
if n < 6 then begin

r := const_r div n;
putpixel(cx, cy, lightred);

every := 360 div n;
for i := 0 to pred(n) do begin

angle := i * every - start_angle;
if angle < 0 then inc(angle, 360);

line(
cx+trunc(r*sin(get_angle(angle-(360 div (2*n)))/(180/Pi))),
cy+trunc(r*cos(get_angle(angle-(360 div (2*n)))/(180/Pi))),
cx + trunc(size * sin(angle/(180/Pi))),
cy + trunc(size * cos(angle/(180/Pi)))
);
line(
cx+trunc(r*sin(get_angle(angle+(360 div (2*n)))/(180/Pi))),
cy+trunc(r*cos(get_angle(angle+(360 div (2*n)))/(180/Pi))),
cx + trunc(size * sin(angle/(180/Pi))),
cy + trunc(size * cos(angle/(180/Pi)))
);

(*
drawstar(n+1, cx + trunc(size * sin(angle/(180/Pi))),
cy + trunc(size * cos(angle/(180/Pi))), size div 3, 360 - angle);
*)

drawstar(n+1, cx + trunc((size+(size div 3)) * sin(angle/(180/Pi))),
cy + trunc((size+(size div 3)) * cos(angle/(180/Pi))),
size div 3, get_angle(360 - angle + (n - 3) * 2 * every));

end;

end;

end;


var n: integer;
begin

grDriver := Detect;
InitGraph(grDriver, grMode, '');
ErrCode := GraphResult;

if ErrCode <> grOk then begin
Writeln('Graphics error:', GraphErrorMsg(ErrCode)); halt(100)
end;

n := 3;
drawstar(n, getmaxx div 2, getmaxy div 2, 200, 180);
readln;

end.
Работает, как видишь, без "тупых углов" и на третьем уровне рекурсии... Глубже ты просто ничего не разглядишь...

Дальше делай сам, тебе, как я погляжу, не угодишь... dry.gif

Автор: -=Считывающий=- 24.02.2007 6:43

Что ты! Если честно я тебя просто считаю гением!! Я честно! А потому благодарен очень!!! Обычно если у меня возникают вопросы, которые являются более или менее стандартными, я всегда для начало твои топы листаю. Так что ОГРОМНОЕ спасибо!