如何使用Java围绕点旋转多边形?
我正在创建一个画布对象(线、顶点、三角形等等),我想对它们应用围绕点的旋转 我不能使用Canvas的rotate()方法,因为点附着到地图上的地质点,所以如果我使用rotate()方法,所有地图都是旋转的 问题是画布需要点(int,int),而应用旋转会由于cos和sin函数而产生双精度。因此,当我将旋转应用于所有点时,由于将double转换为int,我会遇到一些图形问题 所以我在寻找最好的解决方案 这是我的轮换代码:如何使用Java围绕点旋转多边形?,java,casting,rotation,Java,Casting,Rotation,我正在创建一个画布对象(线、顶点、三角形等等),我想对它们应用围绕点的旋转 我不能使用Canvas的rotate()方法,因为点附着到地图上的地质点,所以如果我使用rotate()方法,所有地图都是旋转的 问题是画布需要点(int,int),而应用旋转会由于cos和sin函数而产生双精度。因此,当我将旋转应用于所有点时,由于将double转换为int,我会遇到一些图形问题 所以我在寻找最好的解决方案 这是我的轮换代码: public Point rotatePoint(Point pt, Poi
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;
}
我相信你的解决方案很好。一个小的改进是,在将坐标转换为整数之前,将坐标加上0.5,这样您将获得我们通常使用的舍入-例如,0.5以上的所有内容都将舍入为1。除此之外,我不认为您可以避免进行舍入,因为您希望将连续空间放置到离散空间(即画布的平面)。计算pt.y时,代码有一个小错误。(第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;
}
试试这个:
public Point rotatePoint(Point pt, Point anchorPoint, double angleDeg) {
double angleRad = Math.toRadians(angleDeg);
double dx = (pt.x - anchorPoint.x); //x-cord. is transformed to origin
double dy = (pt.y - anchorPoint.y); //y-cord. is transformed to origin
double ptX = anchorPoint.x + (dx * Math.cos(angleRad) - dy * Math.sin(angleRad));
double ptY = anchorPoint.y + (dx * Math.sin(angleRad) + dy * Math.cos(angleRad));
return new Point((int) ptX, (int) ptY);
}
好的,谢谢@izomorphius的回复,我已经编辑了我的帖子来纠正一个错误:)使用copy/pasteI测试了“以下变体”。作品