有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在创建画布对象(线、顶点、三角形等)我想对它们应用一个围绕点的旋转

我不能使用Canvas的rotate()方法,因为点附着到地图上的地质点,所以如果我使用rotate()方法,所有地图都是旋转的

问题是画布需要点(int,int),而应用旋转会由于cos和sin函数而产生双精度。因此,当我将旋转应用于所有点时,由于将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;
}

共 (3) 个答案

  1. # 1 楼答案

    我相信你的解决方案很好。一个小的改进是,在将坐标转换为整数之前,将坐标加上0.5,这样你就可以得到我们通常使用的舍入方式——例如,0.5以上的所有值都将被舍入为1。除此之外,我不认为你可以避免做取整,因为你想把一个连续的空间放进一个离散的空间(即平面到画布)

  2. # 2 楼答案

    该代码在计算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;
    }
    
  3. # 3 楼答案

    试试这个:

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