我在面板上绘制了一颗钻石,我正在尝试计算鼠标位置是否在其范围内。问题是尝试钻石,它需要四个坐标组成四条线来创建形状。
最简单的方法是在钻石的边界内创建/拟合一个正方形,但我想考虑外面剩余的三角形区域。我最初认为我试图计算两点之间的斜率,并通过将斜率加到等式中来确定鼠标的x和y是否与线相交,但事实证明它更难以实现。鉴于钻石的中心不为零,构成TOP-> RIGHT,RIGHT-> BOTTOM和BOTTOM-> LEFT。
是否有更简单的实现来检查鼠标的x,y是否在钻石的范围内?
答案 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);