File: triangle2.h

package info (click to toggle)
meshlab 2020.09%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 45,124 kB
  • sloc: cpp: 400,238; ansic: 31,952; javascript: 1,578; sh: 387; yacc: 238; lex: 139; python: 86; makefile: 29
file content (147 lines) | stat: -rw-r--r-- 5,895 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/****************************************************************************
* VCGLib                                                            o o     *
* Visual and Computer Graphics Library                            o     o   *
*                                                                _   O  _   *
* Copyright(C) 2004-2016                                           \/)\/    *
* Visual Computing Lab                                            /\/|      *
* ISTI - Italian National Research Council                           |      *
*                                                                    \      *
* All rights reserved.                                                      *
*                                                                           *
* This program is free software; you can redistribute it and/or modify      *   
* it under the terms of the GNU General Public License as published by      *
* the Free Software Foundation; either version 2 of the License, or         *
* (at your option) any later version.                                       *
*                                                                           *
* This program is distributed in the hope that it will be useful,           *
* but WITHOUT ANY WARRANTY; without even the implied warranty of            *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)          *
* for more details.                                                         *
*                                                                           *
****************************************************************************/
/****************************************************************************
  History

****************************************************************************/

#ifndef __VCG_TRIANGLE2
#define __VCG_TRIANGLE2
#include <vcg/space/point2.h>
#include <vcg/space/segment2.h>
#include <float.h>

namespace vcg {

/** \addtogroup space */
/*@{*/
/** 
        Templated class for storing a generic triangle in a 2D space.
    Note the relation with the Face class of TriMesh complex, both classes provide the P(i) access functions to their points and therefore they share the algorithms on it (e.g. area, normal etc...)
 */
template <class SCALAR_TYPE> class Triangle2
{
public:
    typedef SCALAR_TYPE ScalarType;
    typedef Point2< ScalarType > CoordType;
    typedef Triangle2<ScalarType> TriangleType;

protected:
    /// Vector of vertex pointer incident in the face
    Point2<ScalarType> _v[3];
public:

    Triangle2()
    {}

    Triangle2(const CoordType &p0,const CoordType &p1,const CoordType &p2)
    {
        P(0)=p0;
        P(1)=p1;
        P(2)=p2;
    }

    /// Shortcut per accedere ai punti delle facce
    inline CoordType & P( const int j ) { return _v[j];}
    inline CoordType & P0( const int j ) { return _v[j];}
    inline CoordType & P1( const int j ) { return _v[(j+1)%3];}
    inline CoordType & P2( const int j ) { return _v[(j+2)%3];}
    inline const CoordType &  P( const int j ) const { return _v[j];}
    inline const CoordType &  P0( const int j ) const { return _v[j];}
    inline const CoordType &  P1( const int j ) const { return _v[(j+1)%3];}
    inline const CoordType &  P2( const int j ) const { return _v[(j+2)%3];}
    inline const CoordType & cP0( const int j ) const { return _v[j];}
    inline const CoordType & cP1( const int j ) const { return _v[(j+1)%3];}
    inline const CoordType & cP2( const int j ) const { return _v[(j+2)%3];}

    /** evaluate barycentric coordinates
    @param bq Point on the face
    @param L0 barycentric value for V(0)
    @param L1 barycentric value for V(1)
    @param L2 barycentric value for V(2)
    @return true se bq appartain to the face, false otherwise
    from http://en.wikipedia.org/wiki/Barycentric_coordinate_system_(mathematics)
    L1=((y2-y3)(x-x3)+(x3-x2)(y-y3))/((y2-y3)(x1-x3)+(x3-x2)(y1-y3))
    L2=((y3-y1)(x-x3)+(x1-x3)(y-y3))/((y3-y1)(x2-x3)+(x1-x3)(y2-y3))
    L3=1-L1-L2
*/
    bool InterpolationParameters(const CoordType & bq, ScalarType &L1,
                                 ScalarType &L2, ScalarType &L3 ) const
    {
        const ScalarType EPSILON = ScalarType(0.0001f);

        ScalarType x1=P(0).X();
        ScalarType x2=P(1).X();
        ScalarType x3=P(2).X();

        ScalarType y1=P(0).Y();
        ScalarType y2=P(1).Y();
        ScalarType y3=P(2).Y();

        ScalarType x=bq.X();
        ScalarType y=bq.Y();

        L1=((y2-y3)*(x-x3)+(x3-x2)*(y-y3))/((y2-y3)*(x1-x3)+(x3-x2)*(y1-y3));
        L2=((y3-y1)*(x-x3)+(x1-x3)*(y-y3))/((y3-y1)*(x2-x3)+(x1-x3)*(y2-y3));
        L3=1-L1-L2;
        if(math::IsNAN(L1) || math::IsNAN(L2) || math::IsNAN(L3)) L1=L2=L3=(ScalarType)(1.0/3.0);
        bool inside=true;
        inside&=(L1>=0-EPSILON)&&(L1<=1+EPSILON);
        inside&=(L2>=0-EPSILON)&&(L2<=1+EPSILON);
        inside&=(L3>=0-EPSILON)&&(L3<=1+EPSILON);
        return inside;
    }

    ///return the distance to the point q and neighors point p
    void PointDistance(const CoordType & q,
                       ScalarType & dist,
                       CoordType & p ) const
    {
        dist=FLT_MAX;
        ///find distance to each segment and take minimum
        for (int i=0;i<3;i++)
        {
            vcg::Segment2<ScalarType> s=vcg::Segment2<ScalarType>(P(i),P((i+1)%3));
            CoordType clos=ClosestPoint<ScalarType>(s,q);
            ScalarType dis_test=(clos-q).Norm();
            if (dis_test<dist)
            {
                dist=dis_test;
                p=clos;
            }
        }
    }

    ///retutn true if the face is contuerclockwise oriented
    bool IsCCW()
    {
        ScalarType Area=(P(1)-P(0))^(P(2)-P(0));
        return (Area>0);
    }

}; //end Class


}	 // end namespace
#endif