koch snowflake in JAVA เกาะอังกฤษมีความยาวรอบเกาะเท่าไรกันแน่ 

วันนี้เราจะมาเขียนโปรแกรม Recursive กันนะครับ


โดยใช้สิ่งที่เรียกว่า koch snowflake

ความสุดยอดของ koch snowflake คืิอ มีพื้ที่รอบรูปเป็น infinity แต่ พื้นที่จำกัด

ซึ่งเราสามารถพบความมหัสจรรย์นี้ได้ ในเรื่องของ แผนที่ เช่นระหว่าไทย กัมพูชา เราเถียงกันเรื่องใช้แผนที่ 1:200000 หรืออะไรก็ดี คำถามคือความยาวเขตแดนระหว่างไทย กัมพูชามีเท่าไรกันแน่ หรือคำถามที่ว่า ถ้าเราซื้อที่ดินริมหาด ที่ดินริมหาด ส่วนใหญ่ราคาจะขึ้นอยู่กับว่ามีหาดยาวเท่าไร (ติดหาดกี่เมตรนั้นเอง) หรือ คำถามว่า เกาะอังกฤษ มีความยาวรอบรูปเท่าไร เช่นถ้าเรามีเทคโนโลยีที่ที่สามารถวัดแบบไม่ระเอียดเราอาจจะได้ค่าค่าหนึ่ง แต่ถ้าเรามีเทคโนโลยีที่สามารถวัดระเอียดขึ้นไปอีกก็เหมือนกับว่า เราจะมี ความยาวรอบเกาะที่เพิ่มขึ้น และถ้าเราสามารถวัดไปถึงระดับ มิลิเมตร ไม่ยิ่งยาวไปกัยใหญ่เหรอ และ ถ้าวัดไปถึงระดับอะตอมละ

koch snowflake คืออะไรสามารถอ่านเพิ่มเติมได้ที่
http://en.wikipedia.org/wiki/Koch_snowflake






















koch snowflake in JAVA





import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;


public class KochSnowFlake extends JFrame
{
private static final long serialVersionUID = 1L;

int num=1;

public KochSnowFlake()
{
setSize(600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

Thread t= new Thread(new Runnable()
{

@Override
public void run()
{
while(true)
{
for(int i=1;i<= 10;i++)
{
try
{
Thread.sleep(6000 );
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
num=i;

repaint();

}
}

}
});
t.start();

}

public void paint(Graphics g)
{
super.paint(g);
Graphics2D gg=(Graphics2D)g;

Vector now= new Vector(getWidth() / 5.0, getHeight()/3.0*2.0);
Vector dir_with_size= new Vector(getWidth() /5.0*3.0, 0);
dir_with_size= dir_with_size.rotate(Math.PI/3);
createSnowFlake( gg , now, dir_with_size, num);

now= now.add(dir_with_size);
dir_with_size= dir_with_size.rotate(-Math.PI/3*2);
createSnowFlake( gg , now, dir_with_size, num);

now= now.add(dir_with_size);
dir_with_size= dir_with_size.rotate(-Math.PI/3*2);
createSnowFlake( gg , now, dir_with_size, num);

}
public void createSnowFlake(Graphics2D g , Vector now,Vector dir_with_size,int n)
{
if(n==0) return;

if(n==1)
{
Vector a,d;
a = now;
d = dir_with_size.add(now);
g.drawLine((int)a.x,(int)a.y, (int)d.x,(int)d.y);
return;
}
Vector a,b,c,d;
a = now;
b = dir_with_size.mul(1.0/3.0).add(now);

c = dir_with_size.mul(2.0/3.0).add(now);
d = dir_with_size.mul(1).add(now);


Vector dir_with_size2= dir_with_size.rotate(Math.PI /3.0).mul(1.0/3.0);
Vector start3 = dir_with_size2.add(b);
Vector dir_with_size3= c.sub(start3) ;

createSnowFlake( g , b, dir_with_size2, n-1);
createSnowFlake( g , start3, dir_with_size3, n-1);

createSnowFlake( g , a, dir_with_size.mul(1.0/3.0), n-1);
createSnowFlake( g , c, dir_with_size.mul(1.0/3.0), n-1);

}

public static void main(String[] args)
{
new KochSnowFlake();

}

}


class Vector
{
public double x,y;
public Vector(){}
public Vector (double xx,double yy)
{
x=xx;
y=yy;
}
public Vector rotate(double angle)
{
double xx,yy;
double c = Math.cos(angle);
double s = Math.sin(angle);

xx = x*c + y*s;
yy = -x*s + y*c;


return new Vector(xx,yy);
}

public Vector mul(double m)
{
return new Vector(x*m,y*m);
}

public Vector add(Vector v)
{
return new Vector(x+v.x,y+v.y);
}
public Vector sub(Vector v)
{
return new Vector(x-v.x,y-v.y);
}
}



Comments

Add Comment
Comments are not available for this entry.