Java多线程心形线_Java Cardioid 心脏形曲线 (整理)

本文介绍了一个Java程序,用于绘制心脏形曲线Cardioid。代码中使用多线程动态改变心形线的幅值,实现图形的动态效果。通过调整参数,程序在JFrame中显示两个相交的心形线,背景为黑色,线条为红色。
摘要由CSDN通过智能技术生成

1 packagedemo;2

3 importjava.awt.Color;4 importjava.awt.Graphics;5

6 importjavax.swing.JFrame;7 importjavax.swing.JPanel;8

9 /**

10 * Java Cardioid 心脏形曲线 (整理)11 * 这是以前看到有关Cardioid一个故事之后,觉得好玩,那时把它实现了。12 *13 * 2016-1-2 深圳 南山平山村 曾剑锋14 */

15 public class Cardioid extendsJPanel{16 /**

17 *

  1. 18 *
  2. centerX:代表x轴中心点坐标19 *
  3. centerY:代表y轴中心店坐标20 *
21 * 整个窗口的长、宽等于2*centerX、2*centerY,这么做的目的是保证数据的统一性修改22 * 当然你也可以考虑使用长、宽来表示,然后对他们进行取一半得到中心店坐标。23 *24 */

25 static int centerX = 600/2;26 static int centerY = 600/2;27 /**

28 * angle:主要用于角度计算,下面程序中的for循环里的变量,360一个周期29 */

30 intangle;31 /**

32 *

  1. 33 *
  2. a:窗口中有2个心形图,a是其中一个的幅值34 *
  3. b:窗口中有2个心形图,b是其中一个的幅值35 *
36 * 2个心形图,2个幅值,但初始值是不一样的。37 */

38 int a = 0;39 int b = 50;40 /**

41 * 构造函数调用start()函数。
42 * 作用:开启一个线程,主要用于调整a、b的值,并刷新界面。43 */

44 publicCardioid() {45 start();46 }47 /**

48 * 重写paint()
49 * 程序流程:

  1. 50 *
  2. 调用父类paint方法、并设置背景颜色为黑色51 *
  3. 用for循环画两个发散的心形图52 *
53 */

54 @Override55 public voidpaint(Graphics graphics) {56 super.paint(graphics);57 this.setBackground(Color.black);58 graphics.setColor(Color.red);59 /*

60 * 这里是难点,主要是因为需要对坐标进行定位,下面是获取x、y的坐标公式,你可以在网上查到61 * x=a*(2*sin(t)-sin(2*t))62 * y=a*(2*cos(t)-cos(2*t))63 * 这里的x、y和网上的公式对调了,主要是因为需要进行y=x对称,网上的图是横着的,这个图是正着的。64 * sin()函数传入的是弧度制,所以需要通过angle*Math.PI/180,将角度值换成幅度值65 * 其中的500主要是用于坐标调整的,没有理由,是我自己试出来的,我也没有去深究为什么,因为功能完成了。66 */

67 for (angle = 0; angle < 360; angle++) {68 graphics.drawLine(69 centerY+(int)(a*(2*Math.sin(angle*Math.PI/180)-Math.sin(2*angle*Math.PI/180))),70 500 -(centerX+(int)(a*(2*Math.cos(angle*Math.PI/180)-Math.cos(2*angle*Math.PI/180)))),71 centerY+(int)((a+3)*(2*Math.sin((angle)*Math.PI/180)-Math.sin(2*(angle)*Math.PI/180))),72 500 -(centerX+(int)((a+3)*(2*Math.cos((angle)*Math.PI/180)-Math.cos(2*(angle)*Math.PI/180)))));73 }74 for (angle = 0; angle < 360; angle++) {75 graphics.drawLine(76 centerY+(int)(b*(2*Math.sin(angle*Math.PI/180)-Math.sin(2*angle*Math.PI/180))),77 500 -(centerX+(int)(b*(2*Math.cos(angle*Math.PI/180)-Math.cos(2*angle*Math.PI/180)))),78 centerY+(int)((b+3)*(2*Math.sin((angle)*Math.PI/180)-Math.sin(2*(angle)*Math.PI/180))),79 500 -(centerX+(int)((b+3)*(2*Math.cos((angle)*Math.PI/180)-Math.cos(2*(angle)*Math.PI/180)))));80 }81 }82 /**

83 * 创建一个匿名线程,线程主要完成以下事情:

  1. 84 *
  2. 改变a、b的值,相当于改变心形线的幅值;85 *
  3. 延时20ms;86 *
  4. 刷新界面repaint();87 *
88 */

89 public voidstart() {90 new Thread(newRunnable() {91

92 @Override93 public voidrun() {94 while (true) {95 try{96 if (a++ >100) {97 a = 0;98 }99 if (b++ >100) {100 b = 0;101 }102 Thread.sleep(20);103 repaint();104 } catch(InterruptedException e) {105 e.printStackTrace();106 }107 }108

109 }110 }).start();111 }112 /**

113 * 主函数完成以下内容:

  1. 114 *
  2. 初始化jframe窗口;115 *
  3. 创建cardioid,并将cardioid填充到jFrame中;116 *
  4. 设置jFrame可见。117 *
118 */

119 public static voidmain(String[] args) {120 JFrame jFrame = newJFrame();121 jFrame.setTitle("Cardioid");122 jFrame.setSize(centerX*2, centerY*2);123 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);124 jFrame.setLocationRelativeTo(null);125

126 Cardioid cardioid = newCardioid();127 jFrame.add(cardioid);128 jFrame.setVisible(true);129 }130 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值