4

6点のローテーションに苦戦しています。これらの点は、中央の中心点を中心に回転します。しかし、シェイプ領域が縮小し、どんどん小さくなっていきます。

シェイプの描画は PaintComponent を使用して i JPanel で行われます。つまり、キャンバスは整数の配置のみをサポートしていますが、Double で位置を格納できます。

ポイントの位置を格納するために Point2D.Double を使用します 関数呼び出しごとにすべてのポイントを 1 度ずつ回転させます

回転についての私の理解が不足していると思います。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

これは、1 回の呼び出しの後、すべてのポイントを時計回りに 90 度回転させたシェイプの図です。明らかにそれをしたくありません。

提案やヒントをいただければ幸いです。

形

4

1 に答える 1