1

X 位置のみがわかっているときに、ステージ上で回転したオブジェクトの Y 位置を見つけようとしています。私はこれを行う方法についてあまり詳しくありませんが、境界オブジェクトの回転に関連することはわかっています。

私がする必要があるのは、計算された下の X 位置に基づいて、画面上の黒い境界線に当たる前の正確な最大 Y 位置を知ることです。元の位置が 280 であることはわかっていますが、Y 位置がさらに下にあることをどのように判断するかはまったくわかりません。

X を見つけるためのコード (このレベルでは必要ないため、回転は考慮されていません) とスクリーンショットを添付して、明確に理解できるようにしました。

お時間をいただきありがとうございます。

    private function init(e:Event = null):void{
        var maxX:int = stage.width
        var freeSpace:int = 300
        var startX:int = Math.ceil(Math.random() * (maxX - (freeSpace+this.width))) + freeSpace;    
        this.x = startX
    }

4

2 に答える 2

0

私が正しい質問に答えているかどうかはわかりません。なぜなら、あなたが言ったように、解決することは不可能であるか、むしろ Y が何でもあり得ることを受け入れなければならないからです... ( R^2 上のベクトル空間のポイントでは、フォーム (x,y) の 2 つのベクトルの基底が必要ですが、R^1 にはベクトルしかありません)。

しかし、「画面上の黒い線」の交点、つまり、任意の線と、適合させたい「形状」の最下点を通る垂直線を見つけたいようです。どのような形状に合わせようとしているのかという質問からはわかりにくいですが、回転していない長方形の場合は、右下隅または左下隅になります。次に、水平線と「黒い線」の間の角度と、水平線と長方形の底の間の角度を比較することで、選択するポイントを見つけることができます。

次に、これら 2 つの線の交点を見つける必要があります。式は次の場所にあります: http://en.wikipedia.org/wiki/Line_intersection

于 2012-05-07T18:25:59.697 に答える
0

私はあなたの質問に完全には確信が持てませんが、うまくいけば、これらの提案が役に立ちます:

  • 表示オブジェクトで localToGlobal() 関数を使用して、その表示コンテナ内で回転、移動、スケーリングされたポイントをステージに返すことができます。例: $p:Point = myMovieClip.localToGlobal(new Point(10, 10));
  • マトリックスは、ポイントを回転させるための便利で簡単な方法でもあります。例、 var $mtx:Matrix = new Matrix(); $mtx.tx = 10; $mtx.ty = 10; $mtx.rotate(); そして今、$mtx.tx と $mtx.ty は回転された結果を持っています

それらはおそらくあなたの質問に答えないでしょうが、念のために、そしてより複雑なことに入る前にそれらについて言及することにしました. wvxvw が言ったように、他の変数がなければ、しようとしている方程式を実際に解くことはできません。X を線分内の点と比較するときに Y を見つける方法を示すコードをいくつか書きました。

import flash.display.Shape;
import flash.geom.Point;
import flash.display.Graphics;
import flash.events.MouseEvent;

var $s:Shape = new Shape();
addChild($s);

var borderStart:Point = new Point(stage.stageWidth/2, stage.stageHeight/2);
var borderRotation:Number = 45; 
var borderLength:Number = 800;

var borderRad:Number = borderRotation * (Math.PI/180);
var borderEnd:Point = new Point(borderStart.x + Math.cos(borderRad) * borderLength, borderStart.y + Math.sin(borderRad) * borderLength);

stage.addEventListener(MouseEvent.MOUSE_MOVE, update);

function update(e:MouseEvent):void{
    var $g:Graphics = $s.graphics;
    $g.clear();

    //Drawing the rotated border
    $g.lineStyle(3, 0xff0000, .5);
    $g.moveTo(borderStart.x, borderStart.y);
    $g.lineTo(borderEnd.x, borderEnd.y);

    //Finding if and where mouseX collides with our border
    if (stage.mouseX >= Math.min(borderStart.x, borderEnd.x) && stage.mouseX <= Math.max(borderStart.x, borderEnd.x)){
        var $x:Number = stage.mouseX;

        //SOLVING HERE : Solve collision with X
        var $percent:Number = ($x - borderStart.x)/(borderLength * Math.cos(borderRad));
        var $y:Number = borderStart.y + Math.sin(borderRad) * borderLength * $percent;

        //Drawing to our collision
        $g.lineStyle(1, 0xffff00, .6);
        $g.moveTo($x, 0);
        $g.lineTo($x, $y);
        $g.lineStyle(2, 0xffff00, 1);
        $g.drawCircle($x, $y, 3);

        trace("----\nCollision @\t" + "x: " + $x + "\ty:" + Math.round($y));
    }
}

これにより、特定の問題を解決する方法についての洞察が得られることを願っています。

于 2012-05-07T22:43:37.590 に答える