2009-08-18 7 views
0

그리기 "평면"파도가 쉽다,하지만 난 여기에 ActionScript에서 임의의 두 지점 사이 사인파를 그리기 3

는 "평면"코드 Y2 두 점 X1, Y1 × 2의 물결을 그리려 :

package display 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class SineWave extends Sprite 
    { 
     private var angle:Number = 0; 
     private var centerY:Number = 200; 
     private var range:Number = 50; 
     private var xspeed:Number = 2; 
     private var yspeed:Number = .1; 
     private var xpos:Number 
     private var ypos:Number 

     public function SineWave() 
     { 
      init() 
     } 

     protected function init():void 
     { 
      var sinWavePosition = 100; 
      var cosWavePosition = 200; 
      var sinWaveColor:uint = 0xFF0000; 
      var cosWaveColor:uint = 0x00FF00; 
      var waveMultiplier:Number = 10; 
      var waveStretcher:Number = 5; 

      var i:uint; 
      for(i = 1; i < 500; i++) 
      { 
       var sinPosY:Number = Math.sin(i/waveStretcher) * waveMultiplier; 
       var cosPosY:Number = Math.cos(i/waveStretcher) * waveMultiplier; 

       graphics.beginFill(sinWaveColor); 
       graphics.drawRect(i, sinWavePosition + sinPosY, 2, 2); 
       graphics.beginFill(cosWaveColor); 
       graphics.drawRect(i, cosWavePosition + cosPosY, 2, 2); 
      } 

     } 
    } 
} 
+0

사인파 여야합니까? 베 지어 곡선을 사용하여 유사한 효과를 얻을 수 있으며 두 점 사이의 베 지어 곡선에 대한 솔루션이 풍부합니다. –

+0

아니요, 사인파 일 필요는 없습니다. 머리 꼭대기에있는 사람 있어요? 나는 검색 할 것이다. 고맙습니다 :> –

답변

4

bezier curve은 어떨까요? 이것은 사인파 그 자체가 아닙니다. 그러나 효과는 비슷합니다. 적절한 제어점을 사용하면 사인파처럼 보이게 할 수 있어야합니다.

1

점 사이의 거리를 얻으려면 그래픽을 별도의 스프라이트에 그 다음 두 점 사이의 각도를 계산하고 그 각도로 그래픽을 회전 시키면됩니다. 가장 완벽한 해결책은 아니지만 트릭을 사용해야합니다. 그렇지 않으면 두 점 사이의 각도를 계산 한 다음이를 기존 값에 증가분으로 더하는 것으로 상상할 수 있습니다.

희망이 해킹이 도움이됩니다.

0

저는 이것이 작동 할 것이라고 믿습니다. 기본적으로 선상의 모든 지점에 적용되는 회전 매트릭스입니다. atan2에 곱셈과 매개 변수의 순서와 부호에 약간의 오차가있을 수 있지만 이것이 작동한다고 생각하는 otherwhise가있을 수 있습니다.

float v = Atan2(y2-y1, x2-x1); 
for(blabla) 
{ 
    calculate sinPosY from i 
    newSinPosY = i*Cos(v) + sinPosY*Sin(v); 
    sinPosX = i*-Sin(v) + sinPosY*Cos(v)); 
    add offset 
    render 
}