Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保在JPanel上绘制的形状不重叠?_Java_Swing_Graphics_Jpanel - Fatal编程技术网

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()));
}