2009-08-18 5 views
0

Dessin vagues « plat » est facile, mais je veux attirer l'onde entre deux points x1, y1 x2, y2Dessiner une onde sinusoïdale entre deux points arbitraires dans Actionscript 3

Voici le code « plat »:

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

Est-ce que ce doit être une onde sinusoïdale? Vous pouvez obtenir un effet similaire avec une courbe de Bézier, et les solutions pour les courbes de Bézier entre deux points sont nombreuses. –

+0

non, il ne doit pas être une onde sinusoïdale. Vous en avez un sur le dessus de votre tête? Je vais chercher. Merci:> –

Répondre

4

Qu'en est-il un bezier curve? Ce n'est pas une onde sinusoïdale en soi. Mais l'effet est similaire. Avec des points de contrôle appropriés, vous devriez être capable de le faire ressembler à une onde sinusoïdale.

1

Bien tricher rapidement serait d'obtenir la distance entre les points, dessiner le graphique sur un sprite séparé, puis juste établir l'angle entre les deux points et faire pivoter le graphique à cet angle. Pas la solution la plus «parfaite», mais devrait faire l'affaire, sinon je peux imaginer, en travaillant l'angle entre les deux points, puis en ajoutant cela comme un incrément aux valeurs existantes.

J'espère que ce hack aide.

0

Je crois que cela fonctionnera, c'est fondamentalement une matrice de rotation qui est appliquée à chaque point de la ligne. Il pourrait y avoir quelques erreurs avec l'ordre et les signes des multiplications et les paramètres à atan2 mais d'autres, je pense que cela va fonctionner.

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 
} 
Questions connexes