418341 ภาคต้น 2552: การบ้าน 2
คำเืตือน: การบ้านนี้เป็นการบ้านที่ต้องเขียนโปรแกรมมาก และมีเวลาทำน้อย นอกจากนี้ยังต้องมีความรู้ภาษา C++ เป็นอย่างดี
ุถ้าคุณไม่มั่นใจว่าคุณมีความรู้ภาษา C++ ดีพอ คุณสามารถไปหาข้อมูลเพิ่มเติมได้จาก
นอกจากนี้ โค้ดที่ให้ไปในการบ้านนี้มีจำนวนมาก ผมได้อธิบายรายละิเอียดของโ้ด้ดพวกนี้ไปบางส่วนแล้วในเลคเชอร์วันที่ 19 และ 21 สิงหาคม การดู สไลด์ ประกอบการสอนจะช่วยคุณได้มาก
เนื้อหา
ดาวน์โหลดโค้ด
ขั้นแรกให้ดาวน์โหลดโค้ดจากงลิงนี้ก่อน: homework-02.zip หลัีงจากนั้นให้ขยายไฟล์แล้วเปิดไฟล์ด้วย homework-02.sln ด้วย Microsoft Visual Studio 2008 Express
ข้อ 1: Matrix
เมื่อเปิดไฟล์ homework-02.sln แล้วให้ปิด project ทั้งหมดแล้วเหลือ project เหล่านี้เอาไว้
- gtest
- problem0
- problem1
- problem1_test
โดยการปิดโปรเจคใ้้ห้ทำโดยคลิกขวาที่ชื่อโปรเจคแล้วเลือก Unload Project
หลังจากนั้นให้เปิด problem1.cpp ในโปรเจค problem1 แล้วเติมฟังก์ชันเหล่านี้ให้สมบูรณ์
Matrix4x4 Matrix4x4::identity()
- คืน identity matrix ขนาด 4 คูณ 4
Matrix4x4 Matrix4x4::translate(float x, float y, float z)
- คืน matrix ของการเลื่อนแกนขนานไปตามแกน x เท่ากับอาร์กิวเมนต์ x, ไปตามแกน y เท่ากับอาร์กิวเมนต์ y, และไปตามแกน z เท่ากับอาร์กิวเมนต์ z
Matrix4x4 Matrix4x4::translate_x(float x)
- คืน matrix ของการเลื่อนแกนขนานไปตามแกน x เท่ากับอาร์กิวเมนต์ x
Matrix4x4 Matrix4x4::translate_y(float y)
- คืน matrix ของการเลื่อนแกนขนานไปตามแกน y เท่ากับอาร์กิวเมนต์ y
Matrix4x4 Matrix4x4::translate_z(float z)
- คืน matrix ของการเลื่อนแกนขนานไปตามแกน z เท่ากับอาร์กิวเมนต์ z
Matrix4x4 Matrix4x4::scale(float x, float y, float z)
- คืน matrix ของการย่อขยายขนาดตามแกน x เท่ากับอาร์กิวเมนต์ x เท่า, ตามแกน y เท่ากับอาร์กิวเมนต์ y เท่า, และตามแกน z เท่ากับอาร์กิวเมนต์ z เท่า
Matrix4x4 Matrix4x4::scale_x(float x)
- คืน matrix ของการย่อขยายขนาดตามแกน x เท่ากับอาร์กิวเมนต์ x เท่า
Matrix4x4 Matrix4x4::scale_y(float y)
- คืน matrix ของการย่อขยายขนาดตามแกน y เท่ากับอาร์กิวเมนต์ y เท่า
Matrix4x4 Matrix4x4::scale_z(float z)
- คืน matrix ของการย่อขยายขนาดตามแกน z เท่ากับอาร์กิวเมนต์ z เท่า
Matrix4x4 Matrix4x4::rotate(float degrees, Vector3 axis)
- คืน matrix ของการหมุนเป็นมุม degrees องศา รอบแกน axis
Matrix4x4 Matrix4x4::rotate_x(float degrees)
- คืน matrix ของการหมุนเป็นมุม degrees องศา รอบแกน x
Matrix4x4 Matrix4x4::rotate_y(float degrees)
- คืน matrix ของการหมุนเป็นมุม degrees องศา รอบแกน y
Matrix4x4 Matrix4x4::rotate_z(float degrees)
- คืน matrix ของการหมุนเป็นมุม degrees องศา รอบแกน z
เมื่อเติมเสร็จเรียบร้อยแล้วให้ทดลอง compile ด้วยการกด F7
ถ้าคอมไพล์ผ่านให้เลือกโปรเจค problem1_test เป็น Startup Project โดยคลิกขวาที่ชื่อโปรเจค problem1_test แล้วเลือก Set as Startup Project หลังจากนั้นจึงลองรันมันด้วยการกด Ctrl+F5 ถ้าโปรแกรมคุณทำงานได้ถูกต้อง คุณจะผ่านการทดสอบที่เขียนไว้ใน problem1_test.cpp
ข้อ 2: Transform
หลังจากทำข้อ 1 เสร็จแล้ว ให้เปิดโปรเจค problem2 และ problem2_test ด้วยการคลิกขวาที่ชื่อโปรเจคแล้วเลือก Load Project
ในข้อ 2 นี้เราจะทำการ implement ฟังก์ชันสำหรับสร้าง instance ของคลาส Transform ซึ่งใช้แทน affine transformation ที่สำคัญใน computer graphics
คลาส Transform มีส่วนประกอบเป็น matrix ขนาด 4 คูณ 4 สาม matrix ได้แก่
- m เป็น matrix ของ transform
- mi เป็น inverse ของ m
- mit เป็น inverse transform ของ m (กล่าวคือเป็น transpose ของ mi)