我建議改變一下你如何查看變換。
使transform
一個類,使它不需要其他類派生它。所有需要轉換點的數據都可以保存在這個類中。
添加構造縮放變換,平移變換和旋轉變換的函數。
添加函數來乘法變換,並乘以一個變換和一個點。這些可以是用於轉換其他形狀的構件。
根據需要添加用於轉換其他形狀的函數。
在骨骼形態,
class transform { ... };
class position { ... };
// tag structs
struct rotation_about_x {};
struct rotation_about_y {};
struct rotation_about_z {};
// Functions to construct transforms
transform construct_scale_transform(double scale_factor) { ... };
transform construct_translation_transform(position pos) { ... };
transform construct_rotation_transform(double angle, rotation_about_x tag) { ... };
transform construct_rotation_transform(double angle, rotation_about_y tag) { ... };
transform construct_rotation_transform(double angle, rotation_about_z tag) { ... };
// Function to transform a point.
position operator*(transform const& t, position const& p) { ... }
// Function to multiply transforms.
transform operator*(transform const& t1, transform const& t2) { ... }
// Functions to apply transforms to other objects.
triangle operator*(transform const& tr, triangle const& t) { ... }
...
用法:
transform t1 = construct_rotation_transform(10, rotation_about_x{});
transform t2 = construct_translation_transform({20, 10, 0});
position p1{100, 200, 30};
position p2 = t1*t2*p1;
triangle tr1{ ... }
triangle tr2 = t1*t2*tr1;
如果你要使用相同的組合變換多次,計算加起來變換第一和將其用於所有轉換。
transform t1 = construct_rotation_transform(10, rotation_about_x{});
transform t2 = construct_rotation_transform(5, rotation_about_y{});
transform t3 = construct_translation_transform({20, 10, 0});
tranform tc = t1 * t2 * t3;
position p1{100, 200, 30};
position p2 = tc*p1;
triangle tr1{ ... }
triangle tr2 = tc*tr1;
那麼,你要麼具有外部世界可見的功能(其中包括派生類),要麼將其隱藏給每個人。 – DeiDei
可以apply_transforms三角形類上的公共靜態? –
我建議你不要再爲此煩惱了。你困擾我的字符串類,它與幾何無關,也可以訪問這個函數嗎? –