![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Всем день добрый. Есть такая на вид несложная задача. Есть область памяти (прямоугольный массив), каждые три байта - RGB цвет. Нужно вывести на экран, но не в прямоугольном виде, а повернув на х градусов и сделать из него трапецию - один из краев сжать, другой растянуть в y раз.
Исходный массив формируется в online не мной, выводить нужно со скоростью 20 FPS приблизительно. Есть ли готовые способы в библиотеках для такого 2D преобразования? Всем заранее спасибо. В приложении - пример исходного и полученного изображения. Присоединённый файл ( Кол-во скачиваний: 12 )
1.rar |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Можно либо юзать Direct3D, OpenGL, либо же самому сделать рисование текстурированного треугольника (используя интерполяцию)...
Если что, могу накидать пример... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Огромное спасибо за могу накидать пример! Было бы здорово
http://www.k-trade.ua/k-trade/recovery.jsp - с его помощью винты восстанавливаем! Так что буду у вас, с меня причитается PS Теперь задача проще, но уж больно неохота еще и в DirectX влазить |
|||
|
||||
| p0s0l |
|
||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Src - битмап, который будет "вписан" в трапецию (текстура) CenterX, CenterY - координаты рисования трацеции (центр трапеции) Height - высота трапеции LoWidth, HiWidth - нижняя и верхняя ширина трапеции Angle - угол поворота в радианах Если что, могу показать, как это сделать через OpenGL или Direct3D - кода наверное будет меньше раза в 2-3, и красивее будет...
Присоединённый файл ( Кол-во скачиваний: 19 )
Trapeze.zip-------------------- С уважением, г-н Посол. |
||||||
|
|||||||
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Сглаживание однозначно не требуется - важно с минимальными искажениями передать текстуру, а она снята со сканера, который сканирует в виде этой самой трапеции, только потом уже в комп мне поступает прямоугольник.
Огромное спасибо, сижу-разбираюсь. Разберусь в этом - задам еще кучу вопросов |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
-------------------- С уважением, г-н Посол. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Блин, я щас вдруг понял, что сделал неправильно...
Сразу неподумал... Короче искажения должны быть видны при большой разнице между длинами верхней грани и нижней... Для "добивания" надо засунуть картинку, состоящую не из какого-то хаотического набора точек, а из ровных линий... Дело усугубляется еще тем, что я сделал рисование двумя неравными и несимметричными треугольниками... Это из-за того, что интерполяция - линейная... А похоже нужна нелинейная... Хрен знает какая... Тут даже D3D/OGL не спасёт - будет точно такая же ерунда... т.к. треугольники в плоскости рисуются по точно такому же принципу... а рисование полигонов всё равно сводится к рисованию треугольников... Можно уменьшить погрешности путём разбиения на большее число треугольников... Разбив на 4 треугольника, выглядит получше:
ДОБАВЛЕН ПОЗЖЕ Самый правильный способ - вначале нарисовать трапецию (не треугольниками!), а потом уже поворачивать... Если что, могу показать - в принципе, переделывается за 5-10 минут... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Спасибо за предыдущие ответы, поспрошаю еще. Давай сначала расскажу, зачем это нужно - тогда половину описания ЧТО нужно можно будет опустить.
Значит есть технологический УЗИ сканер, что он там сканирует - мне не понять У сканера свой "процессор" - жутко сложный и многоконвейерный (промышленный узкоспециализированный контроллер). Он выполнен в виде PCI-платы, в результате он формирует в оперативной памяти прямоугольный массив, где строка массива - линия от элемента сканирования до дальней точки в области сканирования. По спецификации длина строки - что-то около 8 тысяч пикселов, соответственно мы будем ограничены по точности разрешением экрана, а не сканера. Моя задача - восстановить сосканированную картинку и вывести на экран. Отсюда и сплющивание в трапецию. Конечно, если мы сможем выделять и увеличивать область на экране, это будет прекрасно, но пока не хочу усложнять себе жизнь. Из вышесказанного вытекает. 1. Похоже, без использований DX или OGl не обойтись - картинка-то 2048x1540 получится (там вопрос о цене монитора, как понимаешь, не стоит). 2. Хорошо бы иметь средства online-настройки "угла сплющивания" и области просмотра исходного массива. 3. То, что картинка получится "точнее" в верхней части (ближе к сканирующему элементу) - понятно и приемлемо - это обусловлено самим процессом - мы только выводим то, что снял сканер. Ну, в общем, сильно поможешь если подкинешь пример в таком разрезе - иллюстирующий общий принцип построения такого изображения средствами быстрого вывода (DirectX, DelphiX - самое оно, наверно). Было бы классно именно принцип, несложную модель - остальное правильней и удобней мне думать самому в применении к конкретной задаче. Спасибо за предыдущие уроки и заранее спасибо откликнувшимся. PS А, еще вопрос. То что изображение берется из памяти, мы просто знаем константу - базовый адрес массива в памяти - сильно меняет дело? Или будут проблемы, чтобы успевать переводить его в другой формат, который могут понять функции DirectX? |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Хм... Только я не понял вот что: картинка со сканера берется один раз, а потом её всяко ворочаем ? Или же она постоянно с него берется ? Конечно же, первое - проще в реализации.
Прямоугольник в трапецию превратить с помощью DirectX/OGL не получится (без искажений)... Но это и не особо плохо, если это первый случай... Преобразуем в трапецию ручками... Потом через Direct3D или OpenGL выводим - это очень просто... Сделать увеличение/уменьшение - это всё легко делается, через задание координат вершин и текст. координат...
--------- Потом еще раз перечитал твой пост и еще вопрос появился: раз он сканирует в виде конуса, то ... преобразование в трапецию - не совсем верное преобразование... Вот, накарябал на рисунке... Не помню как такая фигура называется, походит немного на трапецию, но основания - в види дуг... Чем дальше от сканирующего элемента находится просматриваемый нами участок, тем больше будет заметно искажение... Если уж юзать OGL, то можно сделать и такой вывод, без предварительного преобразования в трапецию... Просто разбить, например, на 1024 секторов и выводить - это будет быстро, и практически без искажений... Можно сделать в проге так: задаётся угол обзора сканера, а в зависимости от этого уже всё правильно выводится... Скажи, как надо правильно - трапецию или часть "колеса" Присоединённый файл ( Кол-во скачиваний: 7 )
scaner.gif-------------------- С уважением, г-н Посол. |
|||
|
||||
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Здарова всем снова.
Значит, так. 1. Со сканера, к сожалению, картинка берется в realtime - поэтому и спецконтроллер, и весь огород. Конечно, получается сектор круга, от которого нам нужна определенная, указанная оператором область. Наилучший вариант - пусть есть переменные: "начало" угла интересующей области (0 - 360 градусов), конец угла интересующей области (0 - 360 градусов), расстояние от сканирующего элемента до начала интересующей области (0 - 8000 pxl), расстояние от сканирующего элемента до конца интересующей области (0 - 8000 pxl), масштаб, координаты сканирующего элемента относительно центра экрана, угол реального сканирования (в произвольной форме). 2. Насчет того что изображение из памяти... Ну смотри, так есть Bitmap, с ним положим разобрались - это объект Object Pascal и все такое. А если есть базовый адрес в памяти - например FF00:0000, по которому лежит изображение еще и не совсем в формате RGB (то есть счас формат уточняется, скорее всего будет два байта, то бишь 16-bit текстура, без указания переходов на новую строку и т.д.) Как в функцию OGL "запихать" этот адрес - где его прописывать, поймет ли функция такой формат изображения? Ну вот, вроде так. Спасибо за отзывы. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Вообщем, дипломная запарка у меня была на этой неделе...
Так что с большим запозданием, но всё-таки пример накидал, если он всё еще нужен... Я оставил комментарии в тексте, поэтому объяснять не буду чего там и как... Только нужно обратить внимание на константы:
Тебе нужно будет переделать пример так, чтобы изображение бралось не из файла, а из памяти... В прочем, это делается просто Также надо будет посмотреть процедуру MakeTexture - сейчас она берет пикселы начиная с адреса SCANER_MEMORY в формате R5G6B5 (16 бит), и формирует текстуру (берется не всё изображение, а лишь нужный прямоугольник)... Сейчас просто берутся пикселы без всякого сглаживания... Если качество не будет устраивать, то тут придётся поработать, т.к. эта процедура - самая важная, она практически отвечает за FPS... Присоединённый файл ( Кол-во скачиваний: 7 )
cone.gif-------------------- С уважением, г-н Посол. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 16 Всего: 112 |
Вот исходник... Для его компиляции нужны некоторые модули и одна DLL-ка (можно обойтись без неё, просто неохота, надо написать функцию построения матрицу ортогональной проекции, матрицы поворта, смещения и масштабирования, а также умножения матриц)...
Их (модули и DLL) можно скачать тут: http://clootie.narod.ru/delphi/index.html Присоединённый файл ( Кол-во скачиваний: 11 )
D3Dsrc.ZIP-------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |