Archive for July, 2010

จากตัวอย่างในการทำ Graphic Simulation คราวที่แล้ว เราพบว่าการที่ต้องมาไล่คำนวนและวาดเม็ดกระสุนใหม่หมดตั้งแต่แรก ในทุก ๆ เฟรมที่แสดงผล(Render)ออกมาจะเกิดปัญหาคอขวดขึ้น โดยภาระส่วนใหญ่จะไปตกอยู่ที่การคำนวนอย่างหนักของ CPU ทำให้โปรแกรมของเราทำงานช้าลงเรื่อย ๆ
มาคราวนี้เราจะแก้ป้ญหานี้โดยเรียกใช้การแคช ซึ่งจะเก็บรายละเอียดที่วาดเสร็จแล้วไว้ใน บ่อพักข้อมูล(Buffer) เพื่อเรียกใช้งานได้อย่างรวดเร็วทันทีทันใด โดยในตัวอย่างนี้เราจะทำการแคชทุก ๆ 350 เฟรม
ทำได้โดยการดัดแปลงโค้ดดังนี้

#คำสั่งโปรแกรมภาษาไทยธอน
กล่องของฉัน = วัตถุสองมิติ.กล่องสองมิติ(1,1)
กล่องของฉัน.โหมดการวาด = GL_LINE_LOOP
กล่องของฉัน.ใช้พื้นผิว = เท็จ
วงกลมของฉัน = วัตถุสองมิติ.วงกลมสองมิติ(1)
ระยะแคช = 350

คลาส กระสุน:
	นิยาม __เริ่ม__(ตน,x,y,เข้าเป้า):
		ตน.x = x
		ตน.y = y
		ตน.เข้าเป้า = เข้าเป้า

	นิยาม วาด(ตน):
		glBegin(GL_POINTS)
		ถ้า ตน.เข้าเป้า:
			glColor3f(1.0,0.2,0.2)
		นอกจากนั้น:
			glColor3f(0.2,1.0,0.2)
		glVertex2f(ตน.x,ตน.y)
		glEnd()


 อ่านต่อ...
Advertisements

ตามที่สัญญาเอาไว้่ ลองมาดู Simulation ของการหาค่า PI ด้วย วิธีการแบบ Monte Carlo โดยเป็น Visual Simulation กันครับ
(โปรแกรมที่ใช้ในการทำ Simulation นี้ ต้องเป็น Thaithon version 1.09 ขึ้นไป ดาวน์โหลดได้ ที่นี่ https://peacedev.wordpress.com/download/ เลยครับ)

#คำสั่งโปรแกรมภาษาไทยธอน

กล่องของฉัน = วัตถุสองมิติ.กล่องสองมิติ(1,1)
กล่องของฉัน.โหมดการวาด = GL_LINE_LOOP
กล่องของฉัน.ใช้พื้นผิว = เท็จ
วงกลมของฉัน = วัตถุสองมิติ.วงกลมสองมิติ(1)
รายการกระสุน = []

คลาส กระสุน:
	นิยาม __เริ่ม__(ตน,x,y,เข้าเป้า):
		ตน.x = x
		ตน.y = y
		ตน.เข้าเป้า = เข้าเป้า

	นิยาม วาด(ตน):
		glBegin(GL_POINTS)
		ถ้า ตน.เข้าเป้า:
			glColor3f(1.0,0.2,0.2)
		นอกจากนั้น:
			glColor3f(0.2,1.0,0.2)
		glVertex2f(self.x,self.y)
		glEnd()

 อ่านต่อ...

ปกติโดยส่วนตัวแล้วผมเป็นคนชอบใช้งานอะไรที่ง่าย ๆ ไม่ต้องพิธีรีตรองมาก ถึงแม้ว่าจริง ๆ แล้วจะชอบศึกษาเรื่องที่ดูซับซ้อนมาก ๆ ก็ตาม
แต่การอธิบายให้อยู่ในรูปที่เข้าใจได้ง่าย ๆ นั้นน่าจะดีกว่า
ดังนั้นเมื่อต้องการแก้ไขปัญหาบางอย่างที่มีความซับซ้อนขึ้นมา ผมจะชอบเลือกวิธี Brute force มาเป็นอันดับต้น ๆ แม้ว่าไม่ได้ตั้งความหวัง ไว้ว่า 100% ต้องเจอผลลัพธ์อย่างถูกต้องแม่นยำ แต่อย่างน้อยวิธีการนี้อาจทำให้เราเห็นถึงธรรมชาติของปัญหานั้น ๆ ได้เร็วขึ้น
แน่นอน ในการทำงานบางครั้งที่ต้องเจอกับ Tools หรือ Frame work ที่ยุ่งยากซับซ้อน ผมจะทำการ Hack มัน :)

วิธีแบบ Monte Carlo เป็นหนึ่งในวิธีที่ใช้แก้ปัญหาที่เข้ากันกับธรรมชาติของผมมาก
วิธีนี้มี Concept คร่าว ๆ ดังนี้ครับ

1. นิยามค่าที่เป็นไปได้ทั้งหมดของข้อมูล input
2. สุ่มยิงค่า input เข้าไปแบบกระจัดกระจาย
3. ทำการคำนวนหา ความสัมพันธ์ของค่า input เพิ่อหา output ที่ต้องการ
4. รวบรวมผลลัพธ์มาสรุปเป็น คำตอบสุดท้าย

ตัวอย่างสุด Hot ของ Monte Carlo method ก็คงไม่พ้น การหาค่า pi ในแบบ Monte Carlo
จาก step ข้างบน เรามาสรุปเป็นวิธีหาค่า pi ได้ดังนี้

อ่านต่อ…