Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование с 2D графикой средствами чего? 
:(
    Опции темы
Ibragim
Дата 11.3.2005, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Всем день добрый. Есть такая на вид несложная задача. Есть область памяти (прямоугольный массив), каждые три байта - RGB цвет. Нужно вывести на экран, но не в прямоугольном виде, а повернув на х градусов и сделать из него трапецию - один из краев сжать, другой растянуть в y раз.
Исходный массив формируется в online не мной, выводить нужно со скоростью 20 FPS приблизительно. Есть ли готовые способы в библиотеках для такого 2D преобразования?

Всем заранее спасибо.

В приложении - пример исходного и полученного изображения.



Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  1.rar
PM MAIL   Вверх
p0s0l
Дата 12.3.2005, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Можно либо юзать Direct3D, OpenGL, либо же самому сделать рисование текстурированного треугольника (используя интерполяцию)...
Если что, могу накидать пример...



--------------------
С уважением, г-н Посол.
PM   Вверх
Ibragim
Дата 12.3.2005, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Огромное спасибо за могу накидать пример! Было бы здорово smile Если помнишь, я тебя не раз спрашивал по разделению времени и аппаратным прерываниям, как по ним событие сделать (для утилиты по ремонту винтов). Ты тогда здорово помог, продукт работает на
http://www.k-trade.ua/k-trade/recovery.jsp -
с его помощью винты восстанавливаем!
Так что буду у вас, с меня причитается smile

PS Теперь задача проще, но уж больно неохота еще и в DirectX влазить smile Если не в лом - кинь пример плз smile

PM MAIL   Вверх
p0s0l
Дата 14.3.2005, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Цитата
Огромное спасибо за могу накидать пример! Было бы здорово
Накидал... на скорую руку, поэтому текста вышло больше, чем я думал smile... И не совсем красиво - без сглаживания... но судя по рисунку, сглаживание и не требуется (или требуется ?)... Тестовая прога с процедурой DrawTrapeze присоединена к этому посту... При запуске проги в заголвке окна показывается время рисования в мс... Кратность GetTickCount составляет 10 мс, поэтому если пишется 0 (как у меня на компе) - значит рисуется меньше 10 мс - этого для 20 FPS хватит...
Код
procedure DrawTrapeze (Dst : TBitmap; CenterX, CenterY : integer;
                       Src : TBitmap; Height, LoWidth, HiWidth : integer; Angle : real);
Dst - битмап, на котором будет рисоваться
Src - битмап, который будет "вписан" в трапецию (текстура)
CenterX, CenterY - координаты рисования трацеции (центр трапеции)
Height - высота трапеции
LoWidth, HiWidth - нижняя и верхняя ширина трапеции
Angle - угол поворота в радианах

Если что, могу показать, как это сделать через OpenGL или Direct3D - кода наверное будет меньше раза в 2-3, и красивее будет...

Цитата
Так что буду у вас, с меня причитается
Мне достаточно знать то, что не зря помогаю smile... Хотя от пива не откажусь smile

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  Trapeze.zip


--------------------
С уважением, г-н Посол.
PM   Вверх
Ibragim
Дата 15.3.2005, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Сглаживание однозначно не требуется - важно с минимальными искажениями передать текстуру, а она снята со сканера, который сканирует в виде этой самой трапеции, только потом уже в комп мне поступает прямоугольник.
Огромное спасибо, сижу-разбираюсь. Разберусь в этом - задам еще кучу вопросов smile
PM MAIL   Вверх
p0s0l
Дата 15.3.2005, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Цитата(Ibragim @ 15.3.2005, 00:22)
важно с минимальными искажениями передать текстуру
Тогда возможно всё-таки лучше D3d или OGL, т.к. тут для скорости целочисленная арифметика... Искажения вносятся не только этим, но и тем, что при повороте/уменьшении часть пикселей не рисуется (им негде рисоваться)... Поэтому, имхо, нужно сглаживать...



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 15.3.2005, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Блин, я щас вдруг понял, что сделал неправильно...
Сразу неподумал... Короче искажения должны быть видны при большой разнице между длинами верхней грани и нижней... Для "добивания" надо засунуть картинку, состоящую не из какого-то хаотического набора точек, а из ровных линий...
Дело усугубляется еще тем, что я сделал рисование двумя неравными и несимметричными треугольниками...
Это из-за того, что интерполяция - линейная... А похоже нужна нелинейная... Хрен знает какая...
Тут даже D3D/OGL не спасёт - будет точно такая же ерунда... т.к. треугольники в плоскости рисуются по точно такому же принципу... а рисование полигонов всё равно сводится к рисованию треугольников...
Можно уменьшить погрешности путём разбиения на большее число треугольников... Разбив на 4 треугольника, выглядит получше:
Код

procedure DrawTrapeze (Dst : TBitmap; CenterX, CenterY : integer;
                       Src : TBitmap; Height, LoWidth, HiWidth : integer; Angle : real);
var
  Vertices : TTrapezeCoords;
  vc : TCoord;

begin
  CalcCoords (CenterX, CenterY, Height, LoWidth, HiWidth, Angle, Vertices);
  vc.X := CenterX; vc.Y := CenterY;
  vc.V := 0.5; vc.U := 0.5;
  DrawTriangle (Dst, Src, Vertices[0], Vertices[1], vc);
  DrawTriangle (Dst, Src, Vertices[1], Vertices[2], vc);
  DrawTriangle (Dst, Src, Vertices[2], Vertices[3], vc);
  DrawTriangle (Dst, Src, Vertices[3], Vertices[0], vc);
end;


ДОБАВЛЕН ПОЗЖЕ
Самый правильный способ - вначале нарисовать трапецию (не треугольниками!), а потом уже поворачивать... Если что, могу показать - в принципе, переделывается за 5-10 минут...



--------------------
С уважением, г-н Посол.
PM   Вверх
Ibragim
Дата 16.3.2005, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Спасибо за предыдущие ответы, поспрошаю еще. Давай сначала расскажу, зачем это нужно - тогда половину описания ЧТО нужно можно будет опустить.
Значит есть технологический УЗИ сканер, что он там сканирует - мне не понять smile. Но сканирует он область в виде конуса - в вершине конуса сканирующий элемент, соответственно. Нам из отсканированного нужна только одна плоскость, да и то не вся, а только трапеция - верхушка и низ не нужны.
У сканера свой "процессор" - жутко сложный и многоконвейерный (промышленный узкоспециализированный контроллер). Он выполнен в виде PCI-платы, в результате он формирует в оперативной памяти прямоугольный массив, где строка массива - линия от элемента сканирования до дальней точки в области сканирования. По спецификации длина строки - что-то около 8 тысяч пикселов, соответственно мы будем ограничены по точности разрешением экрана, а не сканера.
Моя задача - восстановить сосканированную картинку и вывести на экран. Отсюда и сплющивание в трапецию. Конечно, если мы сможем выделять и увеличивать область на экране, это будет прекрасно, но пока не хочу усложнять себе жизнь.

Из вышесказанного вытекает.
1. Похоже, без использований DX или OGl не обойтись - картинка-то 2048x1540 получится (там вопрос о цене монитора, как понимаешь, не стоит).
2. Хорошо бы иметь средства online-настройки "угла сплющивания" и области просмотра исходного массива.
3. То, что картинка получится "точнее" в верхней части (ближе к сканирующему элементу) - понятно и приемлемо - это обусловлено самим процессом - мы только выводим то, что снял сканер.

Ну, в общем, сильно поможешь если подкинешь пример в таком разрезе - иллюстирующий общий принцип построения такого изображения средствами быстрого вывода (DirectX, DelphiX - самое оно, наверно). Было бы классно именно принцип, несложную модель - остальное правильней и удобней мне думать самому в применении к конкретной задаче.
Спасибо за предыдущие уроки и заранее спасибо откликнувшимся.

PS А, еще вопрос. То что изображение берется из памяти, мы просто знаем константу - базовый адрес массива в памяти - сильно меняет дело? Или будут проблемы, чтобы успевать переводить его в другой формат, который могут понять функции DirectX?
PM MAIL   Вверх
p0s0l
Дата 17.3.2005, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Хм... Только я не понял вот что: картинка со сканера берется один раз, а потом её всяко ворочаем ? Или же она постоянно с него берется ? Конечно же, первое - проще в реализации.
Прямоугольник в трапецию превратить с помощью DirectX/OGL не получится (без искажений)... Но это и не особо плохо, если это первый случай... Преобразуем в трапецию ручками... Потом через Direct3D или OpenGL выводим - это очень просто...
Сделать увеличение/уменьшение - это всё легко делается, через задание координат вершин и текст. координат...

Цитата
PS А, еще вопрос. То что изображение берется из памяти, мы просто знаем константу - базовый адрес массива в памяти - сильно меняет дело? Или будут проблемы, чтобы успевать переводить его в другой формат, который могут понять функции DirectX?
Несколько раз вопрос читал, и почему-то не понял... На примере можно ?

---------
Потом еще раз перечитал твой пост и еще вопрос появился:
раз он сканирует в виде конуса, то ... преобразование в трапецию - не совсем верное преобразование... Вот, накарябал на рисунке... Не помню как такая фигура называется, походит немного на трапецию, но основания - в види дуг... Чем дальше от сканирующего элемента находится просматриваемый нами участок, тем больше будет заметно искажение... Если уж юзать OGL, то можно сделать и такой вывод, без предварительного преобразования в трапецию... Просто разбить, например, на 1024 секторов и выводить - это будет быстро, и практически без искажений... Можно сделать в проге так: задаётся угол обзора сканера, а в зависимости от этого уже всё правильно выводится...
Скажи, как надо правильно - трапецию или часть "колеса" smile ? Такой пример тебе и покажу...

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  scaner.gif


--------------------
С уважением, г-н Посол.
PM   Вверх
Ibragim
Дата 23.3.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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 "запихать" этот адрес - где его прописывать, поймет ли функция такой формат изображения?

Ну вот, вроде так. Спасибо за отзывы.
PM MAIL   Вверх
p0s0l
Дата 3.4.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Вообщем, дипломная запарка у меня была на этой неделе... smile
Так что с большим запозданием, но всё-таки пример накидал, если он всё еще нужен...
Я оставил комментарии в тексте, поэтому объяснять не буду чего там и как...
Только нужно обратить внимание на константы:
Код
const
  PICTURE_FILENAME     = 'G:\1.jpg'; // Имя картинки
  SECTORS_COUNT        = 256;  // Кол-во секторов, чем больше - тем качественнее конус
  TEXTURE_SIZE         = 1024; // Размер текстуры
Для теста задай имя файла, содержащий большую картинку (я тестил на 5000x4000).
Тебе нужно будет переделать пример так, чтобы изображение бралось не из файла, а из памяти...
В прочем, это делается просто smile, надо будет в переменной SCANER_MEMORY указать эту область, а процедуру GetPicture - убрать, только выставить нужные переменные...
Также надо будет посмотреть процедуру MakeTexture - сейчас она берет пикселы начиная с адреса SCANER_MEMORY в формате R5G6B5 (16 бит), и формирует текстуру (берется не всё изображение, а лишь нужный прямоугольник)... Сейчас просто берутся пикселы без всякого сглаживания... Если качество не будет устраивать, то тут придётся поработать, т.к. эта процедура - самая важная, она практически отвечает за FPS...

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  cone.gif


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 3.4.2005, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Вот исходник... Для его компиляции нужны некоторые модули и одна DLL-ка (можно обойтись без неё, просто неохота, надо написать функцию построения матрицу ортогональной проекции, матрицы поворта, смещения и масштабирования, а также умножения матриц)...
Их (модули и DLL) можно скачать тут: http://clootie.narod.ru/delphi/index.html

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  D3Dsrc.ZIP


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.