我目前有一个垂直滑块,由用户使用startDrag控制。冰球的运动受到115px高的轨道动画片段的限制。
private function init():void
{
puck.y = (track.height-puck.height)/2;
puck.buttonMode = true;
puck.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
}
private function sendNewValue():void
{
trace(Math.round(puck.y-track.y+(puck.height/2)));
var newVal:Number = ; //need some math magic here
dispatchEvent(new ToolEvent(ToolEvent.SCALE,1));
}
private function onMouseDown(evt:MouseEvent):void
{
this.stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
puck.startDrag(false,new Rectangle((track.x + (track.width/2))-(puck.width/2),track.y-(puck.height/2),0,track.height));
}
private function onMouseUp(evt:MouseEvent):void
{
puck.stopDrag();
sendNewValue();
}
我可以使用Math.round(puck.y-track.y+(puck.height/2))
从中获取一个值,它根据冰球的位置给出1到115之间的值。
现在遗憾的是,数学不是我的强项(对程序员有帮助!),有人请解释我如何转换这些值以便:
1 = 2
115 = 0
midpoint (115/2) = 1
编辑:有点像这里的问题:How do I reverse my sound volume math for my volume slider?,但同时反转我需要在比例尺上调整它的值。
答案 0 :(得分:4)
如果你正在寻找线性函数,那么:
f(1)=2 and f(115) = 0
F(x) = 115/67 -x/67 will work
<强>概括强>
如果您正在寻找线性函数 f(x)= a.x + b ,那么:
f(x1)=y1
f(x2)=y2
然后解决方案是:
a=(y1-y2)/(x1-x2)
b=y1 - x1*(y1-y2)/(x1-x2)
答案 1 :(得分:0)
var sliderValue:Number = Math.round(puck.y-track.y+(puck.height/2));
var sliderPercent:Number = (sliderValue / 115);
var result = Math.abs((sliderPercent * 2) - 2);
如果有效,请告诉我。我不是特别了解上面的功能,所以可能会更好。在我的代码中,55会给你1.04,因为它超过了全部金额的一半,在你的情况下是0而不是2是全额。