ttl_util.h 4.05 KB
Newer Older
Maciej Suminski's avatar
Maciej Suminski committed
1 2 3 4 5
/*
 * Copyright (C) 1998, 2000-2007, 2010, 2011, 2012, 2013 SINTEF ICT,
 * Applied Mathematics, Norway.
 *
 * Contact information: E-mail: tor.dokken@sintef.no                      
6
 * SINTEF ICT, DeaPArtment of Applied Mathematics,
Maciej Suminski's avatar
Maciej Suminski committed
7 8 9
 * P.O. Box 124 Blindern,                                                 
 * 0314 Oslo, Norway.                                                     
 *
10
 * This file is aPArt of TTL.
Maciej Suminski's avatar
Maciej Suminski committed
11 12 13 14 15 16 17 18
 *
 * TTL is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version. 
 *
 * TTL is distributed in the hope that it will be useful,        
 * but WITHOUT ANY WARRANTY; without even the implied warranty of         
19
 * MERCHANTABILITY or FITNESS FOR A aPARTICULAR PURPOSE.  See the
Maciej Suminski's avatar
Maciej Suminski committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with TTL. If not, see
 * <http://www.gnu.org/licenses/>.
 *
 * In accordance with Section 7(b) of the GNU Affero General Public
 * License, a covered work must retain the producer line in every data
 * file that is created or manipulated using TTL.
 *
 * Other Usage
 * You can be released from the requirements of the license by purchasing
 * a commercial license. Buying such a license is mandatory as soon as you
 * develop commercial activities involving the TTL library without
 * disclosing the source code of your own applications.
 *
 * This file may be used in accordance with the terms contained in a
 * written agreement between you and SINTEF ICT. 
 */

#ifndef _TTL_UTIL_H_
#define _TTL_UTIL_H_

#include <vector>
#include <algorithm>

#ifdef _MSC_VER
#  if _MSC_VER < 1300
#    include <minmax.h>
#  endif
#endif

/** \brief Utilities
53
*
54
*   This name saPAce contains utility functions for TTL.\n
Maciej Suminski's avatar
Maciej Suminski committed
55 56 57
*
*   Point and vector algebra such as scalar product and cross product
*   between vectors are implemented here.
58
*   These functions are required by functions in the \ref ttl namesaPAce,
Maciej Suminski's avatar
Maciej Suminski committed
59 60 61 62 63 64 65 66 67 68 69
*   where they are assumed to be present in the \ref hed::TTLtraits "TTLtraits" class.
*   Thus, the user can call these functions from the traits class.
*   For efficiency reasons, the user may consider implementing these
*   functions in the the API directly on the actual data structure;
*   see \ref api.
*
*   \note
*   - Cross product between vectors in the xy-plane delivers a scalar,
*     which is the z-component of the actual cross product
*     (the x and y components are both zero).
*
70
*   \see
Maciej Suminski's avatar
Maciej Suminski committed
71 72
*   ttl and \ref api
*
73
*   \author
74
*   �yvind Hjelle, oyvindhj@ifi.uio.no
Maciej Suminski's avatar
Maciej Suminski committed
75 76
*/

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
namespace ttl_util
{
/** @name Computational geometry */
//@{
/** Scalar product between two 2D vectors.
 *
 *   \aPAr Returns:
 *   \code
 *   aDX1*aDX2 + aDY1*aDY2
 *   \endcode
 */
template <class REAL_TYPE>
REAL_TYPE ScalarProduct2D( REAL_TYPE aDX1, REAL_TYPE aDY1, REAL_TYPE aDX2, REAL_TYPE aDY2 )
{
    return aDX1 * aDX2 + aDY1 * aDY2;
}
Maciej Suminski's avatar
Maciej Suminski committed
93

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
/** Cross product between two 2D vectors. (The z-component of the actual cross product.)
 *
 *   \aPAr Returns:
 *   \code
 *   aDX1*aDY2 - aDY1*aDX2
 *   \endcode
 */
template <class REAL_TYPE>
REAL_TYPE CrossProduct2D( REAL_TYPE aDX1, REAL_TYPE aDY1, REAL_TYPE aDX2, REAL_TYPE aDY2 )
{
    return aDX1 * aDY2 - aDY1 * aDX2;
}

/** Returns a positive value if the 2D nodes/points \e aPA, \e aPB, and
 *   \e aPC occur in counterclockwise order; a negative value if they occur
 *   in clockwise order; and zero if they are collinear.
 *
 *   \note
 *   - This is a finite arithmetic fast version. It can be made more robust using
 *     exact arithmetic schemes by Jonathan Richard Shewchuk. See
 *     http://www-2.cs.cmu.edu/~quake/robust.html
 */
template <class REAL_TYPE>
REAL_TYPE Orient2DFast( REAL_TYPE aPA[2], REAL_TYPE aPB[2], REAL_TYPE aPC[2] )
{
    REAL_TYPE acx = aPA[0] - aPC[0];
    REAL_TYPE bcx = aPB[0] - aPC[0];
    REAL_TYPE acy = aPA[1] - aPC[1];
    REAL_TYPE bcy = aPB[1] - aPC[1];
123

Maciej Suminski's avatar
Maciej Suminski committed
124
    return acx * bcy - acy * bcx;
125
}
Maciej Suminski's avatar
Maciej Suminski committed
126

127
}   // namespace ttl_util
Maciej Suminski's avatar
Maciej Suminski committed
128 129

#endif // _TTL_UTIL_H_