圈包装 - java

时间:2009-06-20 11:15:08

标签: java swing math packing

我有一个任务是绘制一个圆圈,然后填充最多的圆圈而不触及两侧。我可以绘制圆形,我可以制作循环以六角形/蜂窝形式包装圆形,但无法控制它们是在圆圈内部还是外部。

我用过这个: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);
            }
        }




    }
}

1 个答案:

答案 0 :(得分:3)

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

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

  1. 如果大圆圈的中心与小圆圈之间的距离大于其半径的差异,则小圆圈将与大圆圈重叠或完全落在其外部。
  2. 您可以将此检查添加到您的代码中:在绘制圆圈之前,请执行此检查。只有在该圆圈过去时才绘制。

    暂时不要担心Java;在一张纸上画一张照片,绘制一个封闭的圆圈,然后看看那个陈述是否正确。然后考虑一下它可能无法覆盖的任何角落情况,就像检查一样。

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

    考虑这个问题的另一种方法可能是想象一个圆形的二维排列,以最近的排列方式排列,在x方向和y方向都延伸到无限远。现在将您的封闭圆圈放在2D排列的顶部,并消除与大圆圈重叠的所有圆圈。我不知道它是否是最佳的,但它很容易可视化。