繁体   English   中英

如何使用Java在点周围旋转多边形?

[英]How to rotate a polygon around a point with Java?

我正在创建一个Canvas对象(直线,顶点,三角形......),我想在它们周围应用一个旋转。

我不能使用Canvas的rotate()方法,因为点附加到Map上的GeoPoint,所以如果我使用rotate()方法,则所有地图都在旋转......

问题是Canvas需要Point(int,int)并且应用旋转会因cos和sin函数而创建double。 因此,当我将旋转应用于所有点时,由于将double转换为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;
}

在计算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;
}

我相信你的解决方案非常好。 一个小的改进是在将它们转换为整数之前将0.5加到坐标上,这样你就会得到我们通常习惯的舍入 - 例如,高于0.5的所有内容都会舍入为1。 除此之外我不认为你可以避免进行舍入,因为你想要将一个连续的空间放入离散的空间(即平面到画布)。

试试这个:

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);
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM