AS3中的值波类。有一个更好的方法吗?

时间:2011-04-19 18:43:25

标签: flash actionscript-3 algorithm

Math.sin()的问题在于我无法找到控制增量的方法。对于这样一个简单的概念,这看起来似乎很多。任何改进的想法?

package { // by default, iterating the next() function will return 1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1,2,3,4, etc

public class valueWave {
    private var maxno,inc,startno,offset,removeDuplicates,internalNum  //internalNum is always>0
    private var goingUp=true
    public var num              //latest value

    public function valueWave($min:Number=0, $max:Number=10, $increment:Number=1, $startno:Number=0, $removeDuplicates=true) {
        if($max<$min){
            trace("valueWave ERROR: max must be greater than min")
            return
        }
        maxno=$max-$min
        inc=$increment
        startno=$startno
        internalNum=$startno
        num=$startno
        offset=$min
        removeDuplicates=$removeDuplicates
    }

    public function next(){
        if(maxno==0){return(0);} //disable if max and min are the same
        if(goingUp){//going up:
            if(internalNum <= maxno-inc){
                internalNum+=inc
            }else{//invert:
                goingUp=false
                if(removeDuplicates) internalNum-=inc
            }
        }else{//going down:
            if(internalNum >= inc){
                internalNum-=inc
            }else{//invert:
                goingUp=true
                if(removeDuplicates) internalNum+=inc
            }
        }
        upd()
        return(num)
    }

    public function reset(){
        internalNum=startno
        goingUp=true
    }

    private function upd(){
        num=internalNum+offset
    }

}
}

UPDATE:

最终解决方案,打包成一个带有说明的简单类可以在这里找到: http://blog.crondesign.com/2011/07/as3-wave-of-values-class-function.html

2 个答案:

答案 0 :(得分:0)

我现在没时间完成数学考试,但你想阅读Recurrence Relationships。生成这个序列并不是那么糟糕。有两个部分。一个生成数字序列,另一个是(-1)^n术语来处理上/下部分。

一本不错的算法书应该涵盖这一点。标准文本为Introduction To Algorithms。每个程序员都应该拥有一份副本。

答案 1 :(得分:0)

这个怎么样:

Math.abs((internalNum++ % 18) - 9) + 1

这会将整数映射到您需要的序列。

这是一般版本:

value = Math.abs((internalNum % (2*(max-min))) - (max-min)) + min;
internalNum += increment;

请注意(max-min) increment的{​​{1}}的可分性如何影响你的价值观。 internalNum的起始值将决定算法在increment != 1 or -1时生成的序列。