Recursive ใน JAVA สร้าง Sierpinski triangle 

fractal Sierpinski triangle โดยใช้ภาษา JAVA




import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TriangleFractal extends JPanel
{
public TriangleFractal()
{
setBackground(Color.black);
}
public void paint(Graphics g)
{
super.paint(g);
for(int i=0;i< 1000000;i++)
{
draw( g, 50, getWidth() - 50, getHeight()-50, getWidth()/2, getHeight()-25);
}
}

public void draw(Graphics g, double n,double w,double h,double x,double y)
{
if(n ==0)
{
g.setColor(Color.green);
g.fillRect((int)(x+Math.random()*w-w/2),(int) (y+Math.random()*h-h/2), 1, 1);
return;
}

double r= Math.random();
if(r < 1.0/3.0)
{
y = y - h /2;

}
else if(r < 2.0/3.0)
{
x = x - w/4;
}
else
{
x = x + w/4;
}
draw( g, n-1, w/2, h/2, x, y);
}
public static void main(String[] args)
{
JFrame fnt = new JFrame();

fnt.add(new TriangleFractal());
fnt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();
fnt.setSize((int)width, (int)height);
fnt.setVisible(true);

}

}



 

จำนวนครั้งของ recursive n=1



จำนวนครั้งของ recursive n=2



จำนวนครั้งของ recursive n=3



จำนวนครั้งของ recursive n=4



จำนวนครั้งของ recursive n=5



จำนวนครั้งของ recursive n=6



จำนวนครั้งของ recursive n=7



จำนวนครั้งของ recursive n=30





EPT








[ view entry ] ( 1864 views )   |  permalink  |  $star_image$star_image$star_image$star_image$star_image ( 3 / 1168 )
STATE SPACE SEARCH : OX มาเขียนโปรแกรมเล่น OX กันเถอะ 
การ การคิดของ Computer เราจะเขียนให้มันลองทุกกรณี

(ขอ code ทั้งหมดได้ที่ ntprintf@gmail.com หรือมาที่อาคารของเราที่ EXPERT-PROGRAMMING-TUTOR ที่ราชเทวี ได้เลย)

เราจะเรียกการทำแบบนี้ว่า STATE SPACE SEARCH ซึ่งถ้าอยากจะปรับปรุงให้ดีขึ้นอาจจะใช้วิธี branch and bound มาช่วย(ทำให้ทำงานเร็วยิ่งขึ้น) ซึ่งจะกล่าวถึงในโอกาศต่อไป

หวังว่าดูรูปนี้แล้วจะเข้สใจนะครับ



มาดู STEP ต่างๆ ของการเล่นจริงเลยแล้วกัน
Human O ลงก่อน : Computer x ลงทีหลัง

ที่เห็นดำๆเพราะตารางมันซ้อนกันเยอะ





[ view entry ] ( 4116 views )   |  permalink  |  $star_image$star_image$star_image$star_image$star_image ( 3 / 1172 )
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);
}
}



[ view entry ] ( 6196 views )   |  permalink  |  $star_image$star_image$star_image$star_image$star_image ( 3 / 1150 )
มาทำ CAPTCHA ใช้เองดีกว่า 
CAPTCHA คือ ตัวอักษรยึกยือ ไว้กัน bot ใน web site ต่างๆ
ตัวอย่าง captcha จาก http://en.wikipedia.org/wiki/CAPTCHA






ซึ่งเราจะใช้ C# สร้าง Captcha ง่ายๆ แบบของเราเองดังนี้

int count = 0;
Image img;
Random rand = new Random();
for (int ii = 0; ii < 1000; ii++)
{
img = new Bitmap(120, 70);
Graphics g = Graphics.FromImage(img);

int i = rand.Next(10000);
String s = "" + (char)(rand.Next(26) + 65);
s += (char)(rand.Next(26) + 65);
s += i;

g.DrawString(s, new Font("Tahoma", 22, FontStyle.Regular), Brushes.Black, 5, 10);

for (int j = 0; j < 10; j++)
{
int x1, y1, x2, y2;
x1 = rand.Next(26);
x2 = rand.Next(26) + 94;
y1 = rand.Next(70);
y2 = rand.Next(70);

g.DrawLine(new Pen(Color.FromArgb(rand.Next(70), rand.Next(70), rand.Next(70))), x1, y1, x2, y2);

}

g.Flush();
img.Save("D://capcha//" + count + ".PNG", System.Drawing.Imaging.ImageFormat.Png);


String path, key, phone;
// id = Int32.Parse(this.textBox_id.Text);
path = count + ".PNG";
key = s;


string cs = @"server=localhost;userid=root;password=1234;database=yyy";
MySqlConnection conn = new MySqlConnection(cs);

String sql = @"INSERT INTO capcha VALUES (0, '" + path + "','" + key + "' )";
MySqlCommand comm = new MySqlCommand(sql, conn);
conn.Open();
comm.ExecuteNonQuery();


conn.Close();

count++;
}





จะเห็นว่ามีการ เก็บ key ที่ถูกต้องของรูปนั้นๆไว้ใน database ด้วย
ตัวอย่าง captcha ที่ได้จากโปรแกรม


[ view entry ] ( 623 views )   |  permalink  |  $star_image$star_image$star_image$star_image$star_image ( 3 / 390 )
การต่อ DATABASE MySQL พร้อม Insert Image 
Insert และ เอา รูป จาก Database มาแสดง
1 create table ดังนี้
CREATE TABLE `customers` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(30) NOT NULL,
`surname` varchar(30) NOT NULL,
`phone` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

สร้างหน้าตาดังนี้






















ด้านซ้ายคือ ImagePanel ซึ่งมี code ดังนี้





import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class ImagePanel extends JPanel{
BufferedImage img;
public ImagePanel(){}
public void setImage(BufferedImage i){
img = i;
repaint();
}
public BufferedImage getImage(){
return img;
}
public void paint(Graphics g){
g.drawImage(img, 0, 0,this.getWidth(),this.getHeight(), this);
}
}



code ของหน้าจอหลัก

import java.awt.EventQueue;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileFilter;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.UIManager;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.sql.*;

public class InsertProduct extends JFrame
{

private JPanel contentPane;
private JTextField txt_name;
private JTextField txt_price;
private ImagePanel imagePanel;

/**
* Launch the application.
*/
public static void main(String[] args)
{
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e){}
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
InsertProduct frame = new InsertProduct();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}
public InsertProduct()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

imagePanel = new ImagePanel();
imagePanel.setBounds(10, 11, 248, 240);
contentPane.add(imagePanel);

JButton btnBrowse = new JButton("browse image");
btnBrowse.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
JFileChooser fc = new JFileChooser("c://");
fc.setFileFilter(new JPEGImageFileFilter());
int res = fc.showOpenDialog(null);
if (res == JFileChooser.APPROVE_OPTION)
{
File file = fc.getSelectedFile();
// this.
try
{
imagePanel.setImage(ImageIO.read(file));
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
btnBrowse.setBounds(268, 11, 156, 23);
contentPane.add(btnBrowse);

JLabel lblProductName = new JLabel("product name");
lblProductName.setBounds(268, 51, 102, 14);
contentPane.add(lblProductName);

txt_name = new JTextField();
txt_name.setBounds(268, 74, 156, 23);
contentPane.add(txt_name);
txt_name.setColumns(10);

JLabel lblPricePerUnit = new JLabel("price per unit");
lblPricePerUnit.setBounds(268, 108, 102, 14);
contentPane.add(lblPricePerUnit);

txt_price = new JTextField();
txt_price.setColumns(10);
txt_price.setBounds(268, 131, 156, 23);
contentPane.add(txt_price);

JButton btn_insert = new JButton("Insert");
btn_insert.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try
{
Connection con = null;
Class.forName("com.mysql.jdbc.Driver");
con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/yyy", "root", "1234");

Class.forName("com.mysql.jdbc.Driver");

String price = txt_price.getText();
String name = txt_name.getText();

String insert = "INSERT INTO product(id,name,price_per_unit,image) " + " VALUES (0,?,?,?)";

PreparedStatement preparedStmt = con.prepareStatement(insert);
ByteArrayOutputStream buff = new ByteArrayOutputStream();
ImageIO.write(imagePanel.getImage(), "PNG", buff);
byte[] buff_temp = buff.toByteArray();
ByteArrayInputStream inBuff = new ByteArrayInputStream(buff_temp);

preparedStmt.setString(1, name);
preparedStmt.setString(2, price);
preparedStmt.setBinaryStream(3, inBuff, buff_temp.length);

preparedStmt.execute();
System.out.println("finish");
con.close();
} catch (Exception ee)
{
ee.printStackTrace();
}
}
});
btn_insert.setBounds(269, 185, 89, 23);
contentPane.add(btn_insert);
}
}
class JPEGImageFileFilter extends FileFilter implements java.io.FileFilter{
public boolean accept(File f){
if (f.getName().toLowerCase().endsWith(".jpeg"))
return true;
if (f.getName().toLowerCase().endsWith(".jpg"))
return true;
if (f.isDirectory())
return true;
return false;
}
public String getDescription()
{
return "JPEG files";
}
}




จะเห็นว่า ตอนInsert จะใช้ PreparedStatement มาช่วย
ByteArrayOutputStream buff = new ByteArrayOutputStream();
ImageIO.write(imagePanel.getImage(), "PNG", buff);
byte[] buff_temp = buff.toByteArray();
ByteArrayInputStream inBuff = new ByteArrayInputStream(buff_temp);

ส่วนนี้ใช้ Save Image ลง Memory ก่อน แล้วค่อย Save ลง DATABASE อีกทีหนึ่ง


ดึงข้อมูลพ้อมรูปมาแสดง




import java.awt.image.BufferedImage;
import javax.swing.JPanel;
import javax.swing.JLabel;
public class ProductPanel extends JPanel
{
public ProductPanel()
{
setLayout(null);
imagePanel = new ImagePanel();
imagePanel.setBounds(0, 0, 223, 109);
add(imagePanel);
label_id = new JLabel("New label");
label_id.setBounds(322, 9, 118, 26);
add(label_id);
label_name = new JLabel("New label");
label_name.setBounds(322, 46, 118, 26);
add(label_name);
label_price = new JLabel("New label");
label_price.setBounds(322, 83, 118, 26);
add(label_price);
lblUd = new JLabel("id");
lblUd.setBounds(233, 9, 62, 26);
add(lblUd);
lblName = new JLabel("name");
lblName.setBounds(233, 46, 62, 26);
add(lblName);
lblPricePerUnit = new JLabel("price per unit");
lblPricePerUnit.setBounds(233, 83, 79, 26);
add(lblPricePerUnit);
}

public void setParam(int id, String name, double price, BufferedImage img)
{
this.id=id;
this.name= name;
this.price=price;
this.img=img;

label_id.setText(""+ this.id);
label_name.setText(""+ this.name);
label_price.setText(""+ this.price);

imagePanel.setImage(img);
}

public int id;
public String name;
public double price;
public BufferedImage img;

private JLabel label_price;
private JLabel label_name;
private JLabel label_id;
private ImagePanel imagePanel;
private JLabel lblUd;
private JLabel lblName;
private JLabel lblPricePerUnit;

}




import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.sql.*;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


public class selectProduct extends JFrame
{

private JPanel contentPane;

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
selectProduct frame = new selectProduct();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}

public selectProduct()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
// //////////////////////////////////
try
{
Connection con = null;
Class.forName("com.mysql.jdbc.Driver");
con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/yyy", "root", "1234");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM product");
Class.forName("com.mysql.jdbc.Driver");

int i=0;
while (rs.next())
{
ProductPanel pp = new ProductPanel();
BufferedImage img = ImageIO.read(rs.getBinaryStream(4));
pp.setParam(rs.getInt(1), rs.getString(2), rs.getDouble(3), img);
pp.setBounds(0, i*120 + 20, 500, 120);
this.contentPane.add(pp);

System.out.println(pp.id +" "+ pp.name);
i++;
}

} catch (Exception ee)
{
ee.printStackTrace();
}

}
}



อาจต้องมีการ set ค่าในดรสำ my.ini สำหรับ ขนาดของ รูป
max_allowed_packet=500M

[ view entry ] ( 19267 views )   |  permalink  |  $star_image$star_image$star_image$star_image$star_image ( 3 / 209 )

<<First <Back | 1 | 2 | 3 | 4 | 5 | Next> Last>>