2012-05-07 22 views
1

我想知道只有X位置已知的旋轉對象在舞臺上的Y位置。我對於如何去做這件事並不是非常陌生,但我知道它會與邊框對象的旋轉有關。AS3 - 如果已知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 
    } 

回答

0

我不是你的問題完全肯定,但希望這些建議將有助於:

  • 您可以在顯示對象上使用localToGlobal()函數將該顯示容器中的旋轉,平移和縮放點返回到舞臺。例如,$ p:Point = myMovieClip.localToGlobal(new Point(10,10));
  • A Matrix也是一個很好的和簡單的方法來旋轉一個點。例如,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)); 
    } 
} 

希望這會就如何解決您的特定問題的一些見解。

0

我不知道如果我回答正確的問題,因爲你的措辭,這是不可能解決的,或者說,你會不得不接受Y可以是一切事情...(爲了能夠在R^2上的向量空間中找到一個點,需要一個形式(x,y)的兩個向量的基礎,但是在R^1中只有一個向量。

但它看起來像你想找到一個「屏幕上的黑線」的交集 - 即通過你想要適合的「形狀」的最低點的任意線和垂直線。從這個問題很難說,你想要適合什麼樣的形狀,但如果它是一個不旋轉的矩形,那麼它將是其右下角或左下角。然後,您可以通過比較水平線和「黑線」以及矩形的水平線和底部之間的角度來找到要選擇的點。

接下來,你需要找到這兩條線之間的交叉點,公式可以在這裏找到:http://en.wikipedia.org/wiki/Line_intersection