首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >圆包装- java

圆包装- java
EN

Stack Overflow用户
提问于 2009-06-20 11:15:08
回答 1查看 2.7K关注 0票数 1

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

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

请给我指个方向好吗?我是java的新手,所以我不确定我是不是用了完全错误的方式。我的代码如下。我有另一个frame类,还有一个包含main的类。

代码语言:javascript
复制
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);
            }
        }




    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-20 11:46:25

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

你需要一个算法或配方来决定什么时候内部的一个小圆圈落在你想要打包的大圆圈之外。想一想你可以这样做的方式:

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

您可以将此检查添加到您的代码中:就在绘制圆之前,执行此检查。只有在那个圆通过的情况下才能画。

不要担心Java,在一张纸上画一幅画,画一个封闭的、打包的圆圈,看看这句话是否正确。然后想一想它可能没有覆盖的任何角落情况,就像检查一样。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1021426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档