0

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

最简单的方法是在钻石的边界内创建/拟合一个正方形,但我想考虑外面的剩余三角形区域。我最初以为我试图计算两点之间的斜率,并通过将斜率添加到方程中来确定鼠标的 x 和 y 是否与线相交,但事实证明,当涉及到线时,这要困难得多假设菱形的中心不为零,则构成 TOP->RIGHT、RIGHT->BOTTOM 和 BOTTOM->LEFT。

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

4

1 回答 1

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, radius.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);
于 2014-11-20T13:31:41.453 回答