我可以在 JFrame(JPanel) 中沿 y=0、x=0、y=x 和 y=-x 以外的行移动对象吗?
Can I move objects in a JFrame(JPanel) along lines other than y=0, x=0, y=x and y=-x?
我想制作一个程序,在 circle/square 中绘制从 JPanel 中心移出的给定数量的点,直至无穷大。例如10个点,第一条线与y=0线成0度,第二条是36度,72, 108...
我的问题是点的坐标是整数,当我使用 Math.tan 时,它会将 dX 和 dY 舍入为 0 或 1。
dX = x2 - x1, dY = y2 - y1
例如,我想沿着与 y=0 线成 30 度角的线移动一个点。那个度数的切线是 sqrt(3)/3。 dX 始终为 1 或 -1,因此 dY 将在 +/-0,71 左右,因此它将四舍五入为 1/-1,我将得到另一条 y=x 线,45 度。
如果我降级我的程序以将点移动到某个时刻,我将能够搜索每个点的终点,然后我将能够为它们的移动编写一个函数来创建一条线.我可以沿着这些线移动点吗?
您正在寻找一种叫做画线算法的算法,有多种算法可以让您获得不同程度的线条平滑度,您可以在维基页面 here.
上阅读相关内容
在您的情况下,您不想完全绘制线条,这意味着每次在绘制之前确定要绘制的新点时都需要清除缓冲区。
Bresenham 应该给你好看的线条而不是那么复杂,你可以完整地查看它 here。
这会以 double
精度移动一个点:
public class PointMove extends JPanel {
double r = 200;
double theta = Math.PI / 4;
public OpenTets() {
new Timer(1, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
r = r + 0.05;
repaint();
}
}).start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
double x = r * Math.cos(theta);
double y = r * Math.sin(theta);
Graphics2D g2d = ((Graphics2D) g);
g2d.fill(new Ellipse2D.Double(x, y, 5, 5));
}
}
例如,将此组件添加到足够大小的 JFrame
。
想法是使用 Graphics2D.draw(Shape)
并使用 Double
精度形状(these 之一)来表示一个点。
我想制作一个程序,在 circle/square 中绘制从 JPanel 中心移出的给定数量的点,直至无穷大。例如10个点,第一条线与y=0线成0度,第二条是36度,72, 108...
我的问题是点的坐标是整数,当我使用 Math.tan 时,它会将 dX 和 dY 舍入为 0 或 1。
dX = x2 - x1, dY = y2 - y1
例如,我想沿着与 y=0 线成 30 度角的线移动一个点。那个度数的切线是 sqrt(3)/3。 dX 始终为 1 或 -1,因此 dY 将在 +/-0,71 左右,因此它将四舍五入为 1/-1,我将得到另一条 y=x 线,45 度。
如果我降级我的程序以将点移动到某个时刻,我将能够搜索每个点的终点,然后我将能够为它们的移动编写一个函数来创建一条线.我可以沿着这些线移动点吗?
您正在寻找一种叫做画线算法的算法,有多种算法可以让您获得不同程度的线条平滑度,您可以在维基页面 here.
上阅读相关内容在您的情况下,您不想完全绘制线条,这意味着每次在绘制之前确定要绘制的新点时都需要清除缓冲区。
Bresenham 应该给你好看的线条而不是那么复杂,你可以完整地查看它 here。
这会以 double
精度移动一个点:
public class PointMove extends JPanel {
double r = 200;
double theta = Math.PI / 4;
public OpenTets() {
new Timer(1, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
r = r + 0.05;
repaint();
}
}).start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
double x = r * Math.cos(theta);
double y = r * Math.sin(theta);
Graphics2D g2d = ((Graphics2D) g);
g2d.fill(new Ellipse2D.Double(x, y, 5, 5));
}
}
例如,将此组件添加到足够大小的 JFrame
。
想法是使用 Graphics2D.draw(Shape)
并使用 Double
精度形状(these 之一)来表示一个点。