2012-05-10 4 views
3

Я создаю объект Canvas (линии, вершины, треугольник, ...), и я хотел бы применить к ним поворот вокруг точки.Как повернуть многоугольник вокруг точки с помощью Java?

Я не могу использовать метод поворота() на холсте, потому что очки привязаны к GeoPoint на карте, так что если я использую метод поворота() для всех карта вращается ...

Проблема заключается в том что Canvas нуждается в Point (int, int), и применение вращения создает double из-за функций cos и sin. Поэтому, когда я применяю поворот к всем точкам, из-за того, что вы выполняете двойную привязку к int, у меня есть какая-то графическая проблема, которая возникает ...

Так что я ищу лучшее решение.

Вот мой код вращения:

public Point rotatePoint(Point pt, Point center) 
{ 
    this.angle = ((this.angle/180)*Math.PI); 
    double cosAngle = Math.cos(this.angle); 
    double sinAngle = Math.sin(this.angle); 

    pt.x = center.x + (int) ((pt.x-center.x)*cosAngle-(pt.y-center.y)*sinAngle); 
    pt.y = center.y + (int) ((pt.x-center.x)*sinAngle+(pt.y-center.y)*cosAngle); 
    return pt; 
} 

ответ

1

Я считаю, что ваше решение является достаточно хорошим. Небольшим улучшением было бы добавить 0.5 к координатам, прежде чем придать их целому числу, и таким образом вы будете иметь округление, к которому мы обычно привыкли, - все, что выше 0,5, округляется до 1, например. Кроме этого, я не думаю, что вы можете избежать округления, поскольку вы хотите разместить непрерывное пространство на дискретное (например, на холст).

+0

Ok поблагодарить вас @izomorphius за ответ, Я отредактировать свой пост, чтобы исправить ошибку :) сделано с копией/paste – Bibu

5

код имеет небольшую ошибку при расчете pt.y. (pt.x обновляется, но позже используется). вместо того, чтобы попробовать следующее:

public Point rotatePoint(Point pt, Point center) 
{ 
    this.angle = ((this.angle/180)*Math.PI); 
    double cosAngle = Math.cos(this.angle); 
    double sinAngle = Math.sin(this.angle); 
    double dx = (pt.x-center.x); 
    double dy = (pt.y-center.y); 

    pt.x = center.x + (int) (dx*cosAngle-dy*sinAngle); 
    pt.y = center.y + (int) (dx*sinAngle+dy*cosAngle); 
    return pt; 
} 

Я также использую следующий вариант:

public Point rotatePoint(Point pt, Point center, double angleDeg) 
{ 
    double angleRad = (angleDeg/180)*Math.PI); 
    double cosAngle = Math.cos(angleRad); 
    double sinAngle = Math.sin(angleRad); 
    double dx = (pt.x-center.x); 
    double dy = (pt.y-center.y); 

    pt.x = center.x + (int) (dx*cosAngle-dy*sinAngle); 
    pt.y = center.y + (int) (dx*sinAngle+dy*cosAngle); 
    return pt; 
} 
+1

Я протестировал «следующую вариацию». Работает! –

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