axis-manip.h revision 3f9c2aaadaf4dd5bb8f29d92098dcb6805ca9d97
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen/*
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye * Generic auxiliary routines for 3D axes
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye *
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye * Authors:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen * Maximilian Albert <Anhalter42@gmx.de>
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye *
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye * Copyright (C) 2007 authors
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye *
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye * Released under GNU GPL, read the file 'COPYING' for more information
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye */
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye#ifndef SEEN_AXIS_MANIP_H
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye#define SEEN_AXIS_MANIP_H
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye#include <gtk/gtk.h>
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye#include "libnr/nr-point.h"
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbyenamespace Proj {
73189ea86c6fb0af01e16eaa5b0da3f2bb775c41Harry Pan
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbyeenum VPState {
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbye FINITE = 0,
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner INFINITE
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner};
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
c11ca22dbe6cf6ad259e4848ece6fe5152f9505cLubos Kosco// The X-/Y-/Z-axis corresponds to the first/second/third digit
c11ca22dbe6cf6ad259e4848ece6fe5152f9505cLubos Kosco// in binary representation, respectively.
14a41f02433890d19b2f871156271e3388cd0845Jens Elknerenum Axis {
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner X = 0,
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner Y = 1,
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen Z = 2,
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen W = 3,
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner NONE
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner};
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elknerextern Axis axes[4];
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
c0550b01024b910b8c1468811c0ea663b10b1372Trond Norbyeinline gchar * string_from_axis (Proj::Axis axis) {
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen switch (axis) {
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case X:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return "X";
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner break;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner case Y:
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner return "Y";
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen break;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Z:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return "Z";
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen break;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case W:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return "W";
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner break;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner case NONE:
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner return "NONE";
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen break;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen }
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return "";
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco}
689c2c8d7d285f355a90f35469326d5e51777042Harry Pan
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco} // namespace Proj
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco
73189ea86c6fb0af01e16eaa5b0da3f2bb775c41Harry Pannamespace Box3D {
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Koscoconst double epsilon = 1e-6;
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco// The X-/Y-/Z-axis corresponds to the first/second/third digit
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco// in binary representation, respectively.
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Koscoenum Axis {
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco X = 1,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco Y = 2,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco Z = 4,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco XY = 3,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco XZ = 5,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco YZ = 6,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco XYZ = 7,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco NONE = 0
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco};
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco// We use the fourth bit in binary representation
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco// to indicate whether a face is front or rear.
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Koscoenum FrontOrRear { // find a better name
4fd421f78fa03a25d6771c9347f33699ae8ca20cLubos Kosco FRONT = 0,
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco REAR = 8
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco};
99b4056e2c5b0a51f7f480ebcefb1f917613ce2aLubos Kosco
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco// converts X, Y, Z respectively to 0, 1, 2 (for use as array indices, e.g)
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Koscoinline int axis_to_int(Box3D::Axis axis) {
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco switch (axis) {
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco case Box3D::X:
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco return 0;
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco break;
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco case Box3D::Y:
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco return 1;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan break;
689c2c8d7d285f355a90f35469326d5e51777042Harry Pan case Box3D::Z:
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan return 2;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner break;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Box3D::NONE:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return -1;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen break;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen default:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen g_assert_not_reached();
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner }
689c2c8d7d285f355a90f35469326d5e51777042Harry Pan}
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatleninline Proj::Axis toProj(Box3D::Axis axis) {
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen switch (axis) {
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Box3D::X:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return Proj::X;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Box3D::Y:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return Proj::Y;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Box3D::Z:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return Proj::Z;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Box3D::NONE:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return Proj::NONE;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen default:
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner g_assert_not_reached();
9c4ded641ae76132f262728f5d64e30fb004ae47Lubos Kosco }
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner}
9c4ded641ae76132f262728f5d64e30fb004ae47Lubos Kosco
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Panextern Axis axes[3];
73189ea86c6fb0af01e16eaa5b0da3f2bb775c41Harry Panextern Axis planes[3];
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Panextern FrontOrRear face_positions [2];
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan
9c4ded641ae76132f262728f5d64e30fb004ae47Lubos Kosco} // namespace Box3D
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlennamespace Proj {
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatleninline Box3D::Axis toAffine(Proj::Axis axis) {
9c4ded641ae76132f262728f5d64e30fb004ae47Lubos Kosco switch (axis) {
9c4ded641ae76132f262728f5d64e30fb004ae47Lubos Kosco case Proj::X:
99b4056e2c5b0a51f7f480ebcefb1f917613ce2aLubos Kosco return Box3D::X;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Proj::Y:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return Box3D::Y;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Proj::Z:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return Box3D::Z;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case Proj::NONE:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen return Box3D::NONE;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen default:
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen g_assert_not_reached();
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen }
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen}
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen} // namespace Proj
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlennamespace Box3D {
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan// Given a bit sequence that unambiguously specifies the face of a 3D box,
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan// return a number between 0 and 5 corresponding to that particular face
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen// (which is normally used to index an array). Return -1 if the bit sequence
9c4ded641ae76132f262728f5d64e30fb004ae47Lubos Kosco// does not specify a face. A face can either be given by its plane (e.g, XY)
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan// or by the axis that is orthogonal to it (e.g., Z).
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan/***
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatleninline gint face_to_int (guint face_id) {
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan switch (face_id) {
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 1: return 0;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 2: return 2;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 4: return 4;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 3: return 4;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 5: return 2;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 6: return 0;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 9: return 1;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 10: return 3;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 12: return 5;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner case 11: return 5;
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen case 13: return 3;
689c2c8d7d285f355a90f35469326d5e51777042Harry Pan case 14: return 1;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan default: return -1;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan }
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan}
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan***/
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner/***
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Paninline gint int_to_face (guint id) {
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan switch (id) {
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner case 0: return 6;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 1: return 14;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 2: return 5;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner case 3: return 13;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 4: return 3;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 5: return 11;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan default: return -1;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan }
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan}
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco***/
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan/*
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan * New version:
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan * Identify the axes X, Y, Z with the numbers 0, 1, 2.
9a4361e23046cda58b9a5b8f4e11910dc433badaLubos Kosco * A box's face is identified by the axis perpendicular to it.
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan * For a rear face, add 3.
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan */
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan// Given a bit sequence that unambiguously specifies the face of a 3D box,
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner// return a number between 0 and 5 corresponding to that particular face
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan// (which is normally used to index an array). Return -1 if the bit sequence
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner// does not specify a face. A face can either be given by its plane (e.g, XY)
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan// or by the axis that is orthogonal to it (e.g., Z).
14a41f02433890d19b2f871156271e3388cd0845Jens Elknerinline gint face_to_int (guint face_id) {
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger switch (face_id) {
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner case 1: return 0;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 2: return 1;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 4: return 2;
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan case 3: return 2;
60281ca3d1db22f5d2204e1be4975504853072a7Lubos Kosco case 5: return 1;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 6: return 0;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 9: return 3;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 10: return 4;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 12: return 5;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 11: return 5;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 13: return 4;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 14: return 3;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger default: return -1;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger }
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger}
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulingerinline gint int_to_face (guint id) {
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger switch (id) {
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 0: return Box3D::YZ ^ Box3D::FRONT;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 1: return Box3D::XZ ^ Box3D::FRONT;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 2: return Box3D::XY ^ Box3D::FRONT;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 3: return Box3D::YZ ^ Box3D::REAR;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 4: return Box3D::XZ ^ Box3D::REAR;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger case 5: return Box3D::XY ^ Box3D::REAR;
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger }
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger return Box3D::NONE; // should not be reached
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger}
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulingerinline bool is_face_id (guint face_id) {
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger return !((face_id & 0x7) == 0x7);
7bd2c3ec009c3f4fa8befb880b354fee06961acbKryštof Tulinger}
ba7acbadb299581bd4e995c01d86200e3c04a5c7Harry Pan
59b6a8c0cc6ef741a7180504b3c371e67c2aa338Knut Anders Hatlen/**
14a41f02433890d19b2f871156271e3388cd0845Jens Elknerinline gint opposite_face (guint face_id) {
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner return face_id + (((face_id % 2) == 0) ? 1 : -1);
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner}
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner**/
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elknerinline guint number_of_axis_directions (Box3D::Axis axis) {
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner guint num = 0;
4fd421f78fa03a25d6771c9347f33699ae8ca20cLubos Kosco 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);
}
/***
// Warning: We don't check that axis really unambiguously specifies a plane.
// Make sure this is the case when calling this function.
inline gint face_containing_corner (Box3D::Axis axis, guint corner) {
if (!is_single_axis_direction (axis)) {
axis = (Box3D::Axis) (axis ^ Box3D::XYZ);
}
return face_to_int (axis ^ ((corner & axis) ? Box3D::REAR : Box3D::FRONT));
}
***/
/**
* Given two axis directions out of {X, Y, Z} or the corresponding plane, return the remaining one
* We don't check if 'plane' really specifies a plane (i.e., if it consists of precisely two directions).
*/
inline Box3D::Axis third_axis_direction (Box3D::Axis dir1, Box3D::Axis dir2) {
return (Box3D::Axis) ((dir1 + dir2) ^ 0x7);
}
inline Box3D::Axis third_axis_direction (Box3D::Axis plane) {
return (Box3D::Axis) (plane ^ 0x7);
}
/* returns the first/second axis direction occuring in the (possibly compound) expression 'dirs' */
inline Box3D::Axis extract_first_axis_direction (Box3D::Axis dirs) {
if (dirs & Box3D::X) return Box3D::X;
if (dirs & Box3D::Y) return Box3D::Y;
if (dirs & Box3D::Z) return Box3D::Z;
return Box3D::NONE;
}
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_or_axis (Box3D::Axis axis) {
return (Box3D::Axis) (Box3D::XYZ ^ axis);
}
/* returns an axis direction perpendicular to the ones occuring in the (possibly compound) expression 'dirs' */
inline Box3D::Axis get_perpendicular_axis_direction (Box3D::Axis dirs) {
if (!(dirs & Box3D::X)) return Box3D::X;
if (!(dirs & Box3D::Y)) return Box3D::Y;
if (!(dirs & Box3D::Z)) return Box3D::Z;
return Box3D::NONE;
}
inline gchar * string_from_axes (Box3D::Axis axes) {
GString *pstring = g_string_new("");
if (axes & Box3D::X) g_string_append_printf (pstring, "X");
if (axes & Box3D::Y) g_string_append_printf (pstring, "Y");
if (axes & Box3D::Z) g_string_append_printf (pstring, "Z");
return pstring->str;
}
std::pair <Axis, Axis> get_remaining_axes (Axis axis);
} // namespace Box3D
#endif /* !SEEN_AXIS_MANIP_H */
/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(inline-open . 0))
indent-tabs-mode:nil
fill-column:99
End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :