在无限旋转的旋转木马中确定哪些幻灯片位于中心旁边的算法?

时间:2017-10-10 12:36:08

标签: javascript jquery algorithm sorting math

所以,我已经建造了一个由10个项目组成的无限旋转旋转木马:

[one, two, three, four, five, six, seven, eight, nine, ten]

列表一次包装并显示五个项目。该列表以“活动”项为中心,默认情况下从1开始。

因此默认视图为:

[nine, ten, one, two, three]

列表可以向任一方向滚动。如果默认视图向右滚动,则新视图将为:

[ten, one, two, three, four]

如果默认视图向左滚动,则新视图将为:

[eight, nine, ten, one, two]

等等。

我需要一种定位视图最外边缘的两个元素的方法。对于默认视图,它将是ninethree。但是因为元素一直包裹着,所以需要的条件让我感到困惑。

将每个元素视为一个类,它将在内部确定其“edgy-ness”。

每个元素都可用:

1. own index (eg 1)
2. active slide (eg 3)
3. number of slides (eg 10)

鉴于这些数字,必须能够确定一个元素是否在边缘,对吗?怎么办呢?

4 个答案:

答案 0 :(得分:2)

好的,所以活动幻灯片是中心的。我们打电话给var active = 1;

左侧幻灯片是active - 2,右侧幻灯片是active + 2,当然除了它包装的事实。

你可以使用'模数'帮助。右侧幻灯片为var right (active + 2) % 10,因此当有效格为9时,即11%10为1,这是正确的,[7,8,9,10,1]

左侧,我会var left = active - 2; if (left < 1) left = 10-left

编辑&gt;&gt;

对于左侧,我将继续使用%模数运算符,如下所示:var left = ((active - 2) + 10) % 10

答案 1 :(得分:2)

n幻灯片的数量,k表示您可以一次查看的数字幻灯片以及i有效幻灯片。在你的情况下:

n=10, k=5

然后:

right = (i + k/2 + n) % n
left  = (i - k/2 + n) % n

答案 2 :(得分:0)

为什么不通过改变数组来实际执行旋转?

这是一个小型演示,其中的项目只是字符串:

&#13;
&#13;
var data = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];

function rotate(data, output, steps) {
    // Make steps a positive value
    steps = (steps + data.length) % data.length;
    // perform the rotation on the array
    data.push(...data.splice(0, steps));
    // Display the first 5 values from the array
    output.textContent = JSON.stringify(data.slice(0, 5));
}

left.onclick = rotate.bind(null, data, output, -1);
right.onclick = rotate.bind(null, data, output, 1);
// Output initial situation
output.textContent = JSON.stringify(data.slice(0, 5));
&#13;
<button id="left">&lt;</button><button id="right">&gt;</button>
<pre id="output"></pre>
&#13;
&#13;
&#13;

使用这种工作方式,活动值始终为索引2.

答案 3 :(得分:0)

作为初步思考,假设你只能访问你提到的3个数字,我只想添加一些if语句来检查元素是否在边缘。

//define the left and right edge -----------

int right_edge = element.active_slide + 2;   //+2 only if you show 5 slides
int left_edge = element.active_slide - 2;    //-2 only if you show 5 slides

if( right_edge > element.number_of_slides ){
   right_edge = right_edge - element.number_of_slides;
} 
if( left_edge == 0 ){
   left_edge = element.number_of_slides;  //=10    
}
if( left_edge < 0 ){
   left_edge = element.number_of_slides + left_edge;  
}



// check if current element is one of the edges

if( ( element.own_index == left.edge ) || ( element.own_index == right_edge ) ){
   //the element is an edge, do whatever is needed
}
else{
    //the element is not an edge
}

当然这只是一个快速思考,向您展示可以做到的一种方式。它也不是以最合适的形式编写的,例如使用模数可以为你提供更好的服务