2010-07-14 65 views
1

这可能是直截了当的,但由于某种原因,我无法破解它(实际上是因为我很伤心在数学上很糟糕!)。如何从滚动条计算视口?

我有一个视口,一次显示800像素,我想将它左右移动超过虚拟像素数,说2400像素宽。

我使用滚动条(0-1)的相对位置来确定视口应该移动到的虚拟像素。

我有一个循环n = 800,我跑过。 我想从滑块告诉我的位置开始读取plottin点数组,并从该点开始迭代接下来的800个点。

我遇到的问题是当我的滚动条一直到右侧,其相对位置= 1我的readpoint = 2400 .....在某种方式是正确的。但是,这让我对绘图点的阅读位置到了最后一点,当我开始迭代时,我没有剩下要点来阅读。

根据我的移动800像素宽的滑动盒analagy框的左边点应该是1600在这种情况下和右点应该是2400

我怎样才能做到这一点?

我需要某种价值映射公式吗?

 private function calculateShuttleRelativePosition():void 
     { 

      var _x:Number=_scrollthumb.x 
      _sliderCenter=_x + (_scrollthumb.width/2) 
      _sliderRange=_scrollbar.width - _scrollthumb.width; 
      _slider_rel_pos=(_sliderCenter - _sliderCenterMinLeft)/_sliderRange 

     } 



pixel = slider relative position * 2400 
readpoint= pixel 

回答

3

滚动条的范围应该是最左侧像素可以取的范围,而不是所有像素的范围。

所以你的范围是1600(2400 - 800),而不是2400。这是您应该用于确定偏移量的比例因子。

作为一个警告的话总是在寻找这种事情的一个错误。由于您的小节范围从0到1,如果您不小心,输出的像素范围将介于0到800之间,如果您不注意,它可能会使阵列发生溢出。

+0

三江源! X 我真的很希望我能更好地掌握这种类型的东西! – dubbeat 2010-07-14 21:13:59

1

答案其实很简单 - 不是让相对位置在整个宽度上滑动(这就是上面所说的),而是从0开始并运行到800宽度(或视口的宽度) 。

对于一些C-ISH代码是这样:

int viewPortWidth = 800; 
int virtualWindowWidth = 2400; 

// I'm assuming your code above is right -- I didn't check 
float sliderRelativePosition = calculateShuttleRelativePosition(); 

// The casts (int and float here), make sure that you're rounding down to an integer 
// pixel between 0 and virtualWindowWidth - 1, inclusive 
int pixel = (int)(sliderRelativePosition * (float)(virtualWindowWidth - viewPortWidth - 1)); 

readPixels(pixel, viewPortWidth); // Function that loops through the pixels you want 
+0

这是很好,简洁的看。我相信它对我有用。 谢谢! – dubbeat 2010-07-14 21:16:26