2017-01-20 28 views
0

У меня уже есть формула для вращения (Px, Py) вокруг (Ох, Оу) на угол тета:Как повернуть пиксель/точку вокруг (0, 0) в C?

p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox 
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy 

Но когда я поставил THETA на:

double theta = 5 * PI/180; 

Моя точка остается на начальная точка link: (5, 5), в то время, когда я установил тета, чтобы:

double theta = 6 * PI/180; 

Это начинает вращаться как link: square. Я знаю, что это должно произойти, потому что командная строка похожа на огромный монитор, и не может быть круга, но как я могу заставить его вращать любую точку, на которую я ее устанавливал? Например, 6 * PI/180 выше не работает, когда моя точка равна link: (2, 2).

EDIT: ox, oy are (0, 0).

+1

Вы можете добавить исходный код программы –

+0

[Как создать минимальный, завершенный и проверяемый пример] (https://stackoverflow.com/help/mcve). – DevNull

+0

Кроме того, вы можете создавать фрагменты кода в блочном формате, вставляя блок текста с 4 пробелами. Гораздо лучше, чем снимать скриншоты консоли. Вы уже делаете это в своем вопросе. – DevNull

ответ

2

Вы не показывайте свой код, но я предполагаю, что ваш код выглядит следующим образом:

int x = 5; 
int y = 5; 
double a = 6 * PI/180; 
int i; 

for (i = 0; i < 72; i++) { 
    int xx = round(x); 
    int yy = round(y); 

    putpixel(xx, yy, '*'); 

    x = round(xx * cos(a) - yy * sin(a)); 
    y = round(xx * sin(a) + yy * cos(a)); 
} 

Переменные также могут быть double, но главное здесь в том, что вы обходе таким образом, в зависимости от ваш радиус и угол, отмените пройденное расстояние вращением. Я могу воспроизвести скриншоты, которые вы показываете с помощью приведенного выше кода.

Решение сохранить дробные значения с плавающей точкой во всем и преобразовать в целое только для печати:

double x = 5.0;     // unrounded actual coordinates 
double y = 5.0; 
double a = 5 * PI/180; 
int i; 

for (i = 0; i < 72; i++) { 
    int ix = rint(x);   // temporary integers for plotting 
    int iy = rint(y); 
    double nx, ny;    // temporary variables for update 

    putpixel(x, y, '*'); 

    nx = x * cos(a) - y * sin(a); 
    ny = x * sin(a) + y * cos(a); 

    x = nx; 
    y = ny; 
} 

Это дает хороший, круглый круг. Если вы хотите нарисовать круг пикселей с целыми координатами, посмотрите на Midpoint algorithm.

+0

Алгоритм средней точки - это то, что я искал, спасибо! – BlueBrewBerry

 Смежные вопросы

  • Нет связанных вопросов^_^