【问题标题】:Finding the closest grid coordinate to the mouse position with javascript/jQuery使用 javascript/jQuery 查找最接近鼠标位置的网格坐标
【发布时间】:2010-04-26 10:40:24
【问题描述】:

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

我已经跟踪了鼠标坐标和<div> 的放置工作正常。我坚持的是如何解决坐标网格的问题。

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

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

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

谢谢!

【问题讨论】:

    标签: javascript jquery grid snapping


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,这听起来太棒了!让我看看我是否完全理解。所以基本上,每个网格点都有一个识别参考 [0->c, 0->r](c= 列数,r= 行数)。然后我只需要将网格点参考转换为真实坐标。 xref=3; startxcoord=10; spacing=50; xcoord=(xref*spacing)+startxcoord;
    • 一切都应该这样解释。谢谢!
    【解决方案2】:

    我可以做一些事情,比如找出哪个坐标是我的间距最接近 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');
    });
    

    【讨论】:

    【解决方案3】:

    我最初是在写一个类似于 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

    【讨论】:

    • 哦,是的,我在获取鼠标位置时忘记了浏览器兼容性!如果你有兴趣acorn.host22.com/tiles2.html 是我迄今为止想出的。非常丰富多彩!
    • 刚刚意识到其他事情。您需要考虑调整窗口大小,这需要通过添加以下内容反映在 canvasOffset 中:$(window).resize(function() { canvasOffset = $("#canvas").offset() });
    • 好电话,确实如此。调整窗口大小会使 canvasOffset 混乱。有一件事让我想知道,你正在使用 jQuery,但仍然在没有 jQuery 的情况下做很多可以用 jQuery 优化的东西?
    • 我是 jQuery 和 javascript 的初学者,所以我并不惊讶我的脚本中有一些愚蠢的事情。特别是什么?评论可能不是讨论我的剧本的最容易的地方,但我非常感谢您提供的任何建议!我在我的个人资料中添加了一个电子邮件地址。
    • 那我给你写一封电子邮件。我将通过我的一些更改传递你的代码,这样你就可以看到你做错了什么;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多