X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Faxis-manip.h;h=835f67a97458be83be920b22a088d2652804bcd8;hb=7b51296159813ffbc382e4decef735f222ee23f8;hp=7ad716046286d9474d633af5925735748498a2a6;hpb=536ac52055722b168e4482f612302fa754dc4f72;p=inkscape.git diff --git a/src/axis-manip.h b/src/axis-manip.h index 7ad716046..835f67a97 100644 --- a/src/axis-manip.h +++ b/src/axis-manip.h @@ -15,8 +15,43 @@ #include #include "libnr/nr-point.h" +namespace Proj { + +enum VPState { + VP_FINITE = 0, + VP_INFINITE +}; + +// The X-/Y-/Z-axis corresponds to the first/second/third digit +// in binary representation, respectively. +enum Axis { + X = 0, + Y = 1, + Z = 2, + W = 3, + NONE +}; + +extern Axis axes[4]; + +inline gchar const * +string_from_axis(Proj::Axis axis) { + switch (axis) { + case X: return "X"; break; + case Y: return "Y"; break; + case Z: return "Z"; break; + case W: return "W"; break; + case NONE: return "NONE"; break; + } + return ""; +} + +} // namespace Proj + namespace Box3D { +const double epsilon = 1e-6; + // The X-/Y-/Z-axis corresponds to the first/second/third digit // in binary representation, respectively. enum Axis { @@ -37,10 +72,73 @@ enum FrontOrRear { // find a better name REAR = 8 }; +// converts X, Y, Z respectively to 0, 1, 2 (for use as array indices, e.g) +inline int axis_to_int(Box3D::Axis axis) { + switch (axis) { + case Box3D::X: + return 0; + break; + case Box3D::Y: + return 1; + break; + case Box3D::Z: + return 2; + break; + case Box3D::NONE: + return -1; + break; + default: + g_assert_not_reached(); + } +} + +inline Proj::Axis toProj(Box3D::Axis axis) { + switch (axis) { + case Box3D::X: + return Proj::X; + case Box3D::Y: + return Proj::Y; + case Box3D::Z: + return Proj::Z; + case Box3D::NONE: + return Proj::NONE; + default: + g_assert_not_reached(); + } +} + extern Axis axes[3]; extern Axis planes[3]; extern FrontOrRear face_positions [2]; +} // namespace Box3D + +namespace Proj { + +inline Box3D::Axis toAffine(Proj::Axis axis) { + switch (axis) { + case Proj::X: + return Box3D::X; + case Proj::Y: + return Box3D::Y; + case Proj::Z: + return Box3D::Z; + case Proj::NONE: + return Box3D::NONE; + default: + g_assert_not_reached(); + } +} + +} // namespace Proj + +namespace Box3D { + +/* + * Identify the axes X, Y, Z with the numbers 0, 1, 2. + * A box's face is identified by the axis perpendicular to it. + * For a rear face, add 3. + */ // Given a bit sequence that unambiguously specifies the face of a 3D box, // return a number between 0 and 5 corresponding to that particular face // (which is normally used to index an array). Return -1 if the bit sequence @@ -49,23 +147,58 @@ extern FrontOrRear face_positions [2]; inline gint face_to_int (guint face_id) { switch (face_id) { case 1: return 0; - case 2: return 2; - case 4: return 4; - case 3: return 4; - case 5: return 2; + case 2: return 1; + case 4: return 2; + case 3: return 2; + case 5: return 1; case 6: return 0; - case 9: return 1; - case 10: return 3; + case 9: return 3; + case 10: return 4; case 12: return 5; case 11: return 5; - case 13: return 3; - case 14: return 1; + case 13: return 4; + case 14: return 3; default: return -1; } } +inline gint int_to_face (guint id) { + switch (id) { + case 0: return Box3D::YZ ^ Box3D::FRONT; + case 1: return Box3D::XZ ^ Box3D::FRONT; + case 2: return Box3D::XY ^ Box3D::FRONT; + case 3: return Box3D::YZ ^ Box3D::REAR; + case 4: return Box3D::XZ ^ Box3D::REAR; + case 5: return Box3D::XY ^ Box3D::REAR; + } + return Box3D::NONE; // should not be reached +} + +inline bool is_face_id (guint face_id) { + return !((face_id & 0x7) == 0x7); +} + +/** +inline gint opposite_face (guint face_id) { + return face_id + (((face_id % 2) == 0) ? 1 : -1); +} +**/ + +inline guint number_of_axis_directions (Box3D::Axis axis) { + guint num = 0; + if (axis & Box3D::X) num++; + if (axis & Box3D::Y) num++; + if (axis & Box3D::Z) num++; + + return num; +} + +inline bool is_plane (Box3D::Axis plane) { + return (number_of_axis_directions (plane) == 2); +} + inline bool is_single_axis_direction (Box3D::Axis dir) { // tests whether dir is nonzero and a power of 2 return (!(dir & (dir - 1)) && dir); @@ -93,7 +226,7 @@ inline Box3D::Axis extract_second_axis_direction (Box3D::Axis dirs) { return extract_first_axis_direction ((Box3D::Axis) (dirs ^ extract_first_axis_direction(dirs))); } -inline Box3D::Axis orth_plane (Box3D::Axis axis) { +inline Box3D::Axis orth_plane_or_axis (Box3D::Axis axis) { return (Box3D::Axis) (Box3D::XYZ ^ axis); } @@ -113,6 +246,8 @@ inline gchar * string_from_axes (Box3D::Axis axes) { return pstring->str; } +std::pair get_remaining_axes (Axis axis); + } // namespace Box3D #endif /* !SEEN_AXIS_MANIP_H */