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 }

转载于:https://www.cnblogs.com/zengjfgit/p/5094721.html

Java Cardioid 心脏形曲线 (整理)相关推荐

  1. 零基础快速学习Java技术的方法整理

    在学习java技术这条道路上,有很多都是零基础学员,他们对于java的学习有着很多的不解,不知怎么学习也不知道如何下手,其实Java编程涉及到的知识点还是非常多的,我们需要制定java学习路线图这样才 ...

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

    1 /** 2 * Java 动态写轮眼 SharingganJPanel (整理) 3 * 4 * 2016-1-2 深圳 南山平山村 曾剑锋 5 * 设计声明: 6 * 1.虽然岸本是日本人,而我 ...

  3. Java经典面试题整理及答案详解(八)

    简介: Java经典面试题第八节来啦!本节面试题包含了进程.线程.Object类.虚拟内存等相关内容,希望大家多多练习,早日拿下心仪offer- 了解更多: Java经典面试题整理及答案详解(一) J ...

  4. Java经典面试题整理及答案详解(三)

    简介: 以下是某同学面试时,面试官问到的问题,关于面试题答案可以参考以下内容- 上一篇:Java经典面试题整理及答案详解(二) Java面试真题第三弹接住!相信通过前两节的学习,大家对于Java多少有 ...

  5. 高级 Java 面试通关知识点整理

    转载自 高级 Java 面试通关知识点整理 1.常用设计模式 单例模式:懒汉式.饿汉式.双重校验锁.静态加载,内部类加载.枚举类加载.保证一个类仅有一个实例,并提供一个访问它的全局访问点. 代理模式: ...

  6. php的web表单系统源码毕设_从业十多年看了千百套Java毕设项目,整理出100个精品!免费分享...

    加班无数个昼夜看了千百套Java毕设项目,发现这100个精品!今天免费分享给大家!再给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 ...

  7. JAVA刷题方法整理

    JAVA刷题方法整理 一.String->String[] 利用String.split()实现 注:在使用String.split 方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我 ...

  8. java面试基础题整理(二)

    java面试基础题整理 文章目录 java面试基础题整理 前端技术(HTML.CSS.JS.JQuery等) 在js中怎么样验证数字? js中如何给string这个类型加方法? 谈谈js的定时器? 请 ...

  9. java爬虫知识盲区整理

    java爬虫知识盲区整理 HttpClient重定向处理 HttpClient获取Cookie的两种方式 根据关键字,Java抓取百度图片 Java网络爬虫(二)--HttpClient设置头部信息与 ...

最新文章

  1. 查看.net frameword版本
  2. mongodb性能分析方法:explain()
  3. SAP Spartacus org unit list当前行is-current的判定逻辑
  4. 作者:李海昌(1984-),男,中国科学院软件研究所助理研究员
  5. 4米乘以12米CAD图_CAD做钣金件展开的原理你知道吗?
  6. Mybatis mapper代理Dao开发
  7. toad库进行分箱操作
  8. ejb2.0详细开发过程
  9. c语言单片机矩阵键盘,51单片机矩阵键盘的C语言程序与分析
  10. 《区块链+》读书感想
  11. “最难就业季“中的大学生就业:本硕过半有着落 高职生成香饽饽
  12. AWVS安装(Windows)
  13. (三)dubbo工作原理
  14. 按条件隐藏bootstrapTable某一列
  15. MCMC和贝叶斯统计在宇宙微波背景辐射(CMB)中应用
  16. Javascript学习笔记(13_2) --js事件案例(小人快跑)
  17. you-get下载b站选集_Flash选集:酷炫效果和实用的ActionScript-第1章:Flash基本知识
  18. 要习惯同时兼顾几个学习项目
  19. 麻雀搜索算法matlab代码
  20. 谷歌联合创始人谢尔盖·布林(Sergey Brin):儿子引发了我对区块链技术的浓厚兴趣

热门文章

  1. stata安装_Stata自带的代码编辑器太丑了,那为何不使用Jupyter Notebook?
  2. 安装与使用 Trac 来管理项目
  3. 微信小程序(11)--购物车
  4. MySQL的存储引擎与日志说明
  5. JQuery系列(8) - JQuery插件开发
  6. 整型(int)转时间格式字符串及页面long型转时间格式字符串
  7. java.math.BigDecimal()的用法
  8. LeetCode:104_Maximum Depth of Binary Tree | 二叉树的最大深度 | Easy
  9. SIMD(MMX/SSE/AVX)变量命名规范心得
  10. Web后台服务开发——数据库查询之引入TypeORM