微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 n 多边形的每条边上画一个圆 游戏框架游戏面板Point2D为简单起见

如何解决在 n 多边形的每条边上画一个圆 游戏框架游戏面板Point2D为简单起见

给定一个 n 圆的列表,每个圆的直径为 d,我想生成一个 n-gon(n 长的多边形),边长为 {{ 1}},并在它的每条边上画一个圆。

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

给定每条边的长度d,具有 N 条边的多边形的半径公式为

我的代码

游戏框架

a

游戏面板

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();
    
    }
}

Point2D(为简单起见)

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,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;
                }
        }
    
    
    }
}

输出和反射

对于如上所示的 public class Point2D { double x; double y; public Point2D(double x,double y) { this.x = x; this.y = y; } } n=15输出

有些圆圈重叠。 令人惊讶的是,如果我将 d=20 中的 angle += alpha 修改angle += alpha+0.295;,我会得到想要的结果:

对于GamePanel initializeList()输出更可怕:

在这错误上花了很多时间。有谁知道出了什么问题?

解决方法

Java Math 使用以弧度表示的角度。
所以像这样计算 alpha 弧度:

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

只需更新该行即可解决问题。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。