gpt4 book ai didi

java - 在java中使用秒表来记录绘图所用的时间

转载 作者:太空宇宙 更新时间:2023-11-04 14:41:19 24 4
gpt4 key购买 nike

我的部分作业遇到了问题。我已经毫无问题地完成了第一部分,但是当我尝试记录时间时,我似乎无法让它发挥作用。在作业中指出

“圆圈绘制代码应包含在使用秒表测量的耗时中提供类。”

这是提供的圆圈代码和秒表类,任何人都可以教我如何将其与圆圈代码一起使用吗?

import java.awt.*;
import java.awt.geom.GeneralPath;
import javax.swing.*;

public class DrawCircle extends JPanel
{
Point[] points;
GeneralPath circle;
final int INC = 5;

public DrawCircle()
{
initPoints();

initCircle();
}

private void initPoints()
{
int numberOfPoints = 360/INC;
points = new Point[numberOfPoints];
double cx = 200.0;
double cy = 200.0;
double r = 100.0;
// Dimension variables
int count = 0;
for(int theta = 0; theta < 360; theta+=INC)
{
int x = (int)(cx + r * Math.cos(Math.toRadians(theta)));
int y = (int)(cy + r * Math.sin(Math.toRadians(theta)));
points[count++] = new Point(x, y);
}
}

private void initCircle()
{
circle = new GeneralPath();
for(int j = 0; j < points.length; j++)
{
if(j == 0)
circle.moveTo(points[j].x, points[j].y);
else
circle.lineTo(points[j].x, points[j].y);
}
circle.closePath();
}

protected void paintComponent(Graphics g)
{
// fill and color
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.red);
g2.fill(circle);
g2.setPaint(Color.red);
Point p1 = points[0];
for(int j = 1; j <= points.length; j++)
{
Point p2 = points[j % points.length];
g2.drawLine(p1.x, p1.y, p2.x, p2.y);
// Line coordinates
p1 = p2;
}
}

public static void main(String[] args)
{
//Main functions
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new DrawCircle());
f.setSize(400,400);
// Frame
f.setLocation(200,200);
// Center
f.setVisible(true);
}
}

这是我提供的秒表类(class)。

public class StopWatch {
private final long before;

StopWatch() {
before = System.currentTimeMillis();
//before = System.nanoTime();
}

public long elapsedTime() {
long after = System.currentTimeMillis();
//long after = System.nanoTime();
return after - before;
}
}

最佳答案

计时代码应放置在组件的实际绘图代码中。 Java Swing 在单独的线程中进行渲染,因此从主线程对其进行计时只需测量初始化 swing 所需的时间。构造函数也在主线程上执行,因此计时并不能测量绘制时间。圆的绘制将被排队到一个单独的线程中。实际的绘制是由在上述线程中触发的paintComponent方法完成的:

protected void paintComponent(Graphics g)
{
// fill and color
super.paintComponent(g);
StopWatch sw = new StopWatch(); // <-- HERE
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.red);
g2.fill(circle);
g2.setPaint(Color.red);
Point p1 = points[0];
for(int j = 1; j <= points.length; j++)
{
Point p2 = points[j % points.length];
g2.drawLine(p1.x, p1.y, p2.x, p2.y);
// Line coordinates
p1 = p2;
}
long time = sw.elapsedTime(); // <-- HERE
System.out.println("Circle took " + time + "ms to draw.");
}

请注意,super 必须是第一个调用的方法,因此它不能包含在测量中(也不应该包含在测量中)。

关于java - 在java中使用秒表来记录绘图所用的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24899575/

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