如何解决在 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 举报,一经查实,本站将立刻删除。