Проблема с поворотом простой линии изображения - PullRequest
1 голос
/ 14 декабря 2010

Утверждается, что для поворота линии на определенный угол вы умножаете координаты ее конечной точки на матрицу ({Cos (a), Sin (a)} {-Sin (a) Cos (a)}) где a - угол поворота. Результирующие два числа в матрице будут x и y координатами конечной точки повернутой линии. Вращение идет вокруг начальной точки линии. Упрощая его, новые координаты будут {x * Cos (a) - y * Sin (a)} для x и {x * Sin (a) + y * Cos (a)} для y.

Задача - повернуть треугольник, используя этот метод. Но следующий код, который использует этот метод, выдает немного дерьма вместо повернутого изображения (искривленная форма исходного треугольника, повернутого на «случайный» угол):

x0:=200;   
y0:=200;

  bx:=StrToInt(Edit1.Text);
  by:=StrToInt(Edit2.Text);
  cx:=StrToInt(Edit4.Text);
  cy:=StrToInt(Edit5.Text);
  a:=StrToInt(Edit3.Text);

  //Original triangle

  Form1.Canvas.Pen.Color:=clBlue;
  Form1.Canvas.MoveTo(x0,y0);
  Form1.Canvas.LineTo(bx,by);
  Form1.Canvas.LineTo(cx,cy);
  Form1.Canvas.LineTo(x0,y0);

  //New triangle
  Form1.Canvas.Pen.Color:=clGreen;    
  Form1.Canvas.MoveTo(x0,y0);
  b1x:=Round(bx*cos(a*pi/180)-by*sin(a*pi/180));   
  b1y:=Round(bx*sin(a*pi/180)+by*cos(a*pi/180));
  c1x:=Round(cx*cos(a*pi/180)-cy*sin(a*pi/180)); 
  c1y:=Round(cx*sin(a*pi/180)+cy*cos(a*pi/180));
  Form1.Canvas.LineTo(b1x,b1y);
  Form1.Canvas.MoveTo(x0,y0);
  Form1.Canvas.LineTo(c1x,c1y);
  Form1.Canvas.LineTo(b1x,b1y);

end;

Ну, у меня нет идей. Что я делаю не так?

Спасибо за ваше время.

Ответы [ 2 ]

4 голосов
/ 14 декабря 2010

Используемая формула вращает точку вокруг (0, 0).Для достижения требуемого результата измените свой расчет на:

b1x:=x0 + Round((bx-x0)*cos(a*pi/180)-(by-y0)*sin(a*pi/180));   
b1y:=y0 + Round((bx-x0)*sin(a*pi/180)+(by-y0)*cos(a*pi/180));
c1x:=x0 + Round((cx-x0)*cos(a*pi/180)-(cy-y0)*sin(a*pi/180)); 
c1y:=y0 + Round((cx-x0)*sin(a*pi/180)+(cy-y0)*cos(a*pi/180));
4 голосов
/ 14 декабря 2010

Вы, кажется, вращаете каждую отдельную линию вокруг ее начальных координат начальной точки. Таким образом, линия 1 будет повернута вокруг своей начальной точки (x0, y0); тогда строка 2 будет повернута на bx; тогда линия 3 будет вращаться вокруг cx. Это приведет к скрученному треугольнику. Вместо этого вам нужно будет повернуть все три линии вокруг начальной точки первой линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...