1

我的任务是画一个圆圈,然后在不接触边的情况下用最多的圆圈填充。我可以画圆,我可以制作循环以六边形/蜂窝格式打包圆,但无法控制它们是在圆内还是在圆外。

我用过这个:g.drawOval(50, 50, 300, 300); 指定我的圈子。鉴于我实际上指定了一个正方形作为我的边界,我实际上无法确定圆的边界在哪里。所以我基本上是在包装满是圆圈的正方形而不是满是圆圈的圆圈。

有人可以指出我正确的方向吗?我是java新手,所以不确定我是否以完全错误的方式完成了这项工作。我的代码如下。我有另一个框架类和另一个主类。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class DrawCircle extends JPanel
{
    private int width, height, diameter;
    public DrawFrame d;

    public DrawCircle()
    {
        width = 400;
        height = 400;
        diameter = 300;
    }


    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.blue);
        g.drawOval(50, 50, 300, 300);

        for(int i=50; i<200; i=i+20)
        {
            for(int j=50; j<350; j=j+10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }

        for(int i=60; i<200; i=i+20)
        {
            for(int j=55; j<350; j=j+10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }

        for(int i=330; i>190; i=i-20)
        {
            for(int j=340; j>40; j=j-10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }

        for(int i=340; i>190; i=i-20)
        {
            for(int j=345; j>40; j=j-10)
            {
                g.drawOval(j, i, 10, 10);
            }
        }




    }
}
4

1 回答 1

3

所有这些神奇的数字让我有点畏缩。您是 Java 新手,而且它是家庭作业,所以我理解您为什么要这样做,但如果您将来进行大量编程,我不建议您这样做。

您需要一种算法或配方来确定内部的小圆圈何时落在您要打包的大圆圈之外。想想你可能会这样做的方式:

  1. 如果大圆和小圆的圆心距离大于它们的半径差,则小圆将与大圆重叠或完全落在大圆之外。

您可以将此检查添加到您的代码中:就在绘制圆圈之前,执行此检查。仅当该圆圈通过时才绘制。

暂时不用担心 Java;在一张纸上给自己画一幅画,画出封闭的圆圈,看看这个说法是否正确。然后考虑它可能无法涵盖的任何角落情况,就像检查一样。

我再提两个建议。首先,在没有计算机的情况下手动完成一次,这样您就会看到“正确”答案的样子。其次,看看是否可以将圆的计算与绘图部分分开。它可能会使您的工作更轻松,因为您可以一次专注于一件事。这叫做“分解”。您可以通过将复杂问题分解成更小、更易于管理的部分来解决它们。在这种情况下,也称为“模型-视图分离”。有一天你可能需要知道这一点。

Maybe another way to think about this problem would be to imagine a 2D arrangement of circles, packed in their closest arrangement, extending to infinity in both the x- and y-directions. Now take your enclosing circle, put it on top of the 2D arrangement, and eliminate all the circles that overlap the big circle. I don't know if it'll be optimal, but it's easy to visualize.

于 2009-06-20T11:46:25.193 回答