利用JAVA画一颗小心心

首先,这颗心是数学家画的,不是我。原理很复杂,大致原理就是迭代。
画这颗心的代码已经给出来了

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();
		
	}
	
	 

}

下面是我的小心心在这里插入图片描述

### 如何用Java绘制爱形状 在 Java 中可以通过 `java.awt.Graphics` 或者更现代的库如 `javafx.scene.canvas.GraphicsContext` 来实现爱图形的绘制。以下是基于 Java 的具体方法: #### 使用 AWT 绘制静态爱 AWT 是 Java 提供的一个基础绘图工具包,其中的 `Graphics` 类允许开发者自定义绘制各种形状。要绘制一颗,通常会利用数学函数来计算形曲线上的点坐标并将其连接起来。 下面是一个简单的例子展示如何使用 AWT 实现这一目标: ```java import javax.swing.*; import java.awt.*; public class Heart extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; int width = getWidth(); int height = getHeight(); // 设置笔颜色 g2d.setColor(Color.RED); // 定义形参数方程 double scale = Math.min(width, height) / 200.0; // 缩放比例适配窗口大小 for(double t = 0; t < 2 * Math.PI; t += 0.01){ double x = 16 * Math.pow(Math.sin(t), 3); double y = -(13 * Math.cos(t) - 5 * Math.cos(2*t) - 2 * Math.cos(3*t) - Math.cos(4*t)); // 转换到屏幕坐标系 int screenX = (int)(width/2 + x*scale*20); int screenY = (int)(height/2 - y*scale*20); // 填充像素点形成连续的形图案 g2d.drawLine(screenX, screenY, screenX, screenY); } } public static void main(String[] args) { JFrame frame = new JFrame("Heart Shape"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new Heart()); frame.setSize(400, 400); frame.setVisible(true); } } ``` 以上代码片段展示了如何通过数学公式生成形路径,并逐点填充完成整个图像[^1]。 #### 利用 JavaFX 创建动态效果 如果希望增加一些动或者交互特性,则推荐采用 JavaFX 技术栈中的 Canvas API 。相比传统 Swing/AWT ,它提供了更加流畅高效的渲染性能以及丰富的多媒体支持能力。 这里给出一段基本框架用于构建带简单位移变换逻辑的动态爱场景: ```java import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.layout.Pane; import javafx.stage.Stage; public class MovingHeartsApp extends Application { private final Random rand = new Random(); @Override public void start(Stage primaryStage) throws Exception{ Pane rootPane = new Pane(); Scene scene = new Scene(rootPane ,800,600 ); Canvas canvas = new Canvas(scene.getWidth(),scene.getHeight()); rootPane.getChildren().add(canvas); AnimationTimer timer=new AnimationTimer(){ long lastUpdate=System.nanoTime(); @Override public void handle(long now){ if(now-lastUpdate>1_000_000L){ // 控制帧率约为每秒一千次更新 drawRandomHeart((GraphicsContext)canvas.getGraphicsContext2D()); lastUpdate=now; } } }; timer.start(); primaryStage.setTitle("Moving Hearts Demo"); primaryStage.setScene(scene); primaryStage.show(); } private void drawRandomHeart(GraphicsContext gc){ Color color = getRandomColor(); gc.setFill(color); double sizeFactor=Math.random()*0.7+0.3;// 随机调整尺寸范围 double centerX=rand.nextDouble()*(gc.getCanvas().getWidth()-sizeFactor*100)+sizeFactor*50; double centerY=rand.nextDouble()*(gc.getCanvas().getHeight()-sizeFactor*100)+sizeFactor*50; heartPath(gc,sizeFactor,centerX,centerY); } private void heartPath(GraphicsContext gc,double factor,double cx,double cy ){ /* ...省略部分重复代码... */ // 参考先前提到过的极坐标转直角坐标的转换方式,在此处应用即可得到相应位置信息。 } private Color getRandomColor(){ return Color.rgb(rand.nextInt(256),rand.nextInt(256),rand.nextInt(256)); } public static void main(String []args){ launch(args); } } ``` 上述示例实现了多个随机颜色、大小不一的爱不断刷新显示的效果[^2]。 对于完整的源码文件可以直接参考特定教程文档获取更多信息[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值