Помощь - Поиск - Пользователи - Календарь
Полная версия: Фрактал
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-=Считывающий=-
Доброе время суток!
Итак, задача состоит в том, чтобы создать, а точнее воссоздать фрактал который есть в примере. Практически (пока на листе) сделал... Но есть один вопрос:
Каждая звезда строится за счет деления круга на сегменты, т.е. каждый 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-файл удален...
volvo
Цитата
воссоздать фрактал который есть в примере
Пример - это EXE-файл? Sorry, удалено, мало ли что в этом файле находится, ЭТО противоречит правилам. Нужна помощь - нарисуй графически, как это должно выглядеть...
-=Считывающий=-
Хм... нет, с рисованием у меня всегда были траблы....))
Попробую описать:

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

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

<^><^>

А вот)
Артемий
А ещё больше мог прикрепить файл??? norespect.gif blink.gif Сделай файл меньше!
-=Считывающий=-
Цитата(Артемий2 @ 23.02.2007 17:51) *

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

исправил
volvo
Ну, начал бы я вот так:

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.


(форма есть, теперь дело за шлифованием...)
-=Считывающий=-
Огромное спасибище!

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

volvo, а можно пару вопросов (не сочтите за наглость))):
1. где можно переназначить цент каждой последующей звезды
2. где изменить размер внутреннего радиуса понял, но при замене глючит...
volvo
Положение центра последующих звезд зависит только от параметра Size... Что именно глючит при изменении внутреннего радиуса, и зачем вообще понадобилось его изменять?
-=Считывающий=-
просто задача состоит в том, чтобы каждая новая звезда крайней точкой своего луча совпадала с крайней точкой луча предыдущей звезды.
volvo
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);

Зачем же менять внутренний радиус? Он совсем за другое отвечает...
-=Считывающий=-
вот, с первым понял...
ааа))) а вот на счет внутреннего как раз надо) пропорции должны оставаться постоянными. иначе угол луча будет становиться тупым.
volvo
Я не знаю, что там будет становиться чем - вот соблюдение пропорций:

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
-=Считывающий=-
Что ты! Если честно я тебя просто считаю гением!! Я честно! А потому благодарен очень!!! Обычно если у меня возникают вопросы, которые являются более или менее стандартными, я всегда для начало твои топы листаю. Так что ОГРОМНОЕ спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.