Koch雪花其实就是一种Koch曲线.
如图所示:
解决方案
设想从一个线段开始,根据下列规则构造一个Koch曲线:
①..三等分一条线段;
Koch曲线是以上步骤地无限重复的极限结果.
Koch曲线是连续的,但是处处不可导的.
在后台添加js特效可实现这样的效果.
js代码为:
script language="JavaScript"
!--
var s, x, y, sn, cs;
var a, r, cx, cy;
x = new Array();
y = new Array();
r = new Array();
cx = new Array();
cy = new Array();
doc_width = self.innerWidth; //取页面宽度
doc_height = self.innerHeight; //取页面高度
}
else
doc_width = document.body.clientWidth; //取页面宽度
doc_height = document.body.clientHeight; //取页面高度
for (i = 0; i no; ++ i) { //根据前面定义的雪片数目写进相应数目的层
initSnow(); //随机初始化层的坐标
//用layer作为雪片(星号)的容器
document.write("layer name=\"dot"+ i +"\" left=\"1\" ");
document.write("top=\"1\" visibility=\"show\"font color=\"red\"");
document.write("*/font/layer");
document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
//初始化雪片,生成随机坐标
function initSnow() {
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() {
cy[i] = 1;
y[i] = r[i] * cs + cy[i];
//雪花下落的计算
function updateSnow() {
r[i] += s;
//在NS浏览器上处理雪片下落的主程序
function SnowdropNS() {
for (i = 0; i no; ++ i) { //依次处理每片雪花
updateSnow(); //下落
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() {
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); //准备下一次下落过程.
SnowdropNS(); //调用SnowdropNS使雪片下落
SnowdropIE(); //调用SnowdropIE使雪片下落
--
/script
说明:可以根据自己的需求根据说明进行相应参数的修改
radom.nextInt()是取得一个随机整数
简单来说,你在屏幕上画一个直角坐标系,原点就是你屏幕的中心点的话,雪花总会落在坐标系的第一象限区域内.
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(){
String?s=null;
try{
s=getParameter(s1);
}catch(NullPointerException?ex){
if(s!=null){
return?max;
return?min;
}else{
public?void?init(){
rand?=new?Random();
dim?=getSize();
snowX?=?new?int?[snows];
snowY?=?new?int?[snows];
for(?int?i=0;isnows;i++){
mt?=new?MediaTracker(this);
gAlc=?new?Image[1];
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);
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){
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);
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;
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.init();
JFrame?jf=new?JFrame("SnowPic");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(snow);
jf.setVisible(true);
snow.start();
请参考