1

回転、移動、スケーリングの 3 つのアクションをサポートするプログラムを作成しました。

移動とスケーリングはうまく機能していますが、回転に問題があります。

コードの冒頭で、ファイルから原点を解析し、2D 平面に最初のオブジェクトを描画します。次に、オブジェクトはそれ自体の周りを回転するのではなく、原点の周りを回転します。

すべての行列と数式をチェックしましたが、正確なバグを見つけることができませんでした。ここでどこが間違っていたのでしょうか?

スケーリングと変換なしで、回転の部分的なコードを添付しました。

コードの SSCCE は次のとおりです。

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Point2D;
import java.awt.geom.Line2D;
import java.io.IOException;

import javax.swing.JFrame;

public class SSCCE {

    public static void main (String[] args) throws IOException 
    {
        ClippingView1 CC = new ClippingView1(); 
        CC.start();
    }


}
  • これが私の主な問題であるため、この SSCCE は回転のみをサポートします。

問題のアイデアは大歓迎です!

よろしく

4

1 に答える 1

1

原点以外の点を中心に回転するには、最初に平行移動行列を適用して回転したい点を原点に移動し、次に原点を中心に回転行列を移動し、次に平行移動行列を逆にしてすべてを元の位置に戻す必要があります。

したがって、 no do の行には、次のm_transforms.rotateようなものが必要です。

currentLine = m_transforms.translate(-xPoint, -yPoint,
                  m_transforms.rotate(m_direction,
                       m_transforms.translate(xPoint, yPoint, currentLine);

回転させたいポイントはどこxPointにあり、どこにありますか。yPoint

おそらく、これら 3 つの操作を 1 つのマトリックスに結合し、それを に適用するcurrentLine必要があるため、次のようなメソッドが得られます。

Line2D rotate(double xPoint, double yPoint, double angle, Line2D line)

于 2013-04-27T19:27:51.343 に答える