【问题标题】:Draw a circle on each edge of an n-polygon在 n 多边形的每条边上画一个圆
【发布时间】:2021-07-05 21:33:04
【问题描述】:

给定一个n 圆的列表,每个直径为d,我想生成一个n-gon(n 长的多边形),边长为d,然后绘制每个边缘都有一个圆圈。

我在开发应用程序时遇到了这个问题。

在给定每边长度a 的情况下,具有 N 条边的多边形的半径公式为

我的代码

游戏框架

import javax.swing.JFrame;


public class gameFrame extends JFrame{  
    static int width = 400;
    static int height = 400;
  
    public static void main(String[] args) {
    
        gameFrame frame = new gameFrame();
        gamePanel panel = new gamePanel();

        frame.add(panel);
    
        frame.setTitle("Tutorial");
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.setVisible(true);
        frame.setResizable(true);
    
        panel.initializeList();
        panel.fpsTimer.start();
    
    }
}

游戏面板

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import java.util.ArrayList;

import javax.swing.JPanel;
import javax.swing.Timer;

public class gamePanel extends JPanel{
    static ArrayList<Point2D> coordinates = new ArrayList<Point2D>();
    static int d = 20;

    Timer fpsTimer = new Timer(10, new ActionListener() {
        @Override
            public void actionPerformed(ActionEvent e) {
            repaint();
        
        }
    });

    public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
        
            //paint the circles with the coordinates in list 'coordinates'
            for(Point2D point : coordinates) {
                g2d.setColor(Color.BLACK);
                Shape circle = new Arc2D.Double(point.x,
                        point.y,
                        d,
                        d,
                        0 , 360, Arc2D.CHORD);
                g2d.fill(circle);
            }
    
        }

    public void initializeList() {
        Point2D center = new Point2D(0,0);
    
        int n = 15; // number of sides of polygon
        float alpha = 360/ n;    // angle of each triangle in the polygon
        float angle = 0;       // incremental angle for the loop 

        float side = d;         // desired length of each side    
        float radius = (float) (side / (2*Math.sin(Math.PI / n)));  // R = a / (2*(sin(PI/n))) formula
    
        //verifying that the circle radius isn't larger than the frame
        if(!(radius >= gameFrame.width || radius >= gameFrame.height)) {
        
            //center of the circle
            center.x = (gameFrame.width)/2;
            center.y = (gameFrame.height)/2; 
    
            for(int i = 0 ; i < n ; i++) {
                coordinates.add(new Point2D((center.x + Math.sin(angle)*radius),
                        (center.y -Math.cos(angle)*radius)));
                angle += alpha;
                }
        }
    
    
    }
}

Point2D(为简单起见)

public class Point2D {
    double x;
    double y;

    public Point2D(double x , double y) {
        this.x = x;
        this.y = y;
    }
}

输出和反射

对于n=15d=20如上图,输出为

一些圆圈重叠。 令人惊讶的是,如果我将GamePanel initializeList() 中的angle += alpha 修改为angle += alpha+0.295;,我会得到想要的结果:

对于n=14,输出更可怕:

我在这个错误上花费了大量时间。有谁知道出了什么问题?

【问题讨论】:

    标签: java polygon geometry-surface


    【解决方案1】:

    Java Math 使用弧度表示的角度。
    所以计算 alpha 的弧度如下:

    double alpha = Math.toRadians(360.0/ n);
    

    只需更新该行,它应该可以解决问题。

    此外,为了更准确,请为每个变量使用double 类型而不是float

    【讨论】:

    • 效果太棒了!我会搜索年龄:p,谢谢。
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2012-04-05
    相关资源
    最近更新 更多