gpt4 book ai didi

java - 在圆的边缘绘制移动圆

转载 作者:行者123 更新时间:2023-12-01 11:58:22 26 4
gpt4 key购买 nike

我的绘图遇到问题:

基本上,我画了一个圆弧:

g.drawArc(x1-75, y2, 150, 150, 90, 180);
从我得到的结果来看,这会根据矩形(在这种情况下是正方形)绘制左半个圆,其边缘为 150,左上角为 x1-75,y2。它的半径应该是 75。

现在我画一个小点:

g.fillOval(x-5, y-5, 10, 10);

我设置了

x = x1 + (75*cos(3*Math.PI/2));
y = y2 + 75 + (75*sin(3*Math.PI/2));

我相信应该将小圆圈设置在圆弧的底部。

我们来吧

int n = 0; 

现在我有一个计时器,每次滴答都会计时

n += 1;

并重新绘制组件。

这段代码不应该是:

if(n < 180){
x = (int) (x1 + (75*(Math.cos(3*Math.PI/2 - n*Math.PI/180))));
y = (int) (y2 + 75 + (75*-(Math.sin(3*Math.PI/2 - n*Math.PI/180))));
}

将小圆绕圆弧顺时针方向引导?

相反,在我看来,它会跳转到屏幕上的随机点并停留在那里。

最佳答案

使用任何类型的面向对象模型,这都会变得容易得多。从一个圆形对象开始,该对象跟踪其位置和半径,并且在给定图形对象时能够绘制自身。

从那里,我用一个 CircleOrbit 对象包围它,该对象跟踪:

  • 不移动的中心圆中心
  • 一个轨道轨道飞行器,随着时间的推移改变其位置
  • 刻度(轨道位置)。我将其实现为学位,但这很容易改变。

然后,我添加了一个方法来重新计算给定 tick 量的 oribiter 位置,即 updateOrbiterLoc()。从这里开始,创建一个帮助器来增加刻度并更新轨道器位置,以及一个简单的 JPanel 子类来绘制 CircleOrbit 是相当简单的。

最后,在 main 方法中,我创建了一个简单的 JFrame,其中包含 JPanel 子类,并创建了一个计时器来调用 >tick() 方法并重新绘制框架。

圆从 x 轴开始并顺时针旋转。旋转速度由TIMER_DELAY决定。

这是完成工作的基本可运行实现。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Point2D;

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


public class CircleOrbit{

private Circle center;
private Circle orbiter;
private int tick;

//Amount in degrees * this const = amount in radians
private static final double DEG_TO_RAD = Math.PI / 180;

private static final int TIMER_DELAY = 25;

/** Constructor for a CircleOrbit object.
* Uses the given circle as the center circle, creates an
* orbiter circle 1/10th the radius of the center and
* on the x-axis of the center circle to start.
* These constants should probably be pulled out to final ints
* in a real implementation.
*/
public CircleOrbit(Circle center){
this.center = center;
orbiter = new Circle(new Point2D.Double(), center.radius/10);
tick = 0;
updateOrbiterLoc();
}

/** Updates the location of the orbiter circle based on tick */
private void updateOrbiterLoc(){
Point2D.Double d = new Point2D.Double();
final double xCenter = center.center.x;
final double yCenter = center.center.y;
final double rad = center.radius;
d.setLocation(xCenter + rad * Math.cos(tick * DEG_TO_RAD),
yCenter + rad * Math.sin(tick * DEG_TO_RAD));
orbiter.setCenter(d);
}

/** Increases tick and recalculates the position of the orbiter */
public void tick(){
tick += 1;
updateOrbiterLoc();
}

/** Draws both of the circles in this CircleOrbit */
public void draw(Graphics2D g){
center.draw(g);
orbiter.draw(g);
}

/** Creates a new panel to draw this orbit */
public OrbitPanel getPanel(){
return new OrbitPanel();
}

public static void main(String[] args){
JFrame f = new JFrame();

final CircleOrbit c = new CircleOrbit(new Circle(new Point2D.Double(250, 250), 200));

final OrbitPanel o = c.getPanel();
f.add(o, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final Timer t = new Timer(TIMER_DELAY, null);
t.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
c.tick();
o.repaint();
t.restart();
}
});
t.start();
}

@SuppressWarnings("serial")
class OrbitPanel extends JPanel{

public OrbitPanel(){

//Quick and dirty way of making sure the panel is big enough
setPreferredSize(new Dimension(
(int)(center.center.x + center.radius * 1.1),
(int)(center.center.y + center.radius * 1.1)
));
}

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
CircleOrbit.this.draw((Graphics2D)g);
}
}

static class Circle {

private Point2D.Double center;
private double radius;

public Circle(Point2D.Double c, double r){
center = c;
radius = r;
}

public void setCenter(Point2D.Double c){
center = c;
}

public void draw(Graphics2D g){
int x = (int)(center.x - radius);
int y = (int)(center.y - radius);
int size = (int)(radius * 2);
g.drawOval(x, y, size, size);
}

public String toString(){
return center.toString() + " r=" + radius;
}
}
}

关于java - 在圆的边缘绘制移动圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28180468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com