软件:NetBeans 图形效果:代码:package newpackage;import java.awt.*;import javax.swing.*;import java.awt.geom.*;import java.awt.image.*;import .URL;import java.io.*;import javax.imageio.*;import java.awt.event.*;import java.util.Calendar;import javax.swing.*;public class Hello2D extends JApplet {public static void main(String s[]) {JFrame frame = new JFrame();frame.setTitle("计算机图形学");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JApplet applet = new Hello2D();applet.init();frame.getContentPane().add(applet);frame.pack();frame.setVisible(true);}public void init() {JPanel panel = new Hello2DPanel();getContentPane().add(panel);}}class Hello2DPanel extends JPanel implements ActionListener{ private BufferedImage image;AffineTransform rotH = new AffineTransform();AffineTransform rotM = new AffineTransform();AffineTransform rotS = new AffineTransform();// AffineTransform zuq=new AffineTransform ();public Hello2DPanel() {setPreferredSize(new Dimension(1400,1000));setBackground(Color.white);Timer timer=new Timer(500,this);timer.start();URL url=getClass().getClassLoader().getResource("images/zuqiu.jpg");try{image=ImageIO.read(url);}catch(IOException ex){ex.printStackTrace();}}@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);Graphics2D g2= (Graphics2D)g;g2.translate(100,100);g2.scale(0.5, 0.5);for (int i = 0; i < 12; i++) {g2.rotate(2*Math.PI/12);g2.fill3DRect(-3, -180, 6, 30, true);}Shape hour = new Line2D.Double(0, 0, 0, -80);hour = rotH.createTransformedShape(hour);Shape minute = new Line2D.Double(0, 0, 0, -120);minute = rotM.createTransformedShape(minute);Shape second = new Line2D.Double(0, 0, 0, -120);second = rotS.createTransformedShape(second);g2.setColor(Color.black);g2.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g2.draw(hour);g2.draw(minute);g2.setStroke(new BasicStroke(2));g2.draw(second);g2.scale(2,2);g2.translate(50,-150);g2.setColor(Color.DARK_GRAY);GeneralPath path=new GeneralPath();path.moveTo(200, 170);path.lineTo(800, 170);path.quadTo(950, 350, 800,530 );path.lineTo(200, 530);path.quadTo(50, 350, 200,170);Stroke stroke=new BasicStroke(4,BasicStroke.CAP_BUTT,BasicStroke.CAP_ROUND);//设置笔画g2.setStroke(stroke);g2.translate(-100, -100);//平移g2.scale(1.4,1.4 );//放大path.closePath();g2.draw(path);g2.setColor(Color.LIGHT_GRAY);g2.fill(path);Shape s1=new Rectangle2D.Double(300,250, 400, 200);Shape s2=new Ellipse2D.Double(200,250, 200, 200);Shape s3=new Ellipse2D.Double(600,250, 200, 200);g2.setColor(Color.DARK_GRAY);g2.draw(s1);g2.draw(s2);g2.draw(s3);g2.setColor(Color.GREEN);Area a1=new Area(s1);Area a2=new Area(s2);a1.add(a2);g2.fill(a1);Area a3=new Area(s3);a1.add(a3);g2.fill(s3);Font font=new Font("Serif",Font.BOLD,25);g2.setFont(font);GradientPaint gp=new GradientPaint(450,200,Color.red,220,220,Color.BLACK,true);g2.setPaint(gp);g2.drawString("四百米跑道",450, 220);g2.setColor(Color.BLACK);Stroke stroke1=new BasicStroke(1);//设置笔画g2.setStroke(stroke1);Shape s4=new Rectangle2D.Double(300,250, 400, 200);g2.draw(s4);g2.drawLine(500, 250, 500, 450);//划直线g2.drawOval(465, 315, 70, 70);g2.drawLine(300, 300, 350, 300);g2.drawLine(350, 300, 350,400);g2.drawLine(350, 400, 300,400);g2.drawLine(300, 325, 325, 325);g2.drawLine(325, 325, 325,375);g2.drawLine(325, 375, 300,375);g2.drawLine(700, 300, 650,300);g2.drawLine(650, 300, 650, 400);g2.drawLine(650, 400, 700,400);g2.drawLine(700, 325, 675,325);g2.drawLine(675, 325, 675, 375);g2.drawLine(675,375, 700,375);//绘制虚线float[] dashArray={20,20,20,20};g2.setColor(Color.BLACK);Font font2=new Font("Serif",Font.BOLD,15);g2.setFont(font2);g2.drawString("1",290,465);g2.drawString("2",290,485);g2.drawString("3",290,505);g2.drawString("4",290,525);g2.drawLine(300, 450,300 ,530);g2.setColor(Color.red);g2.drawLine(700, 450,700 ,530);float dashPhase=50;stroke =newBasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,0,dashArray,dashPhase);g2.setStroke(stroke);g2.drawLine(300, 470,700 ,470);g2.drawLine(300, 490,700 ,490);g2.drawLine(300, 510,700 ,510);Font font1=new Font("Serif",Font.BOLD,15);g2.setFont(font1);GradientPaint gp1=new GradientPaint(450,200,Color.BLACK,220,220,Color.red);g2.setPaint(gp1);g2.drawString("200米接力赛跑道",400,480);TexturePaint tp=new TexturePaint(image,new Rectangle2D.Double(550,370,image.getWidth(),image.getHeight()));g2.setPaint(tp);Shape zq=new Rectangle.Double(550,370,90,50);// zq=zuq.createTransformedShape(zq);g2.fill(zq);}@Overridepublic void actionPerformed(ActionEvent e) {int hour = Calendar.getInstance().get(Calendar.HOUR);int min = Calendar.getInstance().get(Calendar.MINUTE);int sec = Calendar.getInstance().get(Calendar.SECOND);rotH.setToRotation(Math.PI * (hour+min/60.0)/6.0);rotM.setToRotation(Math.PI * min /30.0);rotS.setToRotation(Math.PI * sec /30.0);repaint();}}。