Java 如何确保在JPanel上绘制的形状不重叠?
考虑到任何形状都不应相互重叠,为第二个形状定义适当坐标的最佳方法是什么?以下是计时器触发时执行的操作代码:Java 如何确保在JPanel上绘制的形状不重叠?,java,swing,graphics,jpanel,Java,Swing,Graphics,Jpanel,考虑到任何形状都不应相互重叠,为第二个形状定义适当坐标的最佳方法是什么?以下是计时器触发时执行的操作代码: @Override public void actionPerformed(ActionEvent e) { if(allowedToDrawRing || allowedToDrawSquare){ xRing = (int) ((getWidth() - ringSize) * (Math.random())); yRing
@Override
public void actionPerformed(ActionEvent e) {
if(allowedToDrawRing || allowedToDrawSquare){
xRing = (int) ((getWidth() - ringSize) * (Math.random()));
yRing = (int) ((getHeight() - ringSize) * (Math.random()));
xSquare = (int) ((getWidth() - squareSize) * (Math.random()));
ySquare = (int) ((getHeight() - squareSize) * (Math.random()));
isOverlaped = xSquare>=xRing && xSquare<=(ringSize+xRing) && ySquare>=yRing && ySquare<=(yRing+ringSize);
while (isOverlaped) {
xSquare = (int) ((getWidth() - squareSize) * (Math.random()));
ySquare = (int) ((getHeight() - squareSize) * (Math.random()));
isOverlaped = xSquare>=xRing && xSquare<=(ringSize+xRing) && ySquare>=yRing && ySquare<=(yRing+ringSize);
}
setParamsRing(xRing, yRing, ringSize);
setParamsSquare(xSquare,ySquare, squareSize);
repaint();
}
}
你需要换衣服
while ((xSquare + squareSize) >= xRing && xSquare <= (ringSize + xRing) && (ySquare + squareSize) >= yRing && ySquare <= (ringSize + yRing)) {
xSquare = (int) ((getWidth() - squareSize) * (Math.random()));
ySquare = (int) ((getHeight() - squareSize) * (Math.random()));
}
while((xSquare+squareSize)>=xRing&&xSquare=yRing&&ySquare不是最好的答案,但是你可以使用for
循环来代替while并向下迭代直到没有重叠。它是按原样工作的吗?xRing、yRing是环的中心还是左上角不,经过一些迭代后,它重叠了,xRing,yRing-用于g.drawOval(xRing,yRing,ringSize,ringSize);谢谢,但它一直重叠!为什么你认为“ringSize是圆的半径,而不是直径。”-这是重量和高度的值,它们彼此相等-因此它是直径!@RCola好的,我检查了API:ringSize是直径。检查我的新条件;我认为它会起作用。我猜你总是与左边(或更高)的正方形重叠你可以有一个正方形,它的左边缘在环的左边,但是正方形的右边缘在环的里面。你的初始条件是不重叠,我的不重叠。
@Override
public void actionPerformed(ActionEvent e) {
if (allowedToDrawRing || allowedToDrawSquare) {
xRing = (int) ((getWidth() - ringSize) * (Math.random()));
yRing = (int) ((getHeight() - ringSize) * (Math.random()));
xSquare = (int) ((getWidth() - squareSize) * (Math.random()));
ySquare = (int) ((getHeight() - squareSize) * (Math.random()));
while( !(
(xSquare + squareSize) < (xRing)
|| (xSquare) > (xRing + ringSize )
|| (ySquare + squareSize) < (yRing)
|| (ySquare) > (yRing + ringSize)
)
){
xSquare = (int) ((getWidth() - squareSize) * (Math.random()));
ySquare = (int) ((getHeight() - squareSize) * (Math.random()));
}
setParamsRing(xRing, yRing, ringSize);
setParamsSquare(xSquare, ySquare, squareSize);
}
repaint();
}
public mull() {
timer = new Timer(50, this);
timer.setInitialDelay(500);
timer.start();
}
while ((xSquare + squareSize) >= xRing && xSquare <= (ringSize + xRing) && (ySquare + squareSize) >= yRing && ySquare <= (ringSize + yRing)) {
xSquare = (int) ((getWidth() - squareSize) * (Math.random()));
ySquare = (int) ((getHeight() - squareSize) * (Math.random()));
}