我现在正在写一个小游戏,我遇到了一个问题。我需要在一个大圆的边界上画64个小圆。所以我想要这样的东西:
我已经试过很多方法,但都不管用。如何在java中使用java实现这一点。awt。组件#paint()方法和java。awt。图形课?
谢谢
感谢@Mad程序员的回答。我结合了他的代码和@WJS使用渲染提示的建议以及我自己的想法,下面的代码对我很有效。
package gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
/**
* Thanks to <a
* href=https://stackoverflow.com/users/992484/madprogrammer>@MadProgrammer</a>
* on StackOverflow for the geometry part (<a
* href=https://stackoverflow.com/questions/70398744/java-awt-draw-elements-around-a-circle>Source
* code</a>)
*/
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JComponent {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return getParent().getSize();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
//Thanks to @WJS for the idea
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int midX = getWidth() / 2;
int midY = getHeight() / 2;
int min = Math.min(getHeight() / 2, getWidth() / 2);
Dimension size = new Dimension(min / 20, min / 20);
double minsize = Math.min(size.getHeight(), size.getWidth());
double radius = min - minsize;
g2d.setColor(Color.BLACK);
for (int index = 0; index < 64; index++) {
double angle = (360d / 64d) * index;
double rads = Math.toRadians(angle - 90); // 0 becomes the top
Point2D poc = new Point2D.Double(Math.cos(rads) * radius, Math.sin(rads) * radius);
g2d.fillOval((int) (midX + poc.getX() - 2), (int) (midY + poc.getY() - 2), size.width, size.height);
}
g2d.dispose();
}
}
}
这里有一种方法(大部分是锅炉板,用于安装容纳框架和面板)。它使用正弦和余弦
方法来计算单位
圆的点。然后,通过先乘以所需较大圆的半径
,然后通过添加中心x,y
偏移量,在面板中将其居中来调整这些点。
它包含的唯一真正特别的东西是
public class CircleBorder extends JPanel {
JFrame frame = new JFrame("Circle Border");
static int BIG_RADIUS = 200;
static int NCIRCLES = 60;
static int WIDTH = 500;
static int HEIGHT = 500;
public static void main(String[] args ) {
SwingUtilities.invokeLater(()->new CircleBorder().start());
}
public void start() {
addMouseWheelListener((we)-> {
int rot = we.getWheelRotation();
if (NCIRCLES < 70 && rot > 0 || NCIRCLES > 7 && rot < 0) {
NCIRCLES += rot;
}
repaint();
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.pack();
// center on screen
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(WIDTH,HEIGHT);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int centerX = WIDTH/2;
int centerY = HEIGHT/2;
double angleIncrement = 2*Math.PI/NCIRCLES;
g2d.setColor(Color.RED);
// the next two lines adjusts the little radius so that each
// outer circle will be one diameter apart.
int bigD = (int)(Math.PI*2*BIG_RADIUS);
int littleRadius = bigD/(NCIRCLES*4);
// Compute the x and y coordinates of the center of the outer
// circles. Then iterate once around the circle based on the
// computed angle above to draw the circumference. The little
// radius is subtracted to ensure those circles are
// centered on the large circles circumference.
double angle = 0;
for (int i = 0; i < NCIRCLES; i++) {
int x = (int)(centerX + Math.cos(angle)*BIG_RADIUS)
- littleRadius;
int y = (int)(centerY + Math.sin(angle)*BIG_RADIUS)
- littleRadius;
g2d.fillOval(x,y,littleRadius*2,littleRadius*2);
angle += angleIncrement;
}
g2d.dispose();
}
}
所以,你的基本问题归结为“基于给定角度在圆上找到一点”
一个快速的谷歌会找到一些资源,比如查找圆上一个点的坐标,坦率地说,我是个白痴,所以我会缩小搜索范围,将Java包括在内,这会让我们了解如何使用Java计算圆上点的坐标?-含糖的
所以基本的计算可能看起来像
double xPosy = Math.cos(rads) * radius);
double yPosy = Math.sin(rads) * radius);
现在,这解决了问题的核心方面。其余的归结为简单地绘制结果。请参阅在AWT和Swing中执行自定义绘画和绘画作为起点,以及2D图形以获得对应用编程接口的更详细了解。
现在,综上所述,你可能会得到一个类似于。。。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int midX = getWidth() / 2;
int midY = getHeight() / 2;
Dimension size = new Dimension(4, 4);
g2d.setColor(Color.BLACK);
for (int index = 0; index < 64; index++) {
double angle = (360d / 64d) * index;
Point2D poc = getPointOnCircle(angle, 100 - 4);
Rectangle2D box = new Rectangle2D.Double(midX + poc.getX() - 2, midY + poc.getY() - 2, size.width, size.height);
g2d.draw(box);
}
g2d.dispose();
}
protected Point2D getPointOnCircle(double degress, double radius) {
double rads = Math.toRadians(degress - 90); // 0 becomes the top
return new Point2D.Double(Math.cos(rads) * radius, Math.sin(rads) * radius);
}
}
}
所以,现在,你应该意识到我的“方块”是方形的,而不是像你的“钻石”形状的。这就是你必须开始做一些工作的地方。
如果我正在处理这个问题,我可能会受到诱惑,创建一个自定义形状,或者对框
和平移它的位置进行45度变换来渲染它,或者只是将整个结果旋转45度,但这会带来一大堆其他问题,这取决于你想用它做什么
我正在使用OpenCV和Python在图像中查找圆。我能够使用OpenCV教程中的Hough圆变换代码找到圆。我想在圆心周围裁剪一个矩形。我没有能够得到正确的裁剪功能,并尝试了多种裁剪组合,要么得到了一个错误或图像的不正确部分。有人能说明我应该如何输入裁剪坐标吗?这就是我一直遇到的错误: 错误:(-215)大小。宽度 谢谢!
可以使用包的相应方法在图像上绘制各种形状,如圆形,矩形,线条,椭圆,多段线,凸起,多段线,多段线。 可以使用类的方法在图像上绘制一个圆形。 以下是这种方法的语法 - 该方法接受以下参数 - mat - Mat对象,表示要在其上绘制圆的图像。 point - 代表圆中心的对象。 radius - 表示圆的半径的整型变量。 scalar - 表示圆的颜色的标量对象(BGR)。 thickness -
圆弧被定义为假想的圆周上任意两点之间的部分。Canvas的API提供了两个绘制圆弧的方法:arc()和arcTo()方法。 arc()方法 使用arc()方法绘制圆弧时,假想的圆由圆心和半径来定义,两个点由起始角度和结束角度来定义,还需要一个参数来定义绘制方向。故,arc()方法的格式为: arc(x, y, radius, startAngle, endAngle [, anticlockwi
虽然HTML5的画布API未提供直接绘制圆形的方法,但我们一定可以通过绘制一个完全闭合的圆弧来创建这样一个方法。 图1-3 绘制圆弧 绘制步骤 按照以下步骤,在画布的中央绘制一个圆: 1. 定义2D画布上下文: window.onload = function(){ var canvas = document.getElementById("myCanvas"); var conte
使用HTML5画布时,有时候需要绘制完美的圆弧。如果你对绘制彩虹、笑脸、图表等感兴趣,本节将是你努力的起点。 图1-3 绘制圆弧 绘制步骤 按照以下步骤绘制一条圆弧: 1. 定义2D画布并设置圆弧样式: window.onload = function(){ var canvas = document.getElementById("myCanvas"); var context
问题内容: 我正在尝试使三个对象绕一个圆旋转。到目前为止,我已经能够使一个对象绕圆旋转。如果不弄乱代码,我将一无所获。谁能建议最好的方法来做到这一点?这是代码的一部分。谢谢! 问题答案: jQuery解决方案,适用于任意数量的外部项目。