2009-08-18 3 views
0

Рисунок «плоские» волны легко, но я хочу, чтобы нарисовать волну между двумя точками x1, y1 x2, y2Нарисуйте синусоиды между двумя произвольными точками в Actionscript 3

Вот «плоский» код:

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, но другие, поскольку я думаю, что это сработает.

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 
} 
Смежные вопросы