Java Cardioid 心脏形曲线 (整理)
package demo; import java.awt.Color;
import java.awt.Graphics; import javax.swing.JFrame;
import javax.swing.JPanel; /**
* Java Cardioid 心脏形曲线 (整理)
* 这是以前看到有关Cardioid一个故事之后,觉得好玩,那时把它实现了。
*
* 2016-1-2 深圳 南山平山村 曾剑锋
*/
public class Cardioid extends JPanel{
/**
* <ol>
* <li>centerX:代表x轴中心点坐标
* <li>centerY:代表y轴中心店坐标
* </ol>
* 整个窗口的长、宽等于2*centerX、2*centerY,这么做的目的是保证数据的统一性修改
* 当然你也可以考虑使用长、宽来表示,然后对他们进行取一半得到中心店坐标。
*
*/
static int centerX = 600/2;
static int centerY = 600/2;
/**
* angle:主要用于角度计算,下面程序中的for循环里的变量,360一个周期
*/
int angle;
/**
* <ol>
* <li>a:窗口中有2个心形图,a是其中一个的幅值
* <li>b:窗口中有2个心形图,b是其中一个的幅值
* </ol>
* 2个心形图,2个幅值,但初始值是不一样的。
*/
int a = 0;
int b = 50;
/**
* 构造函数调用start()函数。<br>
* 作用:开启一个线程,主要用于调整a、b的值,并刷新界面。
*/
public Cardioid() {
start();
}
/**
* 重写paint()<br>
* 程序流程:<ol>
* <li>调用父类paint方法、并设置背景颜色为黑色
* <li>用for循环画两个发散的心形图
* </ol>
*/
@Override
public void paint(Graphics graphics) {
super.paint(graphics);
this.setBackground(Color.black);
graphics.setColor(Color.red);
/*
* 这里是难点,主要是因为需要对坐标进行定位,下面是获取x、y的坐标公式,你可以在网上查到
* x=a*(2*sin(t)-sin(2*t))
* y=a*(2*cos(t)-cos(2*t))
* 这里的x、y和网上的公式对调了,主要是因为需要进行y=x对称,网上的图是横着的,这个图是正着的。
* sin()函数传入的是弧度制,所以需要通过angle*Math.PI/180,将角度值换成幅度值
* 其中的500主要是用于坐标调整的,没有理由,是我自己试出来的,我也没有去深究为什么,因为功能完成了。
*/
for (angle = 0; angle < 360; angle++) {
graphics.drawLine(
centerY+(int)(a*(2*Math.sin(angle*Math.PI/180)-Math.sin(2*angle*Math.PI/180))),
500 -(centerX+(int)(a*(2*Math.cos(angle*Math.PI/180)-Math.cos(2*angle*Math.PI/180)))),
centerY+(int)((a+3)*(2*Math.sin((angle)*Math.PI/180)-Math.sin(2*(angle)*Math.PI/180))),
500 -(centerX+(int)((a+3)*(2*Math.cos((angle)*Math.PI/180)-Math.cos(2*(angle)*Math.PI/180)))));
}
for (angle = 0; angle < 360; angle++) {
graphics.drawLine(
centerY+(int)(b*(2*Math.sin(angle*Math.PI/180)-Math.sin(2*angle*Math.PI/180))),
500 -(centerX+(int)(b*(2*Math.cos(angle*Math.PI/180)-Math.cos(2*angle*Math.PI/180)))),
centerY+(int)((b+3)*(2*Math.sin((angle)*Math.PI/180)-Math.sin(2*(angle)*Math.PI/180))),
500 -(centerX+(int)((b+3)*(2*Math.cos((angle)*Math.PI/180)-Math.cos(2*(angle)*Math.PI/180)))));
}
}
/**
* 创建一个匿名线程,线程主要完成以下事情:<ol>
* <li>改变a、b的值,相当于改变心形线的幅值;
* <li>延时20ms;
* <li>刷新界面repaint();
* </ol>
*/
public void start() {
new Thread(new Runnable() { @Override
public void run() {
while (true) {
try {
if (a++ >100) {
a = 0;
}
if (b++ >100) {
b = 0;
}
Thread.sleep(20);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
}).start();
}
/**
* 主函数完成以下内容:<ol>
* <li>初始化jframe窗口;
* <li>创建cardioid,并将cardioid填充到jFrame中;
* <li>设置jFrame可见。
* </ol>
*/
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setTitle("Cardioid");
jFrame.setSize(centerX*2, centerY*2);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLocationRelativeTo(null); Cardioid cardioid = new Cardioid();
jFrame.add(cardioid);
jFrame.setVisible(true);
}
}

Java Cardioid 心脏形曲线 (整理)的更多相关文章
- Java 动态写轮眼 SharinganJPanel (整理)
/** * Java 动态写轮眼 SharingganJPanel (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * 设计声明: * 1.虽然岸本是日本人,而我个人作为其模仿者,依 ...
- Java 动态眨眼 EyesJPanel (整理)
/** * Java 动态眨眼 EyesJPanel (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * 注意事项: * 1.本程序为java程序,同时感谢您花费宝贵的时间来阅读本文档: ...
- Java 动态太极图 DynamicTaiChi (整理)
package demo; import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import jav ...
- Java笔试面试题整理第八波
转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第六波(修正版)
转载至:http://blog.csdn.net/shakespeare001/article/details/51330745 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第五波
转载至:http://blog.csdn.net/shakespeare001/article/details/51321498 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第四波
转载至:http://blog.csdn.net/shakespeare001/article/details/51274685 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第三波
转载至:http://blog.csdn.net/shakespeare001/article/details/51247785 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第二波
转载至:http://blog.csdn.net/shakespeare001/article/details/51200163 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
随机推荐
- 解决JS文件页面加载时的阻塞
关于页面加载时的时间消费,许多书中都做出了介绍,也提出了很多种方法.本文章就详细介绍XHR注入. 概述:JS分拆的方法 1.XHR注入:就是用ajax异步请求同域包含脚本的文件,然后将返回的字符串转化 ...
- 制作类似DataGrid自定义控件
首先看一下.net自带的DataGrid,想想如何应该怎样才能实现那样的展现形式. 1)需要以网格形式显示内容. 2)网格的宽度.高度可以定义. 3)可以显示滚动条. 4)单击可以选中某个单元格. 当 ...
- JMeter性能测试介绍学习一
上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...
- 通过HTTP头控制浏览器的缓存
通过HTTP头控制浏览器的缓存 浏览器缓存是提高用户体验和提升程序性能的一个很重要的途径,通过浏览器的缓存控制,可以对实时性要求不高的数据进行缓存,可以减少甚至不需要再次对服务器的请求就可以显示数据. ...
- 堆排序 Heap Sort
堆排序虽然叫heap sort,但是和内存上的那个heap并没有实际关系.算法上,堆排序一般使用数组的形式来实现,即binary heap. 我们可以将堆排序所使用的堆int[] heap视为一个完全 ...
- eclipse引入tomcat
1.默认大家的tomcat都已经安装好了,这里打开eclipse,选择windows,下面的属性(preference). 2.进入到属性配置页,选择server -- runtime Envi ...
- C#获取当前路径的方法
C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...
- iOS 动态特性和RunTime
过去的几年中涌现了大量的Objective-C开发者.有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型语言转过来的,如Java或C#,当然也有直接以Objective-C作为入门语 ...
- Redis通用操作(适用于String,Hash,链表等)
keys pattern 查询相应的key 在redis里,允许模糊查询key 有3个通配符 *, ? ,[] *: 通配任意多个字符 ?: 通配单个字符 []: 通配括号内的某1个字符 redis ...
- linux下安装配置DHCP服务器
前提是已经安装了 core 及 base 两个组 1 2 3 4 5 # cat /etc/redhat-release Red Hat Enterprise Linux Server relea ...