0

との長い戦いの末、Graphics2Dついにアプレットで小さな三角形を描画、回転、移動できるようになりました。今私がやりたいことは、三角形が指している角度を見つけて、その方向に動かすことです. これを行う方法またはアルゴリズムはありますか? 私はこれを試しました:

public double calcAngleMoveX(double angle)
    {
        return (double)(Math.cos(angle*Math.PI/180));
    }
public double calcAngleMoveY(double angle)
    {
        return (double)(Math.sin(angle*Math.PI/180));
    }


ship.incY(ship.calcAngleMoveY(ship.getFaceAngle()-90));
ship.incX(ship.calcAngleMoveX(ship.getFaceAngle()-90));

しかし、それは本当に奇妙なことをします。誰でも私のためにこれを解決できますか?

編集:これは私のコードですpaint():

        g2d = (Graphics2D)g;
        AffineTransform identity = new AffineTransform();
        g2d.drawString(Double.toString(ship.getX()),100,100);
        g2d.drawString(Double.toString(ship.getY()),100,120);
        int width = getSize().width;
        int height = getSize().height;
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0,0,width,height);
        g2d.translate(ship.getX(),ship.getY());
        g2d.rotate(Math.toRadians(ship.getFaceAngle()));
        g2d.setColor(Color.RED);
        g2d.fill(shape);

そして、これは私の keyPressed メソッドです:

int ke = e.getKeyCode();
        switch(ke)
        {
        case KeyEvent.VK_LEFT:
            ship.setFaceAngle(ship.getFaceAngle()-5);
            break;
        case KeyEvent.VK_RIGHT:
            ship.setFaceAngle(ship.getFaceAngle()+5);
            break;
        case KeyEvent.VK_UP:
            ship.incX(ship.calcAngleMoveX(ship.getFaceAngle())*ship.velocity);
            break;
        case KeyEvent.VK_DOWN:
            ship.incY(ship.calcAngleMoveY(ship.getFaceAngle())*ship.velocity);
            break;
        }
        repaint();

計算方法は次のとおりです。

public double calcAngleMoveX(double angle)
    {
        return (double)(Math.sin(angle * Math.PI / 180.0));
    }
    public double calcAngleMoveY(double angle)
    {
        return (double)(-Math.cos(angle * Math.PI / 180.0));
    }
4

1 に答える 1

1

船の動きは、グラフィックで使用されている座標系によって異なります。

90 度が「正しい」と言ったので、0 度を「上」として時計回りのベアリングを使用していると仮定します。

角度を操作して、0 度が正しいというデカルトの慣習から変換してから時計回りに回転するよりも、各軸に対して呼び出す三角関数を単純に反転する方が簡単です。

Graphics2Dは、他のほとんどのグラフィック システムと同様に、右に移動するにつれて増加する X 座標を使用するため、次のようになります。

delta_x = Math.sin(angle * Math.PI / 180.0)

delta_x = 1.0これで 90 度とdelta_x = -1.0270 度が得られることが簡単にわかるはずです。

Y 座標は、Graphics2Dに移動する(つまり、左上にある) ほど大きくなるため、次のように使用します。[0, 0]

delta_y = -Math.cos(angle * Math.PI / 180.0)

delta_y = -1.00 度とdelta_y = 1.0180 度を与えます。

[0, 0]左下のシステムを使用している場合は、数式-から単項マイナス ( ) を削除するだけです。delta_y

于 2013-06-06T20:49:22.593 に答える