Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2013, 18:54   #1
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
Вопрос нарисовать фрактал в центре экрана

Есть программа, рисующая фрактал на основе L-системы. Задана точка S - начало фрактала (точка, из которой программа начинает рисовать), нужно найти переместить точку S так, чтоб фрактал находился в центре экрана.
Первое, что пришло на ум: запомнить все точки фрактала и посчитать их среднее - C, затем полностью перерисовать фрактал из точки S = S - С. К сожалению, это замедляет программу в два раза. Нужен более оптимальный вариант.
alik98 вне форума Ответить с цитированием
Старый 14.03.2013, 16:29   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

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

Т.е. при предварительном расчете нужно не вычислять среднее арифметическое, на находить границы - всего 4 числа: сверху, справа, снизу и слева.

По поводу производительности - не понял.
Если Вы сначала вычисляете координаты точек, запоминаете их, затем рисуете со смещением, то это не должно приводить к двукратному замедлению. Вот если Вы во второй проход вместо отрисовки запомненных заново их вычисляете, то тогда будет наблюдаться именно двукратный дефект производительности.
s-andriano вне форума Ответить с цитированием
Старый 14.03.2013, 17:01   #3
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
По умолчанию

Цитата:
находить границы - всего 4 числа: сверху, справа, снизу и слева.
Проблема в том, что я не знаю как это сделать. Только если опять же запомнить все точки, сравнить их и по новой создать фрактал из новой позиции. В данном случае программа будет работать опять два раза медленнее.

Цитата:
Если Вы сначала вычисляете координаты точек, запоминаете их, затем рисуете со смещением, то это не должно приводить к двукратному замедлению.
Это же L-система: тут ничего не вычисляется заранее. То есть, используется черепашья графика. Чтоб так сделать нужно полностью пройти метод создания фрактала запоминая точки, а затем повторить его со смещением стартовой позиции. Во всяком случае, я не вижу другого способа.

Последний раз редактировалось alik98; 14.03.2013 в 17:09.
alik98 вне форума Ответить с цитированием
Старый 14.03.2013, 18:36   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

В два раза не должно быть по любому.
Вы должны один раз вычислить положение точки и один раз ее нарисовать.
Если Вы будете сначала вычислять, а потом рисовать, то это займет примерно столько же времени, что и синхронное вычисление и рисование.
Значит, Вы что-то делаете не так.

Вы сначала выясните, что у Вас занимает основное время: вычисление очередной точки или ее отрисовка.

А по первому вопросу: Вы не знаете, как вычислить максимум или минимум массива чисел?
s-andriano вне форума Ответить с цитированием
Старый 14.03.2013, 19:15   #5
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
По умолчанию

Цитата:
А по первому вопросу: Вы не знаете, как вычислить максимум или минимум массива чисел?
Знаю. Проблема не в этом.

Цитата:
Если Вы будете сначала вычислять, а потом рисовать, то это займет примерно столько же времени, что и синхронное вычисление и рисование.
Повторюсь еще раз, это рисование L-системы. Сначала вычислять, а потом рисовать не выйдет, так как в L-системе присутствуют не только символы поворота и перемещения, там так же есть символы перемещения без рисования, изменения цвета, закидывания и вытягивания данных из стека и т.д.. Если проходя по системе я буду просто запоминать точки, затем смещу их к центру и выведу все их на экран, соединенные линией, то получится не то, что требуется.
alik98 вне форума Ответить с цитированием
Старый 14.03.2013, 19:24   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Конечно все зависит от фрактала, но можно сделать черновой просчет (для малого количества шагов) для расчета области, в которой находится фрактал. Затем пересчитать позицию точки S и провести построение с требуемым количеством шагов (точностью).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.03.2013, 19:45   #7
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
По умолчанию

Цитата:
Конечно все зависит от фрактала, но можно сделать черновой просчет (для малого количества шагов) для расчета области, в которой находится фрактал. Затем пересчитать позицию точки S и провести построение с требуемым количеством шагов (точностью).
Проблема в том, что я писал программу именно для создания тех фракталов, которые зачастую разрастаются в определенную сторону - например, растительных фракталов.
alik98 вне форума Ответить с цитированием
Старый 14.03.2013, 20:58   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от alik98 Посмотреть сообщение
Знаю. Проблема не в этом.
Верю.
Но из Вашего вопроса следовало, что как будто не знаете.
Цитата:
Повторюсь еще раз, это рисование L-системы.
Я не знаю, что такое L-система.
Но вопросы оптимизации алгоритма везде решаются примерно одними и теми же подходами.
Цитата:
Если проходя по системе я буду просто запоминать точки, затем смещу их к центру и выведу все их на экран, соединенные линией, то получится не то, что требуется.
Ах, так вот оно что!
Оказывается, рисовать нужно не только точки, но и линии...
До сих пор об этом ничего не было.
Ну, если способ решения задачи остается в целом прежний, то могу предложить следующее:
1. На первом этапе имитируем работу, не вызывая никаких команд рисования/перемещения/изменения цвета. И запоминаем не точки, а отрезки. Притом, только те отрезки, когда было включено рисование. И здесь же находите границы рисунка - т.е. максимум и минимум по каждой из координат.
2. Вычисляете смещение (и, при необходимости, масштабный множитель)
3. На втором этапе только рисуете запомненные отрезки со смещением и масштабированием).
s-andriano вне форума Ответить с цитированием
Старый 14.03.2013, 21:14   #9
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
По умолчанию

Цитата:
Ну, если способ решения задачи остается в целом прежний, то могу предложить следующее:
1. На первом этапе имитируем работу, не вызывая никаких команд рисования/перемещения/изменения цвета. И запоминаем не точки, а отрезки. Притом, только те отрезки, когда было включено рисование. И здесь же находите границы рисунка - т.е. максимум и минимум по каждой из координат.
2. Вычисляете смещение (и, при необходимости, масштабный множитель)
3. На втором этапе только рисуете запомненные отрезки со смещением и масштабированием).
Если я все правильно понял, то вряд ли это выйдет. Все равно 90% строки состоит из команд перемещения позиции , так что это мало чем отличается от прежнего предложения по производительности. Да еще и запоминание каждого отрезка по двум точкам (как я понял), вместо хранения каждой точки единожды в случае с фракталами значительно увеличит количество пожираемой памяти.

Цитата:
Я не знаю, что такое L-система.
Но вопросы оптимизации алгоритма везде решаются примерно одними и теми же подходами.
Но для начала нужно знать хотя бы в общих чертах как работает определенный алгоритм. Спасибо конечно, но или почитайте, или не тратьте силы зря.
alik98 вне форума Ответить с цитированием
Старый 14.03.2013, 21:18   #10
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
По умолчанию

Хотя, если подумать, идея с отрезками не так плоха, если создать еще один массив с цветами отрезков. Можно еще попробовать создать массив точек и к каждой в отдельных массивах хранить цвет и переменную, означающую, может ли она быть окончанием другого отрезка, или же только его началом.
alik98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В центре экрана нарисовать квадрат и выполнить его диагональную штриховку в виде двух треугольников, расположенных еа од 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