упаковка кругов - Ява - PullRequest
1 голос
/ 20 июня 2009

У меня есть задача нарисовать круг, а затем заполнить его большим количеством кругов, не касаясь сторон. Я могу нарисовать круг и сделать циклы, чтобы упаковать круг в шестиугольный / сотовый формат, но не могу контролировать, находятся ли они внутри или снаружи круга.

Я использовал это: 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 Ответ

3 голосов
/ 20 июня 2009

Все эти магические числа заставляют меня немного съеживаться. Вы новичок в Java, и это домашнее задание, поэтому я понимаю, почему вы это делаете, но я бы не советовал, если вы будете много программировать в будущем.

Вам нужен алгоритм или рецепт, чтобы решить, когда маленький круг внутри выходит за пределы большого круга, который вы пытаетесь упаковать. Подумайте, как вы можете это сделать:

  1. Если расстояние между центром большого круга и маленьким кругом больше, чем разница в их радиусах, маленький круг будет перекрывать большой круг или полностью падать за его пределы.

Вы можете добавить эту проверку к своему коду: непосредственно перед тем, как нарисовать круг, выполните эту проверку. Нарисуйте, только если этот круг пройдет.

Не беспокойтесь о Java на секунду; нарисуйте на листе бумаги рисунок, нарисуйте этот замкнутый и упакованный кружок и посмотрите, правильно ли это утверждение. Затем подумайте о любых угловых ситуациях, которые он может не охватить, просто как проверку.

Я сделаю еще две рекомендации. Во-первых, сделайте это вручную без компьютера один раз, чтобы увидеть, как может выглядеть «правильный» ответ. Во-вторых, посмотрите, можете ли вы отделить расчет кругов от чертежной части. Это может облегчить вашу работу, потому что вы можете сосредоточиться на одной вещи за раз. Это называется "разложение". Вы решаете сложные проблемы, разбивая их на более мелкие, более управляемые части. В этом случае это также называется «разделение вида модели». Возможно, вам когда-нибудь придется это знать.

Возможно, еще один способ подумать об этой проблеме - представить двумерное расположение окружностей, упакованных в их ближайшем расположении, простирающихся до бесконечности как в x-, так и в y-направлениях. Теперь возьмите свой окружающий круг, поместите его поверх 2D-схемы и удалите все круги, которые перекрывают большой круг. Я не знаю, будет ли это оптимальным, но это легко визуализировать.

...