IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Фрактал, задача суть которой состоит в построение фрактала
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Михаил

Репутация: -  -1  +


Доброе время суток!
Итак, задача состоит в том, чтобы создать, а точнее воссоздать фрактал который есть в примере. Практически (пока на листе) сделал... Но есть один вопрос:
Каждая звезда строится за счет деления круга на сегменты, т.е. каждый 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 килобайт ) Кол-во скачиваний: 334
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Михаил

Репутация: -  -1  +


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

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

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

<^><^>

А вот)

Сообщение отредактировано: -=Считывающий=- -


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


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


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Михаил

Репутация: -  -1  +


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

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

исправил
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

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.


(форма есть, теперь дело за шлифованием...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Михаил

Репутация: -  -1  +


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

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

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

Сообщение отредактировано: -=Считывающий=- -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Михаил

Репутация: -  -1  +


просто задача состоит в том, чтобы каждая новая звезда крайней точкой своего луча совпадала с крайней точкой луча предыдущей звезды.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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);

Зачем же менять внутренний радиус? Он совсем за другое отвечает...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Михаил

Репутация: -  -1  +


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

Сообщение отредактировано: -=Считывающий=- -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






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

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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 31
Пол: Мужской
Реальное имя: Михаил

Репутация: -  -1  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 20:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name