سؤال

لدي مهمة رسم دائرة ثم ملئها بأكبر عدد من الدوائر دون لمس الجوانب.يمكنني رسم الدائرة، ويمكنني إنشاء حلقات لتعبئة الدائرة بتنسيق سداسي/قرص العسل، لكن لا يمكنني التحكم فيما إذا كانت داخل الدائرة أم خارجها.

لقد استخدمت هذا: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);
            }
        }




    }
}
هل كانت مفيدة؟

المحلول

كل هذه الأرقام السحرية تجعلني أشعر بالإحباط قليلاً.أنت جديد على Java، وهذا واجب منزلي، لذا أفهم سبب قيامك بذلك، لكنني لا أوصي به إذا كنت تقوم بالكثير من البرمجة في المستقبل.

أنت بحاجة إلى خوارزمية أو وصفة لتحديد متى تقع دائرة صغيرة من الداخل خارج الدائرة الكبيرة التي تحاول تعبئتها.فكر في الطرق التي يمكنك من خلالها القيام بذلك:

  1. إذا كانت المسافة بين مركز الدائرة الكبيرة والدائرة الصغيرة أكبر من الفرق في نصفي قطريهما، فإن الدائرة الصغيرة ستتداخل مع الدائرة الكبيرة أو تقع خارجها تمامًا.

يمكنك إضافة هذا الاختيار إلى الكود الخاص بك:قبل أن ترسم الدائرة مباشرة، قم بإجراء هذا الفحص.ارسم فقط إذا مرت تلك الدائرة.

لا تقلق بشأن Java للحظة؛ارسم لنفسك صورة على قطعة من الورق، وارسم تلك الدائرة المغلقة والمعبأة، وانظر ما إذا كانت هذه العبارة صحيحة.ثم فكر في أي مواقف ركنية قد لا تغطيها، تمامًا مثل الشيك.

سأقدم توصيتين أخريين.أولاً، قم بذلك يدويًا دون استخدام جهاز كمبيوتر مرة واحدة حتى ترى كيف قد تبدو الإجابة "الصحيحة".ثانيًا، انظر إذا كان بإمكانك فصل حساب الدوائر عن جزء الرسم.قد يجعل عملك أسهل، لأنه يمكنك التركيز على شيء واحد في كل مرة.يطلق عليه "التحلل".يمكنك حل المشكلات المعقدة عن طريق تقسيمها إلى أجزاء أصغر يسهل التحكم فيها.في هذه الحالة، يطلق عليه أيضًا "فصل عرض النموذج".ربما تحتاج إلى معرفة ذلك يومًا ما.

ربما هناك طريقة أخرى للتفكير في هذه المشكلة وهي تخيل ترتيب ثنائي الأبعاد للدوائر، معبأة في أقرب ترتيب لها، وتمتد إلى ما لا نهاية في كلا الاتجاهين x وy.الآن، خذ دائرتك المحيطة، وضعها فوق الترتيب ثنائي الأبعاد، وقم بإزالة جميع الدوائر التي تتداخل مع الدائرة الكبيرة.لا أعرف ما إذا كان سيكون الأمثل، ولكن من السهل تصوره.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top