在Actionscript 3中绘制两个任意点之间的正弦波

时间:2009-08-18 03:50:50

标签: actionscript-3 drawing

绘制“平坦”波很容易,但我想画两点x1,y1 x2,y2之间的波

以下是“平面”代码:

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);
            }

        }
    }
}

3 个答案:

答案 0 :(得分:4)

bezier curve怎么样?这本身并不是正弦波。但效果类似。使用适当的控制点,您应该能够使其看起来像正弦波。

答案 1 :(得分:1)

快速作弊是获取点之间的距离,将图形绘制到单独的精灵上,然后计算两点之间的角度并将图形旋转到该角度。 不是最“完美”的解决方案,但应该做到这一点,否则我可以想象,计算出两点之间的角度,然后将其作为现有值的增量添加。

希望这个黑客有所帮助。

答案 2 :(得分: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
}