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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2010, 21:56   #1
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию Вылезает ошибка with massage 'Invalid floating point operation' подскажите как устранить.

Написал процедуру для поворота картинки на угол.
Алгоритм такой:
1)Ищу тангенс угла пикселя с исходной картинки
2)ищу арктангенс
3)нахожу новый угол путём сложения исходного и вводимого мной
4)ищу тангенс получившегося угла
5)Нахожу косинус, синус, а затем новые координаты получившегося пикселя
(С ошибкой справился, вот код рабочий)
Цитата:
var BmBe,BmEn:Tbitmap;
CenterX,CenterY,ang,newL,tg,newtg,n ewCos,newSin: Extended;
xBe,yBe,yEn,xEn:integer;
Begin
ang:=(Pi/2);
CenterX:=Unp.Pimg1.Height/2;
CenterY:=Unp.Pimg1.Width/2;
BmBe:=TBitmap.Create;
BmEn:=TBitmap.Create;
BmBe.Assign(Unp.Pimg1.Picture.Bitma p);
BmEn.Height:=BmBe.Height;
BmEn.Width:=BmBe.Width;
For yBe:=0 to BmBe.Height do
Begin
for xBe:=0 to BmBe.Width do
Begin
if (xBe<>0) then
Begin
tg:=yBE/xBe;//Тангенс начального угла
newL:=(arctan(tg)+ang);//Значение нового угла
newtg:=sin(newL)/cos(newL);//тангенс нового угла
newCos:=sqrt(1/(1+sqr(newtg)));//косинус нового угла
newSin:=sqrt(1-sqr(newcos));//синус новго угла
yEn:=Round(CenterY+sqrt(sqr(xBe)+sq r(yBe))*newcos);
xEn:=Round(CenterX+sqrt(sqr(xBe)+sq r(yBe))*newsin);
//if (yEn>0) and (yEn<Unp.Pimg1.Height) and (xBe>0) and (xBe<Unp.Pimg1.Width) then
Begin
BmEn.Canvas.Pixels[xEn,yEn]:=BmBe.Canvas.Pixels[xBe,yBe];
end;
end;
end;
end;
Unp.Pimg1.Canvas.Draw(0,0,BmEn);
BmBe.Free;
BmEn.Free;
Но картинка в "полосочку" видимо из-за Round и чуть съезжает вниз. Подскажите что поправить можно.
Если всё откладывать на потом, то потом будет всё.

Последний раз редактировалось Herly; 09.01.2010 в 16:36.
Herly вне форума Ответить с цитированием
Старый 09.01.2010, 16:36   #2
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

Вот удалось убрать искажения в картинке, но она не поворачивается, а переезжает вниз, подскажите как поменять формулу поворота
Цитата:
var BmBe,BmEn:Tbitmap;
CenterX,CenterY,ang,newL,tg,newtg,n ewCos,newSin: Extended;
xB1,yB1,xBe,yBe,yEn,xEn:integer;
Begin
ang:=(Pi/2);
CenterX:=Unp.Pimg1.Height/2;
CenterY:=Unp.Pimg1.Width/2;
BmBe:=TBitmap.Create;
BmEn:=TBitmap.Create;
BmBe.Assign(Unp.Pimg1.Picture.Bitma p);
BmEn.Height:=BmBe.Height;
BmEn.Width:=BmBe.Width;
For yBe:=0 to BmBe.Height do
Begin
for xBe:=0 to BmBe.Width do
Begin
xBe:=trunc(xB1-CenterX);
yBe:=trunc(yB1-CenterY);
if (xBe<>0) then
Begin
tg:=yBE/xBe;//Тангенс начального угла
newL:=(arctan(tg)+ang);//Значение нового угла
newtg:=sin(newL)/cos(newL);//тангенс нового угла
newCos:=sqrt(1/(1+sqr(newtg)));//косинус нового угла
newSin:=sqrt(1-sqr(newcos));//синус новго угла
yEn:=Trunc(CenterY+sqrt(sqr(xBe)+sq r(yBe))*newcos);
xEn:=Trunc(CenterX+sqrt(sqr(xBe)+sq r(yBe))*newsin);
BmEn.Canvas.Pixels[xEn,yEn]:=BmBe.Canvas.Pixels[xBe,yBe];
end;
end;
end;
Unp.Pimg1.Canvas.Draw(0,0,BmEn);
BmBe.Free;
BmEn.Free;
end;
Если всё откладывать на потом, то потом будет всё.
Herly вне форума Ответить с цитированием
Старый 09.01.2010, 18:56   #3
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

Намучившись со своим кодом решил не мудрить и преобразовал под себя вот такой код
Цитата:
Procedure NewCoord(Var X, Y : Integer; Alpha : Double);
Var
A, L: Double;
Begin
// Вычисляем размер плеча
L:= Sqrt(X*X+Y*Y);
// Вычисляем угол поворота, но если X = 0, то на него делить нельзя поэтому запишем угол равный PI/2
IF X = 0 THEN
IF Y < 0 THEN
A:= -PI/2
ELSE
A:= PI/2
ELSE
A:= ArcTan(Y/X);
// Скорректируем значение угла (если X < 0, то угол должен лежать PI/2 до 3PI/2)
IF X < 0 THEN
A:= A+PI;
// Вычисляем новые координаты
X:= Round(L*(Cos(A+Alpha)));
Y:= Round(L*(Sin(A+Alpha)));
End;


procedure VKOP();
Var
N : Double;
I, J: Integer;
XMax, YMax: Integer;
Max : Integer;
X, Y: Integer;
Xm, Ym, Xx, Yx,X2,Y2: Integer;
L, A: Double;
BBe,BEn:Tbitmap;//Добавил вместо Image1 и Image2
begin
//Для начала преобразуем наш угол поворота в радианы
N:= -StrToFloat('5')*PI/180;
Bbe:=Tbitmap.Create;
Ben:=Tbitmap.Create;
Bbe.Assign(Unp.Pimg1.Picture.Bitmap );
//Причем угол имеет обратное значение *
// Узнаем максимальные размеры изображения
XMax:= Bbe.Width-1;
YMax:= Bbe.Height-1;
// Получим координаты серидины изображения (именно вокруг него мы и будем вращать)
X2:= XMax DIV 2;
Y2:= YMax DIV 2;
//Размеры будущего изображения
Xm:= 0; Xx:= 0; Ym:= 0; Yx:= 0;
//Определяем размер получаемого изображения
//левый верхний угол
X:= -X2; Y:= -Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//правый верхний угол
X:= X2; Y:= -Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//правый нижний угол
X:= X2; Y:= Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//левый нижний угол
X:= -X2; Y:= Y2;
NewCoord(X, Y, -N);
X:= X+X2; Y:= Y+Y2;
IF X < Xm THEN
Xm:= X;
IF X > Xx THEN
Xx:= X;
IF Y < Ym THEN
Ym:= Y;
IF Y > Yx THEN
Yx:= Y;
//Теперь мы знаем размеры изображения которое будет
Ben.Width:= Xx-Xm;
Ben.Height:= Yx-Ym;
//Идем по координатам полученой картинки и вычисляем для них координаты исходного изображения
FOR I:= Xm TO Xx DO
FOR J:= Ym TO Yx DO Begin
//Получаем координаты точки изображения относительно его центра
X:= I-X2;
Y:= J-Y2;
//Преобразоваваем
NewCoord(X, Y, N);
//Переходим к абсолютным координатам
X:= X+X2; Y:= Y+Y2;
//Если координаты точки не попадают в исходное изображение, то рисуем простую белую точку
IF (X > BBe.Width-1) OR (Y > BBe.Height-1) OR (X < 0) OR (Y < 0) THEN
Ben.Canvas.Pixels[I-Xm, J-Ym]:= clWhite
ELSE // иначе переносим точку с изображения оригинала
Ben.Canvas.Pixels[I-Xm, J-Ym]:= Bbe.Canvas.Pixels[X, Y];
End;

Unp.Pimg1.Canvas.Draw(0,0,Ben);
//Все поворот завершен
Но при повороте на 90 он правую чать картинки оставляет на месте, получается плохо. Или при повороте скажем на 5 градусов центр смещён. Как тут с эти справиться?
Если всё откладывать на потом, то потом будет всё.
Herly вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Floating point exception Gorbunov89 Общие вопросы C/C++ 0 19.12.2009 23:05
s not a valid floating point value prod87 Помощь студентам 1 02.12.2009 20:57
invalid floating point operation mosq Общие вопросы Delphi 7 01.11.2009 13:28
Invalid floating point operation Skytis Помощь студентам 3 07.05.2008 12:16
Возникает ошибка Invalid floating point operation Иринкаа Помощь студентам 3 29.11.2007 22:10