Как можно быстро повернуть картинку на заданный угол?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arechemist
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 173
Зарегистрирован: 24.10.2003 (Пт) 8:45

Как можно быстро повернуть картинку на заданный угол?

Сообщение arechemist » 09.08.2004 (Пн) 19:41

Как можно быстро повернуть картинку на заданный угол?
Метот по пикселам через гет сет пиксель не предлогать!!!

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 10.08.2004 (Вт) 0:10

Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2004 (Вт) 7:45

Вот, когда-то специально писал с прицелом на скорость. Быстрее, чем Get\SetPixel, раза в три.
http://mix.web.ur.ru/v7.rar

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 10.08.2004 (Вт) 10:26


arechemist
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 173
Зарегистрирован: 24.10.2003 (Пт) 8:45

Сообщение arechemist » 10.08.2004 (Вт) 14:10

Гыыы. Все в любом случае елси поворачивать разом картинок 10 притормаживают... Да... реальную стратежку похоже написать на VB не удастся...
Неужели придется либо штамповать много-много картинок (ну одна на 10 градусов, др на 20 и тд) и по мере необходимости их вставлять...
Либо делать так.
Ну вот допустим стратежка. у каждого игрока по 10 юнитов (20 картинок) один пошел другово атоковать с тыла, ну у того и все юниты разом и решили развернуться и тут вылезает форточка
с прогресбаром "подождите... картинки юнитов поворачиваются"
Не ужеле все так плохо... Что делать? Изучать другой болеебыстрый язык...
Каким же образом создатели казаков смогли сделать так, что на карте могут находиться около 5-ти тыс юнитов и все нормально крутяться, вращаются да еще и успевают при етом думать куда бы им сходить?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.08.2004 (Вт) 14:34

Что, что...
DX юзать, что же ещё...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

arechemist
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 173
Зарегистрирован: 24.10.2003 (Пт) 8:45

Сообщение arechemist » 10.08.2004 (Вт) 14:48

По DX сколько инфы не смотрел ничего понять не смог... все у меня vb жалуется на объявления cамого DX'а. Что делать?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.08.2004 (Вт) 17:23

Project :arrow: References :arrow: DirectX 8.0 for Visual Basic Type Library
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

arechemist
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 173
Зарегистрирован: 24.10.2003 (Пт) 8:45

Сообщение arechemist » 10.08.2004 (Вт) 17:40

И что эта штука быстро работает? поверю на слово и попробую....

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.08.2004 (Вт) 17:57

Эту штуку пока ещё никто не переплюнул по скорости, доплюнуть бы хоть рядом...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 10.08.2004 (Вт) 22:42

GSerg, а как он, ну DX работает, что такой быстрый. Если бы там одна прорисовка была быстрой, так нет же! В принципе, прорисовать/ считать можно быстро и через GetDIBBits, SetDIBBits (toDevice).
Делал как-то свой "заменитель" DX (гораздо круче :D )
Там даже аналог z буфера был ... кривой. Так вот один только просчет
значений яркости в точках (по конфигурации объектов и источников освещения) занимал для 800 Х 600 порядка 0,5 - 1,5 сек. Это на один кадр и это без прорисовки (ну она то не особо тормозила).
Так как же в DX возможны такие скоростя? А?
Noname - это самый популярный брэнд.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 11.08.2004 (Ср) 4:20

Doctor Nestor писал(а):GSerg, а как он, ну DX работает, что такой быстрый.

По сути, если не говорить об использовании DirectX'ом аппаратных возможностей, в норме его скорости сопоставимы с грамотной работой через GDI... :) и связано это с тем, что GDI так же может юзать DirectX :)
Doctor Nestor писал(а):В принципе, прорисовать/ считать можно быстро и через GetDIBBits, SetDIBBits (toDevice).

Разделяю.
Делал как-то свой "заменитель" DX (гораздо круче :D )
Там даже аналог z буфера был ... кривой. Так вот один только просчет значений яркости в точках (по конфигурации объектов и источников освещения) занимал для 800 Х 600 порядка 0,5 - 1,5 сек. Это на один кадр и это без прорисовки (ну она то не особо тормозила).

Imo, медленно считала. Что за машина (проц)? Алгоритм (не обязательно весь, всего лишь арифметика и организация цикла, мне кажется, :) здесь порылась собака)?
С уважением, Approximator.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2004 (Ср) 9:16

Кстати, есть предложение выложить на сайте TLB для DirectX :)
А то недавно у меня машина переустанавливалась, а откуда я брал TLB уже не помню.
Lasciate ogni speranza, voi ch'entrate.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 11.08.2004 (Ср) 12:43

Approximator, считал яркость в каждой точке по закону Ламберта:
пропорцинальна косинусу углов между векторами нормали и направлением на "лампочку", обратно пропорциональна расстоянию до "лампы". Оптимизировал так, что при разбиении объекта на плоские поверхности (типа треангуляции), каждый раз косинус не пересчитывался, пока гуляю в пределах одной плоскости - это ускорило в 3 раза просчёт. Но вот расстояние каждый раз считаю в цикле (оно, вроде, не должно особо тормозить). Не додумал, как тут оптимизировать. Ещё возможно в z буфере тормоза. Довольно криво определялось, что должно прорисовываться, а именно, если на одном луче от камеры находятся несколько плоскостей, то я до каждой из них расстояние просчитывал и так определял, что рисовать, а, возможно, надо одним махом определять, что рисовать, а что нет. Хрен его знает. А вообще говоря, хоть и тормозило, но достаточно реально цвета передавались - ощущение трёхмерности было. :D Вот расписал так, что самому захотелось вернуться к этой работе. Давно её забросил, как раз из-за тормозов.
Noname - это самый популярный брэнд.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 11.08.2004 (Ср) 13:23

Насчет системы-тогда был 400 Cel/ 196 RAM / 16 Mb Riva TnT Vant(UZ)a
проверял на 2400 Cel / 256 RAM - тормозня всё равно. Хотя, думаю, ты прав - где-то в цикле накосячит - ну я тогда маленький был :D - буду копаться смотреть.
Noname - это самый популярный брэнд.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 12.08.2004 (Чт) 2:41

Сцена: 3D-панорама статической или произвольная динамическая?
Doctor Nestor писал(а):Approximator, считал яркость в каждой точке по закону Ламберта:
пропорцинальна косинусу углов между векторами нормали и направлением на "лампочку", обратно пропорциональна расстоянию до "лампы". Оптимизировал так, что при разбиении объекта на плоские поверхности (типа треангуляции), каждый раз косинус не пересчитывался, пока гуляю в пределах одной плоскости - это ускорило в 3 раза просчёт. Но вот расстояние каждый раз считаю в цикле (оно, вроде, не должно особо тормозить). Не додумал, как тут оптимизировать.

Всё зависит от ответа на первый вопрос. Но, в принципе, всегда все рассуждения можно свести к статической сцене, потому буду говорить о ней. На самом деле, тебе известен закон изменения яркости в плоскости (изменение угла между падающим "лучём света" и нормалью). Стало быть можно заранее сделать готовый примитив (соотвествующий битовый образ) и в процессе копировать из него какую-либо часть целиком :). То бишь, вообще нет необходимости работать с отдельным пикселем. С расстоянием то же самое, только сначала примитив копируешь в промежуточный буфер, там уменьшаешь яркость обратно пропорционально расстоянию опять для всей области целиком, и далее, как выше было сказано...
Вся штука в том, что можно выразить расстояние от "источника света" в цифирях RGB в примитиве и простыми логическими операциями работать целиком со всей "поверхностью". То бишь у тебя и останется всего-то обсчёт примитивов, при статичных сценах это вообще делается один раз. При динамических это можно делать одновременно с изменением положения объекта в виртуальном пространстве сцены... :) Пока, так и не понял, зачем нужна попиксельная работа. В крайнем случае, при очень быстро изменяющихся масштабных динамических сценах можно заранее подготовить наиболее вероятные примитивы "рельефа" и продумать законы их изменения... всё равно можно работать со всей областью целиком, минуя попиксельную тягомотину...
С уважением, Approximator.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 12.08.2004 (Чт) 10:42

Во первых: сцена динамическая.
Во вторых я не совсем понял про создание шаблонов примитивов. Как тут избавиться от попиксельной работы? Даже если известен закон изменения яркости, то придётся создавать этот битовый образ попиксельно. Или я чего-то не догоняю. Да, я понял, что их можно насоздавать при инициализации проги, а потом использовать как строительный хлам, но ведь не предусмотришь все варианты конфигураций света и объектов, особенно когда речь о динамических сценах. А вообще, попиксельная работа задумывалась мной для обхода треангуляции - то есть для работы с кривыми поверхностями сразу, без их разбиения, действительно, и там можно косинусы и расстояние считать. Объясни подробнее, если не сложно. Я, наверное, торможу.
Noname - это самый популярный брэнд.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 13.08.2004 (Пт) 4:30

Doctor Nestor писал(а):Во первых: сцена динамическая.
Во вторых я не совсем понял про создание шаблонов примитивов. Как тут избавиться от попиксельной работы? Даже если известен закон изменения яркости, то придётся создавать этот битовый образ попиксельно. Или я чего-то не догоняю. Да, я понял, что их можно насоздавать при инициализации проги, а потом использовать как строительный хлам,...

:) На самом деле, если заранее известен закон изменения чего-либо, то далее достаточно лишь обсчитывать координаты и размеры области откуда копировать (примитив может быть больше по размерам, чем сцена, которую рендеришь). Это всегда будет быстрее, могу доказать математически.
... но ведь не предусмотришь все варианты конфигураций света и объектов, особенно когда речь о динамических сценах.

Заблуждение. Дело в том, что количество вариантов изменений яркости, например, в строке изображения счётно. Даже если строка будет формироваться в два-четыере раза, то максимальное количество проходов у тебя будет 4*<количество строк>. Что также всегда меньше количества пикселей. Более того, часть изменений можно делать в два-четыре этапа (умножь предыдущую цифирь в двое или даже в четверо и всё равно число будет меньше нежели количество пикселей) с помощью логических операций между битовыми образами.
А вообще, попиксельная работа задумывалась мной для обхода треангуляции - то есть для работы с кривыми поверхностями сразу, без их разбиения, действительно, и там можно косинусы и расстояние считать. Объясни подробнее, если не сложно. Я, наверное, торможу.

Слишком подробно, увы, долго. Могу указать лишь направление. Затем кое-что уточнить.
Итак, теория.
Сначала "работа в плоскости". Зная закон изменения интенсивности в плоскости, делаешь примитив - буфер необходимых размеров, включающий в себя все встречающиеся измения (по сути, максимальный "раствор" угла зрения и угла "освещения"). Далее, просто обчитываешь координаты верхнего левого угла и размер области из примитива, требуемой для копирования. Согласись, уже не работа с одним пикселем.
"Работа с рельефом". На самом деле, в предыдущем случае тебе необходимо было взять самую близкую плоскость. Далее, при наличии рельефа её изменять с помощью другого примитива - заранее заготовленных профилей. Изменения ведутся построчно (наиболее удобный, на мой взгляд, способ). Максимум, что необходимо кроме логических операций между данными из различных примитивов - масштабирование. А это всё равно быстрее, чем работа попискельно.
Во вкратце и всё. Если не очень понятно - забудь. Если в общем понятно, но не понятно в деталях - задай вопрос.
С уважением, Approximator.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 13.08.2004 (Пт) 11:46

Основные вопросы:
Как создавать примитив, если не попиксельно?
Как я это понял. Исправь, если неправильно.
Есть некий "контейнер" примитивов, созданных когда-то один раз, из него производится
"построчное" копирование в сцену. Причем, если в строке есть N переходов с плоскости
на другую плоскость , то произходит N копирований из буфера примитивов, понятно, что
N меньше количества пикселей. Но:
- по поводу
количество вариантов изменений яркости, например, в строке изображения счётно

Конечно счетно в силу дискретности и конечности цвета пикселя, но оно же огромно...
Даже, если мы квантуем углы обзора и положения источника света, то количество
вариантов осветки строки умопомрачительно. Это всё я к тому, что я не понимаю, как
можно насоздавать примитивов на любой случай. А если источников света несколько?
Итак, основной вопрос:
Примитивы созданы заранее или из известной конфигурации сцены?
Возможно, здесь кроется моё непонимание.
Я так понимаю ответ может быть (ДА/НЕТ).
Если ДА(заранее), то как все варианты предусмотреть (много источников и т.п)
Если НЕТ (по известной сцене) - то это разве не попиксельная работа снова будет
при создании самого примитива. А в случае динамических сцен надо будет всё опять пересчитывать
и выигрыша нету.
Не знаю, не понял я "в ощем" или "в деталях", но точно не понял.
Если не посчитаешь вопросы слишком глупыми, ответь.
Noname - это самый популярный брэнд.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 13.08.2004 (Пт) 12:08

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

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 14.08.2004 (Сб) 4:28

Doctor Nestor писал(а):Переосмыслил твои слова. При известном положении камеры и источников освещения создать
примитивы для разных вариантов положений плоскостей в сцене и их как шаблоны использовать?
Ты об этом говорил или я опять не понял? В таком варианте, действительно, конфигураций не так уж много,
в некотором приближении.

В том числе и об этом.
количество вариантов изменений яркости, например, в строке изображения счётно
Конечно счетно в силу дискретности и конечности цвета пикселя, но оно же огромно...

Да? Мне кажется, что ты не пробовал подсчитывать. Колебвания "рельефа" равны бесконечности? Поверхности "отражающих объектов" совсем уж произвольны? :)
С уважением, Approximator.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 15.08.2004 (Вс) 0:05

Спасибо за советы. Думаю, в скором времени проверю на деле. Если чего получится, тебе первому сообщу :D
Noname - это самый популярный брэнд.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 15.08.2004 (Вс) 2:59

Doctor Nestor писал(а):Спасибо за советы. Думаю, в скором времени проверю на деле. Если чего получится, тебе первому сообщу :D

Помогу, чем смогу :)
С уважением, Approximator.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList