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
}
}
}
最终解决方案,打包成一个带有说明的简单类可以在这里找到: http://blog.crondesign.com/2011/07/as3-wave-of-values-class-function.html
答案 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
时生成的序列。