Доброе время суток! Итак, задача состоит в том, чтобы создать, а точнее воссоздать фрактал который есть в примере. Практически (пока на листе) сделал... Но есть один вопрос: Каждая звезда строится за счет деления круга на сегменты, т.е. каждый 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
23.02.2007 21:12
Цитата
воссоздать фрактал который есть в примере
Пример - это EXE-файл? Sorry, удалено, мало ли что в этом файле находится, ЭТО противоречит правилам. Нужна помощь - нарисуй графически, как это должно выглядеть...
-=Считывающий=-
23.02.2007 21:22
Хм... нет, с рисованием у меня всегда были траблы....)) Попробую описать:
Звездочку с эмблемы мерседеса представляете? Ну вот. А теперь, на каждом конце этой звезды постройте звездочки с такими же пропорциями, но уже с 4 концами и размером меньше исходной... ну наверное на треть... и так далее: на каждом конце созданной звезды еще звезды с большим количеством концов.
Главное, что каждая новая звезда должна соприкасаться с предыдуще только самими крайними точками, т.е.
<^><^>
А вот)
Артемий
23.02.2007 21:51
А ещё больше мог прикрепить файл??? Сделай файл меньше!
-=Считывающий=-
23.02.2007 21:55
Цитата(Артемий2 @ 23.02.2007 17:51)
А ещё больше мог прикрепить файл??? Сделай файл меньше!
исправил
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))) );
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
Ну, так поправь ТОЛЬКО рекурсивный вызов... Сделай его таким, например:
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))) );
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 6:43
Что ты! Если честно я тебя просто считаю гением!! Я честно! А потому благодарен очень!!! Обычно если у меня возникают вопросы, которые являются более или менее стандартными, я всегда для начало твои топы листаю. Так что ОГРОМНОЕ спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.