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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2015, 17:56   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Поворот изображения. Примитивный код.

Всем О'хайо. Сижу тут в отпуске, делать нече, Барыкина слушаю.
Наткнулся на задачку про вращение изображения на любой угол.
Начал вспоминать самый примитивный способ пересчета полярных координат пикселей, и запнулся на одной ерунде, и никак не вьеду где ошибка.

Есть такой код:
Код:
procedure TForm1.FormPaint(Sender: TObject);
var
   CanvasCenterX,CanvasCenterY,
   ImageCenterX,ImageCenterY,
   NewPointX,NewPointY,
   AngleNew,AngleOrigin,Radius
   :Double;
   xImagePoint,yImagePoint,JpegWidth,JpegHeight:Integer;
   PointColor:TColor;
begin
 //Указывается угол поворота, и его пересчет в радианы
 AngleNew:=45;  AngleNew:=3.1415/180*AngleNew;
 //Расчитывается центр канвы, куда идет рисование
 CanvasCenterX:=Width/2; CanvasCenterY:=Height/2;
 //Размеры картинки
 JpegWidth:=jpg.Width;  JpegHeight:=jpg.Height;
 //Ее центр
 ImageCenterX:=JpegWidth/2; ImageCenterY:=JpegHeight/2;

 //Проход циклом по картинке
 for yImagePoint:=0 to JpegHeight-1 do begin
   for xImagePoint:=0 to JpegWidth-1 do begin

     //Расчет радиуса от центра картинки до пикселя
     Radius:=Sqrt(Sqr(ImageCenterX-xImagePoint)+Sqr(ImageCenterY-yImagePoint));
     //Расчет угла, под которым этот пиксель расположен в картинке
     if Radius<>0 then AngleOrigin:=arcsin((ImageCenterY-yImagePoint)/Radius)
     else AngleOrigin:=0;
     //Расчет его нового положения
     NewPointX:=Radius*cos(AngleNew+AngleOrigin)+CanvasCenterX;
     NewPointY:=Radius*sin(AngleNew+AngleOrigin)+CanvasCenterY;

     //Вывод на канву
     PointColor:=jpg.Canvas.Pixels[xImagePoint,yImagePoint];
     Canvas.Pixels[round(NewPointX),round(NewPointY)]:=PointColor;
	 end;
 end;

end;
Так вот проблема в том, что он выводит только половину картинки. Хотя вращает вроде верно
0.jpg

И вот я чет никак в толк не возьму, почему только половинку картинки выводит... Может кто подскажет, где в алгоритме недочет?

P.S. качество этого алгоритма естственно не фонтан, но меня не качество интересует а сам принцип.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2015, 18:57   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Так как в математике корень это не однозначная функция. А двузначная.
25= (-5)^2,
25= (+5)^2;

sqrt(25)=>+5,
sqrt(25)=>-5;

Перед корнем должен стоять +-. На паскале придётся продублировать код с разными знаками.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 10.12.2015, 19:24   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
if Radius <> 0 then AngleOrigin := arcsin((ImageCenterY - yImagePoint) / Radius)
else AngleOrigin := 0;
if ImageCenterX - xImagePoint < 0 then
    AngleOrigin := pi - AngleOrigin;
Так как arcsin от -pi/2 до pi/2 (всего лишь pi), а весь круг 2*pi.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.12.2015, 20:08   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

От жеж я Олень )))
Плюсую обоим.

Код:
procedure TForm1.FormPaint(Sender: TObject);
var
   CanvasCenterX,CanvasCenterY,
   ImageCenterX,ImageCenterY,
   NewPointX,NewPointY,
   AngleNew,AngleOrigin,Radius,RadiusMul
   :Double;
   xImagePoint,yImagePoint,JpegWidth,JpegHeight:Integer;
   PointColor:TColor;
begin
 //Указывается угол поворота, и его пересчет в радианы
 AngleNew:=1;  AngleNew:=3.1415/180*AngleNew;
 //Расчитывается центр канвы, куда идет рисование
 CanvasCenterX:=Width/2; CanvasCenterY:=Height/2;
 //Размеры картинки
 JpegWidth:=jpg.Width;  JpegHeight:=jpg.Height;
 //Ее центр
 ImageCenterX:=JpegWidth/2; ImageCenterY:=JpegHeight/2;
 RadiusMul:=1;
 //Проход циклом по картинке
 for yImagePoint:=0 to JpegHeight-1 do begin
   for xImagePoint:=0 to JpegWidth-1 do begin

     //Расчет радиуса от центра картинки до пикселя
     Radius:=Sqrt(Sqr(ImageCenterX-xImagePoint)+Sqr(ImageCenterY-yImagePoint));

     if (ImageCenterX>xImagePoint) then Radius:=-Radius;

     //Расчет угла, под которым этот пиксель расположен в картинке
     if Radius<>0 then AngleOrigin:=arcsin((ImageCenterY-yImagePoint)/Radius)
     else AngleOrigin:=0;
     //Расчет его нового положения
     NewPointX:=RadiusMul*Radius*cos(AngleNew-AngleOrigin)+CanvasCenterX;
     NewPointY:=RadiusMul*Radius*sin(AngleNew-AngleOrigin)+CanvasCenterY;

     //Вывод на канву
     PointColor:=jpg.Canvas.Pixels[xImagePoint,yImagePoint];
     Canvas.Pixels[round(NewPointX),round(NewPointY)]:=PointColor;
	 end;
 end;

end;
кстати заметил, что если в выражении if (ImageCenterX>xImagePoint) then Radius:=-Radius; знак поменять на "<", то получаю отзеркаливание изображения
Приколько получается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.12.2015, 01:10   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Я просто оставлю это здесь.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.12.2015, 05:17   #6
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

http://www.efg2.com/Lab/ImageProcess...teScanline.htm
Filka вне форума Ответить с цитированием
Старый 11.12.2015, 16:57   #7
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Я просто оставлю это здесь.
Красотища !
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот изображения Sanya.Kushner Мультимедиа в Delphi 1 29.12.2013 19:59
поворот изображения на форме (либо поворот файла с картинкой) mystiql Microsoft Office Access 2 21.06.2011 22:03
поворот изображения DeDoK Общие вопросы Delphi 4 06.09.2010 21:34
Поворот изображения Djony_91 Мультимедиа в Delphi 1 26.05.2010 16:15
поворот изображения Пепел Феникса Мультимедиа в Delphi 1 21.06.2009 19:53