3

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

我不能使用 Canvas 的 rotate() 方法,因为点附加到地图上的 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;
}
4

3 回答 3

7

该代码在计算 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;
}
于 2013-01-01T03:08:55.203 回答
1

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

于 2012-05-10T12:05:49.943 回答
0

试试这个:

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);
  }
于 2018-04-17T16:37:07.457 回答