首先,这颗心是数学家画的,不是我。原理很复杂,大致原理就是迭代。
画这颗心的代码已经给出来了
public void draw(Graphics g){
for(int i=0;i<=180;i++){
for(int j=0;j<=180;j++){
double r=Math.PI/45*i*(1-Math.sin(Math.PI/45*j))*20;
double x=r*Math.cos(Math.PI/45*j)*Math.sin(Math.PI/45*i)+300;
double y=-r*Math.sin(Math.PI/45*j)+200;
Color c=Color.getHSBColor(i*j/8100.0f, 0.9999f,0.9999f);
g.setColor(c);
g.drawOval((int)x, (int)y, 1,1);
try{
Thread.sleep(1);
}catch(Exception e){}
}
}
}
但是,我卡在了怎么调用这个函数这里。
我本来是准备在主函数里写一个new一个heart对象,然后想C语言一样用这个对象调用draw方法。
然而这个方法需要传入Graphics g参数。
当我new一个Graphics对象时,编译器报错说,Graphics不能实例化。
um…然后我就直接Graphics g;
然后传参之后,就报错“空指针错误”。凉。。。。。
最后,再问了同学之后,发现自己的代码书写习惯十分不好,或者说是还没有熟悉规则。
1、首先是对Graphics的了解不够。这是一个画笔,它是有paint()属性的。也就是说,它可以理解为是一个画笔。画笔一定是需要有画布才能作画的。因此必须有JFrame()对象才能在上面作画,这就是它的画布。
2、然后是对编程的耦合度理解并不高。老是习惯把所有的代码全部写进主函数里,导致错误百出,嘤!
接下来是在同学的手把手指导下写出来的代码。很漂亮辽。
package heart;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
public class heart extends JFrame{
/**
*
*/
private static final long serialVersionUID = -7128362663435137794L;
public void draw(Graphics g){
for(int i=0;i<=180;i++){
for(int j=0;j<=180;j++){
double r=Math.PI/45*i*(1-Math.sin(Math.PI/45*j))*20;
double x=r*Math.cos(Math.PI/45*j)*Math.sin(Math.PI/45*i)+300;
double y=-r*Math.sin(Math.PI/45*j)+200;
Color c=Color.getHSBColor(i*j/8100.0f, 0.9999f,0.9999f);
g.setColor(c);
g.drawOval((int)x, (int)y, 1,1);
try{
Thread.sleep(1);
}catch(Exception e){}
}
}
}
public void showUI(){
this.setSize(new Dimension(1200,1200));
this.setVisible(true);
Graphics g = this.getGraphics();
draw(g);
}
public static void main(String[] args) {
heart h = new heart();
h.showUI();
}
}
下面是我的小心心