tron@3147: /* $Id$ */ tron@3147: rubidium@8100: /** @file direction_func.h Different functions related to conversions between directions. */ rubidium@5587: rubidium@8100: #ifndef DIRECTION_FUNC_H rubidium@8100: #define DIRECTION_FUNC_H tron@3147: rubidium@8100: #include "direction_type.h" rubidium@5587: rubidium@7394: /** rubidium@7394: * Return the reverse of a direction rubidium@7394: * rubidium@7394: * @param d The direction to get the reverse from rubidium@7394: * @return The reverse Direction rubidium@7394: */ tron@3157: static inline Direction ReverseDir(Direction d) tron@3157: { tron@3157: return (Direction)(4 ^ d); tron@3157: } tron@3157: tron@3147: rubidium@7394: /** rubidium@7394: * Calculate the difference between to directions rubidium@7394: * rubidium@7394: * @param d0 The first direction as the base rubidium@7394: * @param d1 The second direction as the offset from the base rubidium@7394: * @return The difference how the second directions drifts of the first one. rubidium@7394: */ tron@3158: static inline DirDiff DirDifference(Direction d0, Direction d1) tron@3158: { tron@3162: return (DirDiff)((d0 + 8 - d1) % 8); tron@3158: } tron@3158: rubidium@7394: /** rubidium@7394: * Applies two differences together rubidium@7394: * rubidium@7394: * This function adds two differences together and return the resulting rubidium@7394: * difference. So adding two DIRDIFF_REVERSE together results in the rubidium@7394: * DIRDIFF_SAME difference. rubidium@7394: * rubidium@7394: * @param d The first difference rubidium@7394: * @param delta The second difference to add on rubidium@7394: * @return The resulting difference rubidium@7394: */ tron@3158: static inline DirDiff ChangeDirDiff(DirDiff d, DirDiff delta) tron@3158: { tron@3158: return (DirDiff)((d + delta) % 8); tron@3158: } tron@3158: rubidium@7394: /** rubidium@7394: * Change a direction by a given difference rubidium@7394: * rubidium@7394: * This functions returns a new direction of the given direction rubidium@7394: * which is rotated by the given difference. rubidium@7394: * rubidium@7394: * @param d The direction to get a new direction from rubidium@7394: * @param delta The offset/drift applied to the direction rubidium@7394: * @return The new direction rubidium@7394: */ tron@3158: static inline Direction ChangeDir(Direction d, DirDiff delta) tron@3158: { tron@3158: return (Direction)((d + delta) % 8); tron@3158: } tron@3158: tron@3158: rubidium@7394: /** rubidium@7394: * Returns the reverse direction of the given DiagDirection rubidium@7394: * rubidium@7394: * @param d The DiagDirection to get the reverse from rubidium@7394: * @return The reverse direction rubidium@7394: */ tron@3147: static inline DiagDirection ReverseDiagDir(DiagDirection d) tron@3147: { tron@3148: return (DiagDirection)(2 ^ d); tron@3147: } tron@3147: rubidium@7641: rubidium@7394: /** rubidium@7394: * Applies a difference on a DiagDirection rubidium@7394: * rubidium@7394: * This function applies a difference on a DiagDirection and returns rubidium@7394: * the new DiagDirection. rubidium@7394: * rubidium@7394: * @param d The DiagDirection rubidium@7394: * @param delta The difference to applie on rubidium@7394: * @return The new direction which was calculated rubidium@7394: */ tron@3163: static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta) tron@3163: { tron@3163: return (DiagDirection)((d + delta) % 4); tron@3163: } tron@3163: rubidium@7394: /** rubidium@7394: * Convert a Direction to a DiagDirection. rubidium@7394: * rubidium@7394: * This function can be used to convert the 8-way Direction to rubidium@7394: * the 4-way DiagDirection. If the direction cannot be mapped its rubidium@7394: * "rounded clockwise". So DIR_N becomes DIAGDIR_NE. rubidium@7394: * rubidium@7394: * @param dir The direction to convert rubidium@7394: * @return The resulting DiagDirection, maybe "rounded clockwise". rubidium@7394: */ tron@3153: static inline DiagDirection DirToDiagDir(Direction dir) tron@3147: { tron@3147: return (DiagDirection)(dir >> 1); tron@3147: } tron@3147: rubidium@7394: /** rubidium@7394: * Convert a DiagDirection to a Direction. rubidium@7394: * rubidium@7394: * This function can be used to convert the 4-way DiagDirection rubidium@7394: * to the 8-way Direction. As 4-way are less than 8-way not all rubidium@7394: * possible directions can be calculated. rubidium@7394: * rubidium@7394: * @param dir The direction to convert rubidium@7394: * @return The resulting Direction rubidium@7394: */ tron@3153: static inline Direction DiagDirToDir(DiagDirection dir) tron@3153: { tron@3153: return (Direction)(dir * 2 + 1); tron@3153: } tron@3153: tron@3153: rubidium@7394: /** rubidium@7394: * Select the other axis as provided. rubidium@7394: * rubidium@7394: * This is basically the not-operator for the axis. rubidium@7394: * rubidium@7394: * @param a The given axis rubidium@7394: * @return The other axis rubidium@7394: */ tron@4158: static inline Axis OtherAxis(Axis a) tron@4158: { tron@4158: return (Axis)(a ^ 1); tron@4158: } tron@4158: tron@4158: rubidium@7394: /** rubidium@7394: * Convert a DiagDirection to the axis. rubidium@7394: * rubidium@7394: * This function returns the axis which belongs to the given rubidium@7394: * DiagDirection. The axis X belongs to the DiagDirection rubidium@7394: * north-east and south-west. rubidium@7394: * rubidium@7394: * @param d The DiagDirection rubidium@7394: * @return The axis which belongs to the direction rubidium@7394: */ tron@3154: static inline Axis DiagDirToAxis(DiagDirection d) tron@3154: { tron@3154: return (Axis)(d & 1); tron@3154: } tron@3154: tron@3209: rubidium@7394: /** tron@3209: * Converts an Axis to a DiagDirection rubidium@7394: * rubidium@7394: * This function returns the DiagDirection which rubidium@7394: * belongs to the axis. As 2 directions are mapped to an axis rubidium@7394: * this function returns the one which points to south, rubidium@7394: * either south-west (on X axis) or south-east (on Y axis) rubidium@7394: * rubidium@7394: * @param a The axis rubidium@7394: * @return The direction pointed to south tron@3209: */ tron@3209: static inline DiagDirection AxisToDiagDir(Axis a) tron@3209: { tron@3209: return (DiagDirection)(2 - a); tron@3209: } tron@3209: tron@3953: /** smatz@9045: * Converts an Axis to a Direction smatz@9045: * smatz@9045: * This function returns the Direction which smatz@9045: * belongs to the axis. As 2 directions are mapped to an axis smatz@9045: * this function returns the one which points to south, smatz@9045: * either south-west (on X axis) or south-east (on Y axis) smatz@9045: * smatz@9045: * @param a The axis smatz@9045: * @return The direction pointed to south smatz@9045: */ smatz@9045: static inline Direction AxisToDirection(Axis a) smatz@9045: { smatz@9045: return (Direction)(5 - 2 * a); smatz@9045: } smatz@9045: smatz@9045: /** tron@3953: * Convert an axis and a flag for north/south into a DiagDirection belugas@6432: * @param xy axis to convert tron@3953: * @param ns north -> 0, south -> 1 belugas@6432: * @return the desired DiagDirection tron@3953: */ tron@3953: static inline DiagDirection XYNSToDiagDir(Axis xy, uint ns) tron@3953: { tron@3953: return (DiagDirection)(xy * 3 ^ ns * 2); tron@3953: } tron@3953: rubidium@7394: /** rubidium@7394: * Checks if an interger value is a valid DiagDirection rubidium@7394: * rubidium@7394: * @param d The value to check rubidium@7394: * @return True if the value belongs to a DiagDirection, else false rubidium@7394: */ matthijs@3699: static inline bool IsValidDiagDirection(DiagDirection d) matthijs@3699: { matthijs@3699: return d < DIAGDIR_END; matthijs@3699: } matthijs@3699: rubidium@7394: /** rubidium@7394: * Checks if an integer value is a valid Direction rubidium@7394: * rubidium@7394: * @param d The value to check rubidium@7394: * @return True if the value belongs to a Direction, else false rubidium@7394: */ glx@3744: static inline bool IsValidDirection(Direction d) matthijs@3699: { matthijs@3699: return d < DIR_END; matthijs@3699: } matthijs@3699: rubidium@7394: /** rubidium@7394: * Checks if an integer value is a valid Axis rubidium@7394: * rubidium@7394: * @param d The value to check rubidium@7394: * @return True if the value belongs to an Axis, else false rubidium@7394: */ glx@3744: static inline bool IsValidAxis(Axis d) matthijs@3699: { matthijs@3699: return d < AXIS_END; matthijs@3699: } matthijs@3699: peter1138@4666: #endif /* DIRECTION_H */