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 心脏形曲线 (整理)的更多相关文章

  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. NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

    http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言   当管理大量连接时,特别 ...

  2. 15 things to talk about in a healthy relationship

    15 things to talk about in a healthy relationship男女交往中可以谈论的15个话题 1. Your Daily Activities 1. 你的日常活动 ...

  3. 解决IIS应用程序池DefaultAppPool关闭超时错误

    错误系统日志: 为应用程序池“DefaultAppPool”提供服务的进程关闭时间超过了限制.进程 ID 是“3060”. 有关更多信息,请参阅在http://go.microsoft.com/fwl ...

  4. 世界上还有一个东西叫Virtual Pascal

    官网是:http://web.archive.org/web/20060312064321/http://www.vpascal.com/news.php?item.16 不过2005年就不再维护了. ...

  5. Java:网络编程之UDP的使用

    java.net  类 DatagramSocket 此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点. java.net  类 DatagramPacket 此类表示数 ...

  6. android 广播的使用

    在Activity中,注册广播的一个Demo. 总共分3步 第一步:定义一个BroadcastReceiver广播接收类: private BroadcastReceiver mBroadcastRe ...

  7. Sql server cast(as nvarchar) 默认长度问题

    Sql server 在我的SQL语句中:sql=".........cast(ziduan as nvarchar) ..............." 这样之后,ziduan被转 ...

  8. Data Flow ->> Look up & Merge Join

    Look up: Look up组件做的事情和SQL SERVER中的inner和outer hash join差不多. 但是look up每次只能有两张表参与. 在FULL-CACHE模式下,两个s ...

  9. 机器人学 —— 机器人感知(Kalman Filter)

    对于机器人感知任务而言,经常需要预判物体的运动,保证机器人在物体与自身接触之前进行规避.比如无人机与障碍物的碰撞,足球机器人判断足球的位置.预判的前提是对当前状态进行准确的估计,比如足球的速度,障碍物 ...

  10. Android 如何处理崩溃的异常

    Android中处理崩溃异常    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试 ...