Để tính được hướng phản xạ của khi một vật thể va chạm vào mặt phẳng, ta có thể dựa vào góc nghiêng của mặt phẳng và vector theo từng vùng giá trị. Tuy nhiên cách tổng quát hơn là sử dụng các phép toán trên vector để thực hiện.
Xem Demo
1. Kiểm tra hai đoạn thẳng cắt nhau
Từ bài viết trước về tìm giao điểm của hai đường thẳng, ta có thể kiểm tra xem giao điểm tìm được có phải là giao điểm của hai đoạn thẳng hay không. Cách kiểm tra đơn giản là bạn xem điểm này có thuộc cả hai phần bao hình chữ nhật của hai đoạn thẳng. Ta có phương thức kiểm tra như sau:
// detect if a point is inside the rectangle bound of this line Line.prototype.insideRectBound = function(x, y){
if( Math.min(this.p1.x,this.p2.x) - x > EPSILON || x - Math.max(this.p1.x,this.p2.x) > EPSILON || Math.min(this.p1.y,this.p2.y) - y > EPSILON || y - Math.max(this.p1.y,this.p2.y) > EPSILON) return false; return true; } // ...
59 | P a g e
2. Phương pháp
Trong hình minh họa sau, vector v là hướng di chuyển của vật thể va chạm vào u. Vector phản xạ của v là b. Từ vector b ta phân tích ra hai vector thành phần là a và c (như vậy ta có a + c = b). Trong đó: a: vector chiếu của v trên u. c: vector chiếu của v trên đường thẳng vng góc với u. Đây là vector pháp tuyến của u và có độ dài bằng khoảng cách từ gốc của v đến u. Như vậy để tìm được vector phản xạ b, ta chỉ cần theo 4 bước:
1. Tìm giao điểm của hai đoạn thẳng (tương ứng với hai vector v và u). 2. Tìm vector chiếu a của v trên u.
3. Tìm vector pháp tuyến của u có độ dài bằng khoảng cách từ gốc của v đến u. 4. Tính tổng vector a và c.
Xem mã nguồn minh họa bằng javascript tại trang sau để thấy chi tiết hơn:
http://yinyangit.wordpress.com/2012/04/10/gamedev-vector2d-va-cham- va-phan- xa/