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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2009, 16:34   #1
firefox0013
Пользователь
 
Регистрация: 30.09.2009
Сообщений: 17
По умолчанию Поворот фигуры

В курсовой нужна ф-ия поворота фигуры. Прямоугольника построенного с помощью lineto на Canvas. Известны координаты его вершин. Вычитал из геометрии про матрицу поворота вроде правильно расчитал но не работает. либо вращает и сжимает к центру 0-90 градусов или растягивает при других значениях.
Код:

int povorot(int gr)
  {

  if (gr>360)
   gr=gr-360;

  double sina = sin( gr * ( M_PI / 180 ) );
  double cosa = cos( gr * ( M_PI / 180 ) );

  int xo=*point::x;  //коорд. центра он же точка вращения
  int yo=*point::y; //



  x1=((x1-xo)*cosa-(y1-yo)*sina)+xo;  //расчет новых  координат
  y1=((x1-xo)*sina+(y1-yo)*cosa)+yo;

  x2=((x2-xo)*cosa-(y2-yo)*sina)+xo;
  y2=((x2-xo)*sina+(y2-yo)*cosa)+yo;

  x3=((x3-xo)*cosa-(y3-yo)*sina)+xo;
  y3=((x3-xo)*sina+(y3-yo)*cosa)+yo;

  x4=((x4-xo)*cosa-(y4-yo)*sina)+xo;
  y4=((x4-xo)*sina+(y4-yo)*cosa)+yo ;
firefox0013 вне форума Ответить с цитированием
Старый 29.04.2011, 10:40   #2
Arnezami
Форумчанин
 
Регистрация: 04.10.2009
Сообщений: 147
По умолчанию

А где вы всё отрисовываете?
Ув. Форумчане! Если мои советы были Вам полезны, не забывайте благодарить в виде повышение рейтинга!!!
http://vkontakte.ru/id6715558
Arnezami вне форума Ответить с цитированием
Старый 05.10.2011, 12:48   #3
metalalisa
Новичок
Джуниор
 
Регистрация: 05.10.2011
Сообщений: 1
По умолчанию

Цитата:
Сообщение от firefox0013 Посмотреть сообщение
x4=((x4-xo)*cosa-(y4-yo)*sina)+xo;
y4=((x4-xo)*sina+(y4-yo)*cosa)+yo ;
[/CODE]
x4 при подсчете y4 уже измененная, а доолжна быть исходная!
metalalisa вне форума Ответить с цитированием
Старый 30.11.2011, 18:36   #4
Cool_Wolf
Новичок
Джуниор
 
Аватар для Cool_Wolf
 
Регистрация: 06.09.2008
Сообщений: 2
По умолчанию

Если еще актуально, то вот код
Код:
	gr =0;
	int width = 100; //ширина прям-ка
	int height = 100; //высота прям-ка
	int x = 50, y=50; //координаты верхнего левого угла
	int x1_old = x, x1_new;
	int x2_old = x+width, x2_new;
	int x3_old = x+width, x3_new;
	int x4_old = x, x4_new;
	int y1_old = y, y1_new;
	int y2_old = y, y2_new;
	int y3_old = y+height, y3_new;
	int y4_old = y+height, y4_new;
	if (gr > 360)
		gr = gr - 360;
	double sina = sin(gr * (M_PI / 180));
	double cosa = cos(gr * (M_PI / 180));

	int xo = x+(width/2); // коорд. центра, он же точка вращения
	int yo = y+(height/2); //

// новые координаты сохраняем в других переменных, при необходимости потом можем переписать их в исходные. 
// в моем примере начальные координаты не меняются, а отрисовка идет по новым координатам (с постфиксом _new)
	x1_new = ((x1_old - xo) * cosa - (y1_old - yo) * sina) + xo; // расчет новых  координат
	y1_new = ((x1_old - xo) * sina + (y1_old - yo) * cosa) + yo;

	x2_new = ((x2_old - xo) * cosa - (y2_old - yo) * sina) + xo;
	y2_new = ((x2_old - xo) * sina + (y2_old - yo) * cosa) + yo;

	x3_new = ((x3_old - xo) * cosa - (y3_old - yo) * sina) + xo;
	y3_new = ((x3_old - xo) * sina + (y3_old - yo) * cosa) + yo;

	x4_new = ((x4_old - xo) * cosa - (y4_old - yo) * sina) + xo;
	y4_new = ((x4_old - xo) * sina + (y4_old - yo) * cosa) + yo;

// пример отрисовки в С++ билдере
	PaintBox1->Canvas->MoveTo(x1_new,y1_new);
	PaintBox1->Canvas->LineTo(x2_new, y2_new);
	PaintBox1->Canvas->MoveTo(x2_new,y2_new);
	PaintBox1->Canvas->LineTo(x3_new, y3_new);
	PaintBox1->Canvas->MoveTo(x3_new,y3_new);
	PaintBox1->Canvas->LineTo(x4_new, y4_new);
	PaintBox1->Canvas->MoveTo(x4_new,y4_new);
	PaintBox1->Canvas->LineTo(x1_new, y1_new);
Firefox особенно хорош с Яндекс.Баром, а так же с Яндекс.Блэкджеком и Яндекс.Шлюхами.:eek: :eek: :eek:

Последний раз редактировалось Cool_Wolf; 30.11.2011 в 21:37.
Cool_Wolf вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пересекаются ли фигуры? XeN0N Помощь студентам 10 21.01.2009 08:34
Движение фигуры по траектории Dgohn Общие вопросы Delphi 3 08.01.2009 09:36
Простые фигуры на Delphi Witaliy Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 03.05.2008 15:37
Детали, фигуры dma Microsoft Office Excel 1 17.10.2007 09:22