代码之家  ›  专栏  ›  技术社区  ›  Joel Hooks

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

  •  0
  • Joel Hooks  · 技术社区  · 15 年前

    绘制“平面”波很容易,但我想在两点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 回复  |  直到 15 年前
        1
  •  4
  •   Steve Wortham    15 年前

    A怎么样 bezier curve 是吗?这本身不是正弦波。但效果是相似的。有了适当的控制点,你应该能够让它看起来像正弦波。

        2
  •  1
  •   enzuguri    15 年前

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

    希望这个黑客帮上忙。

        3
  •  0
  •   dsggfdf    15 年前

    我相信这是可行的,它基本上是一个旋转矩阵,适用于直线上的每一点。 乘法的顺序和符号以及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
    }