12

我想要做的是在页面上制作一个等距的不可见坐标网格。然后,我希望<div>在触发 onclick 时将 a 放置在最接近指针的任何网格坐标处。这是粗略的想法:

替代文字

我有鼠标坐标的跟踪和<div>很好的放置。我坚持的是如何解决坐标网格的问题。

首先,我是否应该将所有坐标放在一个数组中,然后将我的 onclick 坐标与之进行比较?

或者看到我的网格坐标遵循规则,我可以做一些事情,比如找出哪个坐标是我的间距最接近 onclick 坐标的倍数?

然后,我从哪里开始计算最接近的网格点坐标?最好的方法是什么?

谢谢!

4

3 回答 3

8

在计算出哪个网格点最接近 - 例如,每个块是 10x10 像素 - 要获得网格索引,您只需将它们分开 -

  1. 点击[237; 112]
  2. 10x10 块
  3. 网格指数 = [ 237/10 ; 112/10 ] = [ 23.7 ; 11.2]
  4. 将它们四舍五入以获得“最接近”
  5. 块索引为 24;11

如果您需要存储数据,您可以在单击时将网格坐标推送到数组,以供稍后参考。

于 2010-04-26T10:54:24.653 回答
7

我可以做一些事情,比如找出哪个坐标是我的间距最接近 onclick 坐标的倍数吗?

当然。网格的整个点是可以用简单的算术计算出来的,而不是绕着一大堆任意点推车。

我从哪里开始计算最接近的网格点坐标?

这是一个简单的除法,每个轴都有四舍五入。

#canvas { position: relative; width: 100px; height: 100px; border: solid red 1px; }
#nearest { position: absolute; width: 10px; height: 10px; background: yellow; }

<div id="canvas"><div id="nearest"></div></div>

var gridspacing= 10;
$('#canvas').mousemove(function(event) {
    var pos= $(this).offset();
    var gridx= Math.round((event.pageX-pos.left)/gridspacing);
    var gridy= Math.round((event.pageY-pos.top)/gridspacing);
    $('#nearest').css('left', (gridx-0.5)*gridspacing+'px').css('top', (gridy-0.5)*gridspacing+'px');
});
于 2010-04-26T11:02:24.187 回答
4

我最初是在写一个类似于 bobince 的答案,但他比我先到了那里。我喜欢这样做的方式,但他的版本有一些楼层(尽管它仍然是一个很好的答案)。

我假设您想要的是一个没有 HTML 的网格(即没有像表格那样的标记),bobince 提供了一个解决方案。在这种情况下,代码可能会针对跨浏览器兼容性、可读性、错误和速度进行显着优化。

所以,我建议代码应该更像这样:

#canvas { position: relative; width: 100px; height: 100px; border: solid red 1px; }
#nearest { position: absolute; width: 10px; height: 10px; background: yellow; }

<div id="canvas"><div id="nearest"></div></div>

var
    canvasOffset = $("div#canvas").offset(),
    // Assuming that the space between the points is 10 pixels. Correct this if necessary.
    cellSpacing = 10;

$("div#canvas").mousemove(function(event) {
    event = event || window.event;
    $("div#nearest").css({
        top: Math.round((mouseCoordinate(event, "X") - canvasOffset.left) / cellSpacing) * cellSpacing + "px",
        left: Math.round((mouseCoordinate(event, "Y") - canvasOffset.top) / cellSpacing) * cellSpacing + "px"
    });
});

// Returns the one half of the current mouse coordinates relative to the browser window.
// Assumes the axis parameter to be uppercase: Either "X" or "Y".
function mouseCoordinate(event, axis) {
    var property = (axis == "X") ? "scrollLeft" : "scrollTop";
    if (event.pageX) {
        return event["page"+axis];
    } else {
        return event["client"+axis] + (document.documentElement[property] ? document.documentElement[property] : document.body[property]);;
    }
};

mouseCoordinate() 函数是这两个函数的简化版本:

function mouseAxisX(event) {
    if (event.pageX) {
        return event.pageX;
    } else if (event.clientX) {
        return event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
    }
};

function mouseAxisY(event) {
    if (event.pageY) {
        return event.pageY;
    } else if (event.clientY) {
        return event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
    }
};

我真的很喜欢你的项目的想法,也许我会自己做一些类似的事情:D

于 2010-04-26T18:42:51.017 回答