4

我正在为 6 点的轮换而苦苦挣扎。这些点围绕中间的中心点旋转。但是发生的情况是形状区域缩小,并且变得越来越小。

形状的绘制发生在带有 PaintComponent 的 i JPanel 上。这意味着画布仅支持整数定位,尽管我可以将位置存储在 Doubles 中。

我使用 Point2D.Double 存储点位置我在每个函数调用时将所有点旋转 1 度

我认为我对旋转的理解不足,我可以一次旋转 360 度,或者 180 度,这很好用。但是 45 度或 90 度会完全把我的点变成一条线(下图)。

这个问题已经困扰我一段时间了,但一如既往,我确信有一个简单的解决方案。

这是旋转功能

@Override
public synchronized void rotatePoints(int move_x, int move_y) {
    // TODO Auto-generated method stub
    super.rotatePoints(move_x, move_y);

    BottomPanel.appendText("Area of Polygon is: " + UtilClass.calculateAreaOfPolygon(points)+ "\n");

    double degrees=1.0;
    double radians = degrees * (double)(Math.PI / 180.0);

    //GET THE CENTER POINT C
    Point2D.Double center = UtilClass.getCenterOfPolygon(points);

    //ITERATE THROUGH THE POINTS
    Iterator<PointClass> itr = points.iterator();

    while(itr.hasNext()) {

        //GET THE POINT
        PointClass point_class = itr.next();
        //point_class = points.get(3);

        //FIRST TRANSLATE THE DIFFERENCE
        double x1 = point_class.point.x - center.x;
        double y1 = point_class.point.y - center.y;

        //APPLY ROTATION MATRIX
        x1 = (x1 * Math.cos(radians)) - (y1 * Math.sin(radians));
        y1 = (x1 * Math.sin(radians)) + (y1 * Math.cos(radians));

        //TRANSLATE BACK
        point_class.point.setLocation(x1 + center.x, y1 + center.y);

        //ADD THE DEEGRES TO POINT CLASS
        point_class.angle += Math.toDegrees(radians);
    }
}

这是检索给定多边形的中心位置的代码

public synchronized static Point2D.Double getCenterOfPolygon(List<PointClass> points) {

    //GETTING THE CENTER OF A COMPLEX POLYGON

    double combined_x = 0;
    double combined_y = 0;

    Iterator<PointClass> itr = points.iterator();

    while(itr.hasNext()) {

        PointClass point_class = itr.next();

        //ADD TO THE
        combined_x += point_class.point.x;
        combined_y += point_class.point.y;
    }

    double center_x = combined_x / (double)points.size();
    double center_y = combined_y / (double)points.size();

    return new Point2D.Double(center_x, center_y);
}

这是将其所有点顺时针旋转 1 度的形状图片

形状

每次旋转后,我在这里输出多边形的面积是结果

  • 多边形的面积是:6290
  • 多边形的面积是:6288
  • 多边形的面积是:6286
  • 多边形的面积是:6284
  • 多边形的面积是:6283
  • 多边形的面积是:6281

这是一张在一次调用后将其所有点顺时针旋转 90 度的图形。它显然不想这样做。

我很高兴有任何建议或提示。

形状

4

1 回答 1

6

错误就在这里:

//APPLY ROTATION MATRIX
x1 = (x1 * Math.cos(radians)) - (y1 * Math.sin(radians));
y1 = (x1 * Math.sin(radians)) + (y1 * Math.cos(radians));

x1更新得太早,这样y1是根据新值x1而不是旧值计算的。

你可以把它改成这样:

//APPLY ROTATION MATRIX
double temp;
temp = (x1 * Math.cos(radians)) - (y1 * Math.sin(radians));
y1   = (x1 * Math.sin(radians)) + (y1 * Math.cos(radians));
x1   = temp;
于 2013-05-30T22:53:46.977 回答