循环打包-java

循环打包-java,java,swing,math,packing,Java,Swing,Math,Packing,我的任务是画一个圆圈,然后在不接触边的情况下用最多的圆圈填充。我可以画这个圆,我可以用六边形/蜂窝状的格式来包装这个圆,但是我不能控制它们是在圆的内部还是外部 我用过这个:g.drawOval(50,50,300,300);指定我的圆。因为我实际上指定了一个正方形作为边界,所以我不能确定圆的边界在哪里。所以我基本上是把正方形填满圆圈,而不是把圆形填满 能给我指一下正确的方向吗?我是java新手,所以不确定我是否用了完全错误的方法。我的代码如下。我有另一个类用于框架,另一个类中包含main imp

我的任务是画一个圆圈,然后在不接触边的情况下用最多的圆圈填充。我可以画这个圆,我可以用六边形/蜂窝状的格式来包装这个圆,但是我不能控制它们是在圆的内部还是外部

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

能给我指一下正确的方向吗?我是java新手,所以不确定我是否用了完全错误的方法。我的代码如下。我有另一个类用于框架,另一个类中包含main

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




    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
类DrawCircle扩展了JPanel
{
专用int宽度、高度、直径;
公共抽油机d;
公众圈子()
{
宽度=400;
高度=400;
直径=300;
}
公共组件(图形g)
{
超级组件(g);
g、 setColor(Color.blue);
g、 drawOval(50,50,300,300);
对于(int i=50;i40;j=j-10)
{
g、 drawOval(j,i,10,10);
}
}
}
}

所有这些神奇的数字让我有点畏缩。您是Java新手,这是一个家庭作业,所以我理解您为什么要这么做,但如果您将来做很多编程,我不推荐您这么做

你需要一个算法或配方来决定什么时候里面的一个小圆落在你要打包的大圆的外面。考虑一下你可能会采用的方法:

  • 如果大圆和小圆的中心之间的距离大于它们半径的差值,则小圆将与大圆重叠或完全落在大圆之外
  • 您可以将此检查添加到代码中:在绘制圆之前,执行此检查。只有当那个圆通过时才画

    一秒钟也不用担心Java;在一张纸上画一幅画,画一个圈,看看这句话是否正确。然后想想它可能没有涵盖的任何角落情况,就像一张支票

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


    也许思考这个问题的另一种方式是想象一个二维排列的圆,以最接近的排列排列,在x和y方向上延伸到无穷远。现在,取你的封闭圆,将其置于二维排列的顶部,并消除所有与大圆重叠的圆。我不知道这是否是最优的,但很容易想象。

    谢谢。我通常不使用魔法数字,但我只是想先让它发挥作用,然后再修改它们。我真的想过你怎么想的,只是不知道该怎么做。既然你提到了,我真不敢相信我没看见。我在寻找更难的东西,同时想知道哪些库函数可能是我不知道的。很好,JR。少担心库,多担心你的问题。你的大脑是你拥有的最好的工具。如果你能把它写在纸上,你就可以指导计算机做什么。我相信你会很快解决的。