6

我一直在研究 JavaScript / JQuery 代码,它允许在输入框之间移动箭头键(是的,我知道这会破坏标准 UI)。

它通过循环遍历每个元素并在每个方向(左、右、上和下)找到最接近的元素来工作。

例子

P1:(0, 0), P2:(1, 0), P3:(0, 2)

P1 有一个点向右 (P2) 和一个点向上 (P3)。
第 1 点

P2 向左一点 (P1) 和向上一点 (P3)。
禁止摄影

P3 有两个点向下(P1 和 P2),但 P1 更接近。
第 1 点

因此最终的动作是:

Up
  1 -> 3
  2 -> 3
Right
  1 -> 2
Down
  3 -> 1
Left
  2 -> 1

对于此示例:
P1 有两个传入连接和两个传出连接。
P2 有一个传入连接和两个传出连接。
P3 有两个传入和一个传出连接。

这让我思考。
是否存在一组点,使得一个或多个点无法访问(0 个传入连接),或者可以证明不存在这样的集合?


旁注:
如果您忽略上/下组件(仅使用带有垂直拆分的左右),则在 P1 中不可访问的点 P3:(0, 0),P2:(2, 0),P3:(1, 4 )。


这是 JavaScript / JQuery 代码,如果它可以帮助任何人。

function arrowKeyNavigation(elements) {
    // Get the position of each element.
    var elementOffsets = [];
    elements.each(function(key, element) {
        elementOffsets[key] = $(element).offset();
    });

    // Find the closest point in each direction and store the points in data('keyNav') for later use.
    for (var i = 0; i < elementOffsets.length; i++) {
        var closestPoints = [];

        for (var j = 0; j < elementOffsets.length; j++) {
            if (i != j) {
                var distance = calcDistanceSquared(elementOffsets[i], elementOffsets[j]);
                var quadrant = calcQuadrant(elementOffsets[i], elementOffsets[j]);

                if (closestPoints[quadrant] == undefined || calcDistanceSquared(elementOffsets[i], elementOffsets[closestPoints[quadrant]]) > distance) {
                    closestPoints[quadrant] = j;
                }
            }
        }

        var closestElements = [];
        for (var j = 0; j < closestPoints.length; j++) {
            closestElements[j] = elements[closestPoints[j]];
        }

        $(elements[i]).data('keyNav', closestElements);
    }
}

// Returns the distance between two points squared.
function calcDistanceSquared(offset1, offset2) {
    ...
}

// Returns 0, 1, 2 or 3 for left, up, right and down respectively.
// If a point is EXACTLY 45 degrees it will be classified as either left / right.
function calcQuadrant(offset1, offset2) {
    ...
}
4

1 回答 1

1

我已经考虑了更多,我认为我有解决方案。证明草图如下:

假设您在平面上有有限数量的点 (R^2)。取一个任意点并将其称为您的目的地。然后采取任何其他点。正如您用红色绘制的那样,该点将 R^2 分为四个象限。根据定义,目的地位于这四个象限之一。朝着那个方向前进。可能会发生以下两种情况之一:
1)您到达目的地并完成了
2)您移动到另一个点。

如果为 2,那么您已经靠得更近了(编辑:按 1 范数距离,d((x1,y1),(x2,y2)) = |x1-x2|+|y1-y2|)。这需要更多证据,但我只是在画草图。目的地现在位于这个新点的某个象限内。

现在请注意,如果您重复此操作,始终朝着目的地方向靠近一步(这可能会改变每一步),您到目的地点的距离将每一步减少;您永远无法重新访问一个点,因为您的距离总是在减少。因此,如果您的点数有限,您最终会到达目的地。

于 2013-02-03T06:07:39.987 回答