![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 28.05.2012
Сообщений: 54
|
![]()
Есть программа, рисующая фрактал на основе L-системы. Задана точка S - начало фрактала (точка, из которой программа начинает рисовать), нужно найти переместить точку S так, чтоб фрактал находился в центре экрана.
Первое, что пришло на ум: запомнить все точки фрактала и посчитать их среднее - C, затем полностью перерисовать фрактал из точки S = S - С. К сожалению, это замедляет программу в два раза. Нужен более оптимальный вариант. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Запоминать все точки - довольно накладно, да и не решает поставленной задачи: насколько я понимаю, в центре экрана нужно разместить геометрический центр фрактала, а не его центр тяжести.
Разница в том, что если, скажем, существенно больше половины точек будет смещено вправо, то там и будет центр тяжести, который будет находиться гораздо ближе к правой границе, чем к левой. А нам нужен тот центр, который отстоит от краев изображения на одинаковые расстояния как слева, так и справа. Т.е. при предварительном расчете нужно не вычислять среднее арифметическое, на находить границы - всего 4 числа: сверху, справа, снизу и слева. По поводу производительности - не понял. Если Вы сначала вычисляете координаты точек, запоминаете их, затем рисуете со смещением, то это не должно приводить к двукратному замедлению. Вот если Вы во второй проход вместо отрисовки запомненных заново их вычисляете, то тогда будет наблюдаться именно двукратный дефект производительности. |
![]() |
![]() |
![]() |
#3 | ||
Пользователь
Регистрация: 28.05.2012
Сообщений: 54
|
![]() Цитата:
Цитата:
Последний раз редактировалось alik98; 14.03.2013 в 17:09. |
||
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
В два раза не должно быть по любому.
Вы должны один раз вычислить положение точки и один раз ее нарисовать. Если Вы будете сначала вычислять, а потом рисовать, то это займет примерно столько же времени, что и синхронное вычисление и рисование. Значит, Вы что-то делаете не так. Вы сначала выясните, что у Вас занимает основное время: вычисление очередной точки или ее отрисовка. А по первому вопросу: Вы не знаете, как вычислить максимум или минимум массива чисел? |
![]() |
![]() |
![]() |
#5 | ||
Пользователь
Регистрация: 28.05.2012
Сообщений: 54
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#6 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,429
|
![]()
Конечно все зависит от фрактала, но можно сделать черновой просчет (для малого количества шагов) для расчета области, в которой находится фрактал. Затем пересчитать позицию точки S и провести построение с требуемым количеством шагов (точностью).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#7 | |
Пользователь
Регистрация: 28.05.2012
Сообщений: 54
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#8 | ||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Верю.
Но из Вашего вопроса следовало, что как будто не знаете. Цитата:
Но вопросы оптимизации алгоритма везде решаются примерно одними и теми же подходами. Цитата:
Оказывается, рисовать нужно не только точки, но и линии... До сих пор об этом ничего не было. Ну, если способ решения задачи остается в целом прежний, то могу предложить следующее: 1. На первом этапе имитируем работу, не вызывая никаких команд рисования/перемещения/изменения цвета. И запоминаем не точки, а отрезки. Притом, только те отрезки, когда было включено рисование. И здесь же находите границы рисунка - т.е. максимум и минимум по каждой из координат. 2. Вычисляете смещение (и, при необходимости, масштабный множитель) 3. На втором этапе только рисуете запомненные отрезки со смещением и масштабированием). |
||
![]() |
![]() |
![]() |
#9 | ||
Пользователь
Регистрация: 28.05.2012
Сообщений: 54
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 28.05.2012
Сообщений: 54
|
![]()
Хотя, если подумать, идея с отрезками не так плоха, если создать еще один массив с цветами отрезков. Можно еще попробовать создать массив точек и к каждой в отдельных массивах хранить цвет и переменную, означающую, может ли она быть окончанием другого отрезка, или же только его началом.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
В центре экрана нарисовать квадрат и выполнить его диагональную штриховку в виде двух треугольников, расположенных еа од | zzz6 | Помощь студентам | 1 | 06.07.2011 14:26 |
нарисовать круг по центру экрана | rUs_LAN | Win Api | 2 | 01.04.2010 21:27 |
Попал какой то вирус adsubscribe вылетает каждые 10 минут в центре экрана реклама | leonidka | Операционные системы общие вопросы | 8 | 16.07.2009 20:33 |