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) 的两个向量的基,但在 R^1 中只有一个向量。

但看起来你想找到“屏幕上的黑线”的交点 - 即一条任意线和一条穿过你想要适合的“形状”最低点的垂直线。很难从这个问题中看出,你想适应什么形状,但如果它是一个没有旋转的矩形,那么它将是它的右下角或左下角。然后,您可以通过比较水平线与“黑线”以及水平线与矩形底部之间的角度来找到要选择的点。

接下来,您需要找到这两条线之间的交点,公式可以在这里找到: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 回答