计算鼠标位置是否在钻石多边形的边界内

时间:2014-11-20 12:51:57

标签: java mouseover point-in-polygon

我在面板上绘制了一颗钻石,我正在尝试计算鼠标位置是否在其范围内。问题是尝试钻石,它需要四个坐标组成四条线来创建形状。diamond

最简单的方法是在钻石的边界内创建/拟合一个正方形,但我想考虑外面剩余的三角形区域。我最初认为我试图计算两点之间的斜率,并通过将斜率加到等式中来确定鼠标的x和y是否与线相交,但事实证明它更难以实现。鉴于钻石的中心不为零,构成TOP-> RIGHT,RIGHT-> BOTTOM和BOTTOM-> LEFT。

是否有更简单的实现来检查鼠标的x,y是否在钻石的范围内?

1 个答案:

答案 0 :(得分:2)

在伪代码中(为了更具可读性):

Point org = new Point(64, 32); // Center.
Point radii = new Point(32, 16); // Half the size.

Point mousePos = ...

mousePos -= org; // Relative to the center.
boolean inside = Math.abs(mousePos.x) * radii.y + Math.abs(mousePos.y) * radii.x
                 <= radii.x * radii.y;

数学知道(0,radii.y)和(radii.x,0)确定正象限中的边界线。 这取决于上面的公式。

static boolean isInsideDiamond(int x, int y, int[] xs, int[] ys) {
    int minX = xs[0];
    int maxX = minX;
    int minY = ys[0];
    int maxY = minY;
    for (int i = 1; i < 4; ++i) {
        minX = Math.min(minX, xs[i]);
        maxX = Math.max(maxX, xs[i]);
        minY = Math.min(minY, ys[i]);
        maxY = Math.max(maxY, ys[i]);
    }

    int orgX = (minX + maxX) / 2;
    int orgY = (minY + maxY) / 2;
    int radX = (maxX - minX) / 2;
    int radY = (maxY - minY) / 2;

    return isInsideDiamond(x, y, orgX, orgY, radX, radY);
}

static boolean isInsideDiamond(int x, int y, int orgX, int orgY, int radX,
        int radY) {
    x -= orgX;
    x = Math.abs(x);
    y -= orgY;
    y = Math.abs(y);
    return x * radY + y * radX <= radX * radY;
}

顺便说一下:

Polygon diamond = new Polygon(xs, ys, 4);
boolean inside = diamond.contains(x, y);