JAVA雪花堆积的代码,java实现雪花算法

详解如何用java实现Koch雪花的绘制

Koch雪花其实就是一种Koch曲线。

创新互联建站一直秉承“诚信做人,踏实做事”的原则,不欺瞒客户,是我们最起码的底线! 以服务为基础,以质量求生存,以技术求发展,成交一个客户多一个朋友!为您提供成都做网站、成都网站建设、成都网页设计、小程序开发、成都网站开发、成都网站制作、成都软件开发、手机APP定制开发是成都本地专业的网站建设和网站设计公司,等你一起来见证!

Koch曲线是一个数学曲线,同时也是早期被描述的一种分形曲线。它由瑞典数学家Helge von Koch在1904年发表的一篇题为“从初等几何构造的一条没有切线的连续曲线”的论文中提出。有一种Koch曲线是象雪花一样,被称为Koch雪花(或Koch星),它是由三条Koch曲线围成的等边三角形。至于更详细的请读者百度百科。

如图所示:

解决方案

设想从一个线段开始,根据下列规则构造一个Koch曲线:

1.三等分一条线段;

2.用一个等边三角形替代第一步划分三等分的中间部分;

3.在每一条直线上,重复第二步。

Koch曲线是以上步骤地无限重复的极限结果。

Koch曲线的长度为无穷大,因为以上的变换都是一条线段变四条线段,每一条线段的长度是上一级的1/3,因此操作n步的总长度是(4/3)n:若n→∞,则总长度趋于无穷。Koch曲线的分形维数是log 4/log 3 ≈ 1.26,其维数大于线的维数(1),小于Peano填充曲线的维数(2)。

Koch曲线是连续的,但是处处不可导的。

Koch雪花的面积是 2* √3 * ssup2;/5 ,这里的s是最初三角形的边长,Koch雪花的面积是原三角形面积的8/5,它成为一条无限长的边界围绕着一个有限的面积的几何对象。

网页飘雪花的代码是什么

在后台添加js特效可实现这样的效果。

js代码为:

script language="JavaScript"

!--

var no = 5; //雪片数目

var speed = 20; //飘动速度。(值越大越慢)

var ns4up = (document.layers) ? 1 : 0; //当前浏览器类型,如果是NS则为1

var ie4up = (document.all) ? 1 : 0; //当前浏览器类型,如果是IE则为1

var s, x, y, sn, cs;

var a, r, cx, cy;

var i, doc_width = 800, doc_height = 600;

x = new Array();

y = new Array();

r = new Array();

cx = new Array();

cy = new Array();

s = 8; //每次下落的高度,越小越平滑,但是也越慢

if (ns4up) { //以NS兼容方式

doc_width = self.innerWidth; //取页面宽度

doc_height = self.innerHeight; //取页面高度

}

else

if (ie4up) { //以IE兼容方式

doc_width = document.body.clientWidth; //取页面宽度

doc_height = document.body.clientHeight; //取页面高度

}

for (i = 0; i no; ++ i) { //根据前面定义的雪片数目写进相应数目的层

initSnow(); //随机初始化层的坐标

if (ns4up) { //如果浏览器是NS

//用layer作为雪片(星号)的容器

document.write("layer name=\"dot"+ i +"\" left=\"1\" ");

document.write("top=\"1\" visibility=\"show\"font color=\"red\"");

document.write("*/font/layer");

}

else

if (ie4up) { //如果浏览器是IE

//用div作为雪片的容器

document.write("div id=\"dot"+ i +"\" style=\"POSITION: ");

document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");

document.write("visible; TOP: 15px; LEFT: 15px;\"font color=\"red\"");

document.write("*/font/div");

}

}

//初始化雪片,生成随机坐标

function initSnow() {

a = 6;

r[i] = 1;

sn = Math.sin(a);

cs = Math.cos(a);

cx[i] = Math.random() * doc_width + 1;

cy[i] = Math.random() * doc_height + 1;

x[i] = r[i] * sn + cx[i];

y[i] = cy[i];

}

//计算雪花位置,从新位置上出现,看起来就像是新产生的一样。

function makeSnow() {

r[i] = 1;

cx[i] = Math.random() * doc_width + 1;

cy[i] = 1;

x[i] = r[i] * sn + cx[i];

y[i] = r[i] * cs + cy[i];

}

//雪花下落的计算

function updateSnow() {

r[i] += s;

x[i] = r[i] * sn + cx[i];

y[i] = r[i] * cs + cy[i];

}

//在NS浏览器上处理雪片下落的主程序

function SnowdropNS() {

for (i = 0; i no; ++ i) { //依次处理每片雪花

updateSnow(); //下落

if ((x[i] = 1) || (x[i] = (doc_width - 20)) || (y[i] = (doc_height - 20))) { //如果超出屏幕范围

makeSnow(); //则调整雪片到新位置上

doc_width = self.innerWidth; //更新页面宽度数据

doc_height = self.innerHeight; //更新页面高度数据

}

document.layers["dot"+i].top = y[i]; //改变层的Y坐标,应用新的位置

document.layers["dot"+i].left = x[i]; //改变层的X坐标,应用新的位置

}

setTimeout("SnowdropNS()", speed);

}

//在IE浏览器上处理雪片下落的主程序

function SnowdropIE() {

for (i = 0; i no; ++ i) { //依次处理每片雪花

updateSnow(); //下落

if ((x[i] = 1) || (x[i] = (doc_width - 20)) || (y[i] = (doc_height - 20))) { //如果超出屏幕范围

makeSnow(); //则调整雪片到新位置上

doc_width = document.body.clientWidth; //更新页面宽度数据

doc_height = document.body.clientHeight; //更新页面高度数据

}

document.all["dot"+i].style.pixelTop = y[i]; //改变层的坐标,应用新的位置

document.all["dot"+i].style.pixelLeft = x[i];

}

setTimeout("SnowdropIE()", speed); //准备下一次下落过程。

}

if (ns4up) { //如果是NS

SnowdropNS(); //调用SnowdropNS使雪片下落

}

else

if (ie4up) { //如果是NS

SnowdropIE(); //调用SnowdropIE使雪片下落

}

--

/script

说明:可以根据自己的需求根据说明进行相应参数的修改

JAVA获取雪片的X,Y坐标值

ds.width/2应该是画布或者屏幕的一半。

radom.nextInt()是取得一个随机整数

random.nextInt()%(ds.width/2)你可以理解为求的是“以半屏宽度(或高度)为偏移最大量,随机偏移一个量”,至于后面的+ds.width/2,表示在计算的偏移基础上再向正方向偏移半屏幕宽度(或高度)。

程序计算的最终结果就要看random.nextInt()的值了。不管这个值多大,整除(ds.width/2)后都不会超过(ds.width/2),当然,随机数越离散,得出的雪花越好看。你可以想象一下,ds.width和ds.height均为200像素的话,根据公式,半屏的大小(ds.width/2)就应该是100像素。random.nextInt()假如等于10,10%100=10,再加上(ds.width/2),就是110,同理算出y值。

简单来说,你在屏幕上画一个直角坐标系,原点就是你屏幕的中心点的话,雪花总会落在坐标系的第一象限区域内。

求用JAVA制作的飘雪花的效果

import java.applet.Applet;

import java.awt.*;

import javax.swing.JFrame;

import java.awt.image.BufferedImage;

import java.util.Random;

public class SnowPic extends Applet implements Runnable{

Thread mainThread;

Image offScreen,gAlc[];

Random rand;

int stopFlag,snows,wind,threadSleep,snowSize;

int[] snowX,snowY;

long stopTime =0;

Dimension dim;

MediaTracker mt;

public SnowPic(){

}

int getParameter(String s1,int s2){

String s=null;

try{

s=getParameter(s1);

}catch(NullPointerException ex){

}

return(s !=null)?Integer.parseInt(s):s2;

}

int getParameter(String s1, int s2, int max, int min){

String s=null;

try{

s=getParameter(s1);

}catch(NullPointerException ex){

}

if(s!=null){

if((s2=Integer.parseInt(s))max){

return max;

}else if (s2min){

return min;

}else{

return s2;

}

}else{

return s2;

}

}

String getParameter(String s1 , String s2){

String s=null;

try{

s=getParameter(s1);

}catch(NullPointerException ex){

}

return (s!=null)?s:s2;

}

public void init(){

rand =new Random();

dim =getSize();

snows       =getParameter("snows", 100, 500,0);

snowSize    =getParameter("snowSize",3,10,3);

threadSleep =getParameter("threadSleep",80,1000,10);

snowX = new int [snows];

snowY = new int [snows];

for( int i=0;isnows;i++){

snowX[i]=rand.nextInt()%(dim.width/2)+dim.width/2;

snowY[i]=rand.nextInt()%(dim.height/2)+dim.height/2;

}

mt =new MediaTracker(this);

gAlc= new Image[1];

try{

gAlc[0]=getImage(getDocumentBase(), getParameter("graphic","test.gif"));

offScreen=createImage(dim.width, dim.height);

}catch(Exception ex){

gAlc[0]=new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_RGB );

offScreen=new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_RGB );

}

mt.addImage(gAlc[0],0);

try{

mt.waitForID(0);

}catch(InterruptedException ex) {

return;

}

stopFlag =0;

}

public void start(){

if (mainThread==null){

mainThread=new Thread(this);

mainThread.start();

}

}

public void stop(){

mainThread =null;

}

public void run(){

while(mainThread !=null){

try{

Thread.sleep(threadSleep);

}catch(InterruptedException ex) {return;}

repaint();

}

}

public void drawBackSnow(Graphics g){

g.setColor(Color.white);

for(int i=0;isnows;i++){

g.fillOval(snowX[i],snowY[i],snowSize,snowSize);

snowX[i]+=rand.nextInt()%2+wind;

snowY[i]+=(rand.nextInt()%6+5)/5+1;

if(snowX[i]=dim.width) snowX[i]=0;

if(snowX[i]0) snowX[i]=dim.width -1;

if(snowY[i]=dim.height ||snowY[i]0){

snowX[i] =Math.abs(rand.nextInt()%dim.width);

snowY[i] =0;

}

}

wind =rand.nextInt()%5 -2;

}

public void paint(Graphics g){

offScreen.getGraphics().setColor(Color.black);

offScreen.getGraphics().fillRect(0,0,dim.width,dim.height);

offScreen.getGraphics().drawImage(gAlc[0],0,0,this);

drawBackSnow(offScreen.getGraphics());

g.drawImage(offScreen,0,0,null);

}

public void update(Graphics g){

paint(g);

}

public static void main(String args[]){

SnowPic snow=new SnowPic();

snow.setBounds(0,0, 500, 500);

snow.init();

JFrame jf=new JFrame("SnowPic");

jf.setSize(500, 500);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.add(snow);

jf.setVisible(true);

snow.start();

}

}

请参考


标题名称:JAVA雪花堆积的代码,java实现雪花算法
文章转载:http://scyanting.com/article/hcpgih.html