Java Cardioid 心脏形曲线 (整理)

简介: 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一个故事之后,觉得好玩,那时把它实现了。
  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 }

 

目录
相关文章
|
存储 搜索推荐 安全
Onlyfans如何使用搜索功能?Onlyfans如何搜索博主?如何在OnlyFans搜索HongkongDoll
本文是一份全面的指南,旨在帮助读者了解如何在OnlyFans平台上有效使用搜索功能,尤其是如何找到特定的博主,比如HongkongDoll。我们深入探讨了OnlyFans的搜索机制,包括其对用户隐私的重视以及因此带来的搜索限制。文章详细介绍了三种主要的搜索方法:使用OnlyFans的官方搜索服务、通过社交媒体链接进行跳转、以及利用第三方搜索引擎如OnlySearch。
|
测试技术 UED
软件测试中的“灰盒”方法:一种平衡透明度与效率的策略
在软件开发的复杂世界中,确保产品质量和用户体验至关重要。本文将探讨一种被称为“灰盒测试”的方法,它结合了白盒和黑盒测试的优点,旨在提高测试效率同时保持一定程度的透明度。我们将通过具体案例分析,展示灰盒测试如何在实际工作中发挥作用,并讨论其对现代软件开发流程的影响。
|
10月前
|
人工智能 自然语言处理 数据可视化
《当传统遇上AI:Tableau与PowerBI的华丽转身》
在数据可视化与分析领域,Tableau和PowerBI长期占据重要地位。随着AI技术的融入,这两款工具实现了全方位升级,极大提升了用户体验。 Tableau新增自然语言交互、智能洞察挖掘和可视化智能推荐功能,降低了数据分析门槛,帮助用户轻松发现隐藏规律并高效制作图表。PowerBI则通过DAX公式智能编写、移动端智能交互和报表智能订阅等功能,简化了复杂计算,实现了随时随地的数据洞察。两者共同开启了数据处理的新时代,为企业决策提供有力支持。
392 12
【计算巢】网络拓扑结构的比较分析:星形、环形与总线型
【5月更文挑战第31天】本文介绍了网络的三种常见拓扑结构:星形、环形和总线型。星形拓扑易于管理和维护,信息传递高效;环形拓扑结构简单,信息环状传递,但环中断可能导致网络瘫痪;总线型成本低、扩展易,但总线故障会全局影响。理解其特点有助于根据需求选择合适的网络结构。
1072 1
|
人工智能 弹性计算 算法
一文解读:阿里云AI基础设施的演进与挑战
一文解读:阿里云AI基础设施的演进与挑战
|
域名解析 网络协议 调度
阿里云移动研发平台EMAS支持纯血鸿蒙HarmonyOS NEXT
阿里云移动研发平台EMAS作为面向应用全生命周期提供一站式的应用研发管理服务产品,其核心产品包括云构建,HTTPDNS 和移动推送正式推出了针对纯血鸿蒙的SDK版本,将为广大开发者在鸿蒙生态中构建高效、稳定、可靠的企业级应用提供强有力的支持。如有疑问,请进入钉钉群(群号35248489)进行相关咨询。
|
测试技术 计算机视觉 Python
Python PyAutoGUI是什么?
**PyAutoGUI库简介** PyAutoGUI是Python的一个库,用于自动化GUI任务,包括模拟鼠标和键盘操作。它可以用来做屏幕截图、自动填写表单、自动化测试等。安装库使用`pip install pyautogui`。基本操作涉及导入库、获取屏幕尺寸、控制鼠标(如获取位置、移动、点击和滚动)以及键盘操作(如输入文本和模拟快捷键)。此外,还有等待功能,如延迟执行和根据屏幕图像定位。PyAutoGUI还可用于识别屏幕颜色、查找图像位置和屏幕录制。它在各种场景下都非常有用,例如自动化日常任务或网页操作。
567 1
LabVIEW 调整Table表格行高列宽的方法与例程
LabVIEW 调整Table表格行高列宽的方法与例程
800 1
|
运维 监控 容灾
建设强大系统:提升高可用、可靠性和稳定性的秘诀
建设强大系统:提升高可用、可靠性和稳定性的秘诀
1779 0
|
图形学
Unity Particle System 制作刀光特效
Unity Particle System 制作刀光特效
787 1
Unity Particle System 制作刀光特效