Tôi đang tự học toán 3D và trong quá trình xây dựng động cơ thô sơ của riêng mình (thuộc loại). Tôi đã tự hỏi điều gì sẽ là cách tốt nhất để cấu trúc lớp ma trận C ++ của tôi. Có một vài tùy chọn:
Các biến thành viên riêng biệt:
struct Mat4 { float m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44; // methods }
Một mảng đa chiều:
struct Mat4 { float[4][4] m; // methods }
Một mảng các vectơ
struct Mat4 { Vec4[4] m; // methods }
Tôi đoán sẽ có những mặt tích cực và tiêu cực cho mỗi.
Từ 3D Math Primer cho Phát triển đồ họa và trò chơi, Phiên bản 2 tr.155:
Ma trận sử dụng các chỉ số dựa trên 1, vì vậy hàng và cột đầu tiên được đánh số 1. Ví dụ:
a12
(đọca
một trong hai, không phải làa
mười hai 12) là phần tử trong hàng đầu tiên, cột thứ hai. Lưu ý rằng điều này khác với các ngôn ngữ lập trình như C ++ và Java, sử dụng các chỉ số mảng dựa trên 0. Một ma trận không có cột 0 hoặc hàng 0. Sự khác biệt về lập chỉ mục này có thể gây ra một số nhầm lẫn nếu ma trận được lưu trữ bằng cách sử dụng một kiểu dữ liệu mảng thực tế. Vì lý do này, thông thường các lớp lưu trữ ma trận kích thước nhỏ, cố định thuộc loại được sử dụng cho mục đích hình học để cung cấp cho mỗi phần tử biến thành viên có tên riêng của nó, chẳng hạn nhưfloat a11
, thay vì sử dụng hỗ trợ mảng gốc của ngôn ngữ với thứ gì đó như floatelem[3][3]
.
Vì vậy, đó là một phiếu bầu cho phương pháp một.
Đây thực sự là cách được chấp nhận để làm mọi thứ? Có vẻ khá khó sử dụng nếu lợi ích duy nhất sẽ gắn bó với ký hiệu toán học thông thường.