سؤال

أنا عالق حقًا في كيفية القيام ببرمجة هذا. كيف ترسم دائرة في جافا بنصف قطرها وتشير حول الحافة؟

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

الكود الحالي الخاص بي على إطار منفصل ، لكنني بحاجة إلى إضافته إلى إطاراتي الحالية.

import java.awt.*; 
import javax.swing.*; 
import java.awt.geom.*; 

public class circle extends JFrame { 
  public circle() { 
     super("circle"); 
     setSize(410, 435); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Panel sp = new Panel(); 
     Container content = getContentPane(); 
     content.add(sp); 
     setContentPane(content); 
     setVisible(true); 
 } 

 public static void main (String args[]){
  circle sign = new circle(); 
 } 
} 

class Panel extends JPanel { 
 public void paintComponent(Graphics comp) { 
     super.paintComponent(comp); 
     Graphics2D comp2D = (Graphics2D) comp; 

     comp2D.setColor(Color.red); 
     Ellipse2D.Float sign1 = new Ellipse2D.Float(0F, 0F, 350F, 350F); 
     comp2D.fill(sign1); 
 } 
}
هل كانت مفيدة؟

المحلول

نقاط على أ دائرة قد يتم تحديدها كدالة للزاوية θ:

x = a + r cos (θ)
y = b + r sin (θ)

هنا ، زيادات من 2π/8 موضحة.

إضافة: كما هو مقترح في تعليق من قبل christoffer Hammarström ، هذا مراجعة مثال يقلل من عدد الأرقام السحرية في الأصل. يصبح العدد المطلوب من النقاط معلمة للمُنشئ. كما أنه يتكيف مع عرض الحاوية.

alt text

/** @see https://stackoverflow.com/questions/2508704 */
public class CircleTest extends JPanel {

    private static final int SIZE = 256;
    private int a = SIZE / 2;
    private int b = a;
    private int r = 4 * SIZE / 5;
    private int n;

    /** @param n  the desired number of circles. */
    public CircleTest(int n) {
        super(true);
        this.setPreferredSize(new Dimension(SIZE, SIZE));
        this.n = n;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.black);
        a = getWidth() / 2;
        b = getHeight() / 2;
        int m = Math.min(a, b);
        r = 4 * m / 5;
        int r2 = Math.abs(m - r) / 2;
        g2d.drawOval(a - r, b - r, 2 * r, 2 * r);
        g2d.setColor(Color.blue);
        for (int i = 0; i < n; i++) {
            double t = 2 * Math.PI * i / n;
            int x = (int) Math.round(a + r * Math.cos(t));
            int y = (int) Math.round(b + r * Math.sin(t));
            g2d.fillOval(x - r2, y - r2, 2 * r2, 2 * r2);
        }
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new CircleTest(9));
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }
}

نصائح أخرى

جرب شيئًا كهذا:

  public class CirclePanel extends JPanel
  {
    public static void main(String[] args) throws Exception
    {
        JFrame f = new JFrame();

        f.setContentPane(new CirclePanel());
        f.setSize(700,500);
        f.setVisible(true);
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        //Draws the line
        g.drawOval(0,0,this.getWidth(), this.getHeight());

        //draws filled circle
        g.setColor(Color.red); 
        g.fillOval(0,0,this.getWidth(), this.getHeight());
    }
  }

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

يستخدم minueto.

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

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