You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms中高效检测鼠标悬停六边形网格对象的最优方案

六边形地图鼠标悬停检测的优化方案探讨

我并非专业程序员,只是业余涉猎。我正在开发一款简易六边形地图程序,希望高效检测鼠标何时悬停在六边形元素上。我知道可以为窗体对象创建Region,但这似乎效率不高。于是我选择在每个元素内定义方形碰撞盒(Hit-box),通过取模和整数除法计算行列号,避免浮点运算。或许是受早年286处理器看重CPU周期的思维影响,我希望代码尽可能高效。

下图展示了X维度数值的大致来源,Y维度类似但未展示。红色框仅为碰撞盒尺寸示意,不会在程序中显示(图中Xodd应为xOffsetOdd)

我编写的代码如下,运行效果良好,但想了解是否有更优方法,既能检测整个六边形区域又不会过多消耗CPU。该程序仅用于个人制作地图素材,无需完美但求最优。

private void checkMapElementMouseOver(MouseEventArgs e, bool overElement, int column, int row)
{
    /*
     * Tile offests:
     * Column X increment 152
     * Column X-odd-offset 76
     * Row Y increment 68
     * Row Y-odd-offset 34
     */
    const int xPad = 10;    // Map tiles are inset
    const int yPad = 10;    // Map tiles are inset

    const int xStep = 152;  // Spacing between tile bounding boxes on a row
    const int xOffsetOdd = 76;  // Offset for tile bounding boxes on odd rows
    const int yStep = 68;   // Spacing between tile bounding boxes on a column
    const int yOffsetOdd = 34;  // Offset for tile bounding boxes on odd columns
    const int boxWidth = 56;    // Hit-box width
    const int boxHeight = 52;   // Hit-box height

    int xEven = e.X - xPad;
    int xOdd = e.X - xOffsetOdd - xPad;
    int yEven = e.Y - yPad;
    int yOdd = e.Y - yOffsetOdd - yPad;
    int modXEven = (xEven % xStep);
    int modXOdd = (xOdd % xStep);
    int modYEven = (yEven % yStep);
    int modYOdd = (yOdd % yStep);

    if ((modXEven >= 0) && (modXEven <= boxWidth) && (modYEven >= 0) && (modYEven <= boxHeight))
    {
        overElement = true; 
        column = 2 * (xEven / xStep);
        row = yEven / yStep;
    }
    else if ((modXOdd >= 0) && (modXOdd <= boxWidth) && (modYOdd >= 0) && (modYOdd <= boxHeight))
    {
        overElement = true;
        column = 1 + (2 * (xOdd / xStep));
        row = yOdd / yStep;
    }
    else
    {
        overElement = false;
        column = -1;
        row = -1;
    }
}

返回行或列值-1表示未悬停在碰撞盒上,这些值用于在列表/数组中查找对应元素。现寻求更优的检测方案。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:10:25