Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.03.2012, 07:12
Аватар для Vertex
Новичок

Отправить личное сообщение для Vertex Посмотреть профиль Найти все сообщения от Vertex
 
Регистрация: 22.06.2008
Адрес: Узбекистан, Ташкент
Сообщений: 22

Целочисленная вращалка без умножения
Если для нормального линейного вращения координат имеется
Код:
    float sine = sin(PI / 180.0), cose = cos(PI / 180.0);    // Prepare for rotation by 1 degree
    float x = 127.0, y = 0.0, tmp;    // Init
// Main cycle
    {
        tmp = x * cose - y * sine;
        y = y * cose + x * sine; x = tmp;
    }
, возможно в частности заменить алгоритмом Брезенхэма
Код:
long	px1 = 150, py1 = 0, pz;

  ////////////////////////////////////////////////////////////
 // Bresenham circle algorithm x,y-coordinate rotation     //
////////////////////////////////////////////////////////////
void	Bres_Rotation(long &x, long &y, long &d) {
static long	dx, dy;
    if(y > 0 && x >= 0) dx = +1, dy = -1; else 
    if(y <= 0 && x > 0) dx = -1, dy = -1; else
    if(y < 0 && x <= 0) dx = -1, dy = +1; else 
    if(y >= 0 && x < 0) dx = +1, dy = +1;
    if(!x || !y) {
	d = - 2 * abs(x + y);
	if(!y) x += dx;
    }
    if(d < 0 && 2 * (d + abs(y)) - 1 <= 0) {
	if(dx * dy < 1)
	    d += 1 + 2 * abs(x += dx); else
	    d += 1 + 2 * abs(y += dy);
    } else
    if(d > 0 && 2 * (d - abs(x)) - 1 > 0) {
	if(dx * dy < 1)
	    d += 1 - 2 * abs(y += dy); else
	    d += 1 - 2 * abs(x += dx);
    } else
    if(dx * dy < 1)
	d += 2 * (abs(x += dx) - abs(y += dy)); else
	d += 2 * (abs(y += dy) - abs(x += dx));
}
    ...
    ... WinMain tester
    ...
    case WM_TIMER:
	hdc = GetDC(hWnd);
	SetPixel(hdc, 250 + px, 250 + py, 0xFFFFFF);
	Bres_Rotation(px, py, pz);
	SetPixel(hdc, 250 + px, 250 + py, 0x000000);
	ReleaseDC(hWnd, hdc);
	break;
, мною разработан ненормальный способ
Код:
long	xp1 = 150, yp1 = 0, xx1, yy1, ss1 = 0;	// Use it
long	xp2 = 0, yp2 = -175, xx2, yy2, ss2 = 0; // as sample

    ///////////////////////////////////////////////////////////////
   // Step Rotation - Rotation the x and y by simple operations //
  // Auto initialize - s = 0, x != 0 || y != 0                 //
 // xx, yy - squares of x, y                                  //
///////////////////////////////////////////////////////////////
void	StepRotation(long &x, long &y, long &xx, long &yy, long &s) {
    if(s == 0 && x != 0)
	xx = x * x, yy = y = 0, s = xx;
    else
    if(s == 0 && y != 0)
	xx = x = 0, yy = y * y, s = yy;
    if(x >= 0 && y > 0 && x > y) {
	yy += ++ y * 2 - 1;
	if(xx + yy > s) xx -= -- x * 2 + 1;
    } else
    if(x > 0 && y >= 0 && x <= y) {
	xx -= -- x * 2 + 1;
	if(xx + yy <= s) yy += ++ y * 2 - 1;
    } else
    if(x <= 0 && y > 0 && -x < y) {
	if(xx + yy > s) yy -= -- y * 2 + 1;
	xx -= -- x * 2 + 1;
    } else
    if(x < 0 && y >= 0 && -x >= y) {
	yy -= -- y * 2 + 1;
	if(xx + yy <= s) xx -= -- x * 2 + 1;
    } else
    if(x <= 0 && y < 0 && -x > -y) {
	if(xx + yy > s) xx += ++ x * 2 - 1;
	yy -= -- y * 2 + 1;
    }
    if(x < 0 && y <= 0 && -x <= -y) {
	xx += ++ x * 2 - 1;
	if(xx + yy <= s) yy -= -- y * 2 + 1;
    } else
    if(x >= 0 && y < 0 && x < -y) {
	if(xx + yy > s) yy += ++ y * 2 - 1;
	xx += ++ x * 2 - 1;
    } else
    if(x > 0 && y <= 0 && x >= -y) {
	yy += ++ y * 2 - 1;
	if(xx + yy <= s) xx += ++ x * 2 - 1;
    }
}
    ...
    ... WinMain tester
    ...
    case WM_TIMER:
	hdc = GetDC(hWnd);
	SetPixel(hdc, 250 + xp1, 250 - yp1, 0xFFFFFF);
	SetPixel(hdc, 250 + xp2, 250 - yp2, 0xFFFFFF);
	StepRotation(xp1, yp1, xx1, yy1, ss1);
	StepRotation(xp2, yp2, xx2, yy2, ss2);
	if(ss1 > 50)
	    -- ss1;	// Draw Spiral
	SetPixel(hdc, 250 + xp1, 250 - yp1, 0);
	SetPixel(hdc, 250 + xp2, 250 - yp2, 0);
	ReleaseDC(hWnd, hdc);
	break;
, который можно использовать в алгоритме черчения дуги.
Интересный побочный эффект: скорость движения у прямых углов заметно падает.
Как вариант, для компенсации этого следует как-то добавить дополнительные итерации.

Если у кого-то вопросы/варианты - пожалуйста!

Последний раз редактировалось Vertex, 17.03.2012 в 07:33. Причина: Спираль
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскраска таблицы умножения maksatktl Задачи 1 02.04.2011 13:21
процедура умножения многочленов с помощью списков neitrosha Реализация, исходники, языки 12 30.03.2011 21:55
Таблица умножения дробей с использованием класса Alexander_ua Задачи 9 19.02.2010 02:20
Распараллеливание диагонального умножения матрицы на вектор vilza Математические алгоритмы (другое) 1 11.01.2010 12:57
Умножения знаковых чисел гость Математические алгоритмы (другое) 8 17.11.2009 03:14