1. package demo;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5.  
  6. import javax.swing.JFrame;
  7. import javax.swing.JPanel;
  8.  
  9. /**
  10. * Java Cardioid 心脏形曲线 (整理)
  11. * 这是以前看到有关Cardioid一个故事之后,觉得好玩,那时把它实现了。
  12. *
  13. * 2016-1-2 深圳 南山平山村 曾剑锋
  14. */
  15. public class Cardioid extends JPanel{
  16. /**
  17. * <ol>
  18. * <li>centerX:代表x轴中心点坐标
  19. * <li>centerY:代表y轴中心店坐标
  20. * </ol>
  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. int angle;
  31. /**
  32. * <ol>
  33. * <li>a:窗口中有2个心形图,a是其中一个的幅值
  34. * <li>b:窗口中有2个心形图,b是其中一个的幅值
  35. * </ol>
  36. * 2个心形图,2个幅值,但初始值是不一样的。
  37. */
  38. int a = 0;
  39. int b = 50;
  40. /**
  41. * 构造函数调用start()函数。<br>
  42. * 作用:开启一个线程,主要用于调整a、b的值,并刷新界面。
  43. */
  44. public Cardioid() {
  45. start();
  46. }
  47. /**
  48. * 重写paint()<br>
  49. * 程序流程:<ol>
  50. * <li>调用父类paint方法、并设置背景颜色为黑色
  51. * <li>用for循环画两个发散的心形图
  52. * </ol>
  53. */
  54. @Override
  55. public void paint(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. * 创建一个匿名线程,线程主要完成以下事情:<ol>
  84. * <li>改变a、b的值,相当于改变心形线的幅值;
  85. * <li>延时20ms;
  86. * <li>刷新界面repaint();
  87. * </ol>
  88. */
  89. public void start() {
  90. new Thread(new Runnable() {
  91.  
  92. @Override
  93. public void run() {
  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. * 主函数完成以下内容:<ol>
  114. * <li>初始化jframe窗口;
  115. * <li>创建cardioid,并将cardioid填充到jFrame中;
  116. * <li>设置jFrame可见。
  117. * </ol>
  118. */
  119. public static void main(String[] args) {
  120. JFrame jFrame = new JFrame();
  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 = new Cardioid();
  127. jFrame.add(cardioid);
  128. jFrame.setVisible(true);
  129. }
  130. }

Java Cardioid 心脏形曲线 (整理)的更多相关文章

  1. Java 动态写轮眼 SharinganJPanel (整理)

      /** * Java 动态写轮眼 SharingganJPanel (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * 设计声明: * 1.虽然岸本是日本人,而我个人作为其模仿者,依 ...

  2. Java 动态眨眼 EyesJPanel (整理)

    /** * Java 动态眨眼 EyesJPanel (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * 注意事项: * 1.本程序为java程序,同时感谢您花费宝贵的时间来阅读本文档: ...

  3. Java 动态太极图 DynamicTaiChi (整理)

    package demo; import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import jav ...

  4. Java笔试面试题整理第八波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  5. Java笔试面试题整理第六波(修正版)

    转载至:http://blog.csdn.net/shakespeare001/article/details/51330745 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  6. Java笔试面试题整理第五波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51321498 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  7. Java笔试面试题整理第四波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51274685 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  8. Java笔试面试题整理第三波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51247785 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  9. Java笔试面试题整理第二波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51200163 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

随机推荐

  1. 2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)

    题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你 ...

  2. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...

  3. 安卓四大组件之--service

    服务:长期后台运行的没有界面的activity,程序写法和activity类似. 安卓系统进程管理是按照一定规则的: 1.默认情况下,关闭掉一个应用程序,清空了这个应用程序的任务栈,应用程序的进程还会 ...

  4. NoSQL数据库有哪些

    NoSQL太火,冒出太多产品了,保守估计也成百上千了. 互联网公司常用的基本集中在以下几种,每种只举一个比较常见或者应用比较成功的例子吧. 1. In-Memory KV Store : Redis ...

  5. 根据ip查询地区,经纬度等-geoip2

    这项工作难度主要在数据上,数据越准确越有利. 1. 下载数据文件: http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.m ...

  6. Redis的Order Set操作

    有序集合 zadd key score1 value1 score2 value2 .. 添加元素 127.0.0.1:6379> zadd class 12 lily 13 lucy 18 l ...

  7. Linux SHELL脚本

    在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.可以通过使用shell使大量的任务自动化,shell ...

  8. Android 去掉title bar的3个方法

    1. Java代码实现 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance ...

  9. Nand flash uboot 命令详解【转】

    转自:http://blog.chinaunix.net/uid-14833587-id-76513.html nand info & nand device 显示flash的信息: DM36 ...

  10. flex 实时更新的一些方法总结

    诚为大家所知,Flash之所以优秀,就是它可以带来良好的用户体验和交互特性.既然涉及到交互性,开发人员在开发过程中必然会遇到实时更新的问题,那么,当后台数据发现变化的时候,如何让Flash端实时刷新显 ...