Moka kernel
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
plane.icc
Go to the documentation of this file.
1 /*
2  * lib-gmapkernel : Un noyau de 3-G-cartes et des opérations.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-gmapkernel
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 //******************************************************************************
25 INLINE
27  : FNormal(0.0, 0.0, 0.0), FNormalNorm(0.0), FD(0.0)
28 {
29 }
30 //******************************************************************************
31 INLINE
33 {
34  setPlane(Aa, Ab, Ac, Ad);
35 }
36 //******************************************************************************
37 INLINE
38 CPlane::CPlane(const CVertex & APoint1,
39  const CVertex & APoint2,
40  const CVertex & APoint3)
41 {
42  setPlane(APoint1, APoint2, APoint3);
43 }
44 //******************************************************************************
45 INLINE
46 CPlane::CPlane(const CVertex & ANormal, const CVertex & APoint)
47 {
48  setPlane(ANormal, APoint);
49 }
50 //******************************************************************************
51 INLINE
53 {
54 }
55 //******************************************************************************
56 INLINE
58 {
59  FNormal.setXYZ(Aa, Ab, Ac);
60  FNormalNorm = FNormal.norm();
61  FD = Ad;
62 }
63 //******************************************************************************
64 INLINE
65 void CPlane::setPlane(const CVertex & APoint1,
66  const CVertex & APoint2,
67  const CVertex & APoint3)
68 {
69  FNormal = (APoint2 - APoint1) * (APoint3 - APoint1);
70  FNormalNorm = FNormal.norm();
71  FD = - (APoint1.getX() * FNormal.getX() +
72  APoint1.getY() * FNormal.getY() +
73  APoint1.getZ() * FNormal.getZ());
74 }
75 //******************************************************************************
76 INLINE
77 void CPlane::setPlane(const CVertex & ANormal, const CVertex & APoint)
78 {
79  FNormal = ANormal;
80  FNormalNorm = FNormal.norm();
81  FD = - (APoint.getX() * FNormal.getX() +
82  APoint.getY() * FNormal.getY() +
83  APoint.getZ() * FNormal.getZ());
84 }
85 //******************************************************************************
86 INLINE
87 const CVertex & CPlane::getNormal() const
88 {
89  return FNormal;
90 }
91 //******************************************************************************
92 INLINE
94 {
95  return FNormalNorm;
96 }
97 //******************************************************************************
98 INLINE
100 {
101  return FNormal.getX();
102 }
103 //******************************************************************************
104 INLINE
106 {
107  return FNormal.getY();
108 }
109 //******************************************************************************
110 INLINE
112 {
113  return FNormal.getZ();
114 }
115 //******************************************************************************
116 INLINE
118 {
119  return FD;
120 }
121 //******************************************************************************
122 INLINE
124 {
125  FNormal = -FNormal;
126  FD = -FD;
127 }
128 //******************************************************************************
129 INLINE
130 bool CPlane::isPointOnPlane(const CVertex & APoint) const
131 {
132  return isZero(FNormal.getX() * APoint.getX() +
133  FNormal.getY() * APoint.getY() +
134  FNormal.getZ() * APoint.getZ() +
135  FD);
136 }
137 //******************************************************************************
138 INLINE
140 {
141  return (FNormal.getX() * APoint.getX() +
142  FNormal.getY() * APoint.getY() +
143  FNormal.getZ() * APoint.getZ() +
144  FD) / FNormalNorm;
145 }
146 //******************************************************************************
147 INLINE
149  const CVertex & ADirection,
150  TCoordinate * AInterParam) const
151 {
152  TCoordinate d = FNormal.dot(ADirection);
153 
154  if (d != 0.0) {
155  *AInterParam = - (FNormal.dot(APoint) + FD) / d;
156  }
157  else
158  return false;
159 
160  return true;
161 }
162 //******************************************************************************
163 INLINE
165  const CVertex & ADirection,
166  CVertex * AInter) const
167 {
168  TCoordinate d = FNormal.dot(ADirection);
169 
170  if (d != 0.0) {
171  d = - (FNormal.dot(APoint) + FD) / d;
172  *AInter = APoint + ADirection * d;
173  }
174  else
175  return false;
176 
177  return true;
178 }
179 //******************************************************************************
180 INLINE
182 {
183  if (fabs(FNormal.getZ()) > fabs(FNormal.getX())) {
184  if (fabs(FNormal.getZ()) > fabs(FNormal.getY()))
185  return XY_Proj;
186  else
187  return XZ_Proj;
188  }
189  else {
190  if (fabs(FNormal.getX()) > fabs(FNormal.getY()))
191  return YZ_Proj;
192  else
193  return XZ_Proj;
194  }
195 }
196 //******************************************************************************
197 INLINE
198 CVertex CPlane::projectPoint(const CVertex & APoint) const
199 {
200  CVertex pt;
201  if (getLineIntersection(APoint, getNormal(), &pt))
202  return pt;
203  else
204  return APoint;
205 }
206 //******************************************************************************
207 INLINE
208 CVertex CPlane::projectPoint(const CVertex & APoint, TProjection AProj) const
209 {
210  switch (AProj) {
211  case XY_Proj:
212  return CVertex(APoint.getX(), APoint.getY(), 0.0);
213  case YZ_Proj:
214  return CVertex(APoint.getY(), APoint.getZ(), 0.0);
215  case XZ_Proj:
216  return CVertex(APoint.getX(), APoint.getZ(), 0.0);
217  }
218 
219  return APoint;
220 }
221 //******************************************************************************
222 INLINE
223 CVertex CPlane::unprojectPoint(const CVertex & APoint, TProjection AProj) const
224 {
225  switch (AProj) {
226  case XY_Proj:
227  assert(FNormal.getZ() != 0.0);
228  return CVertex(APoint.getX(),
229  APoint.getY(),
230  -(APoint.getX() * FNormal.getX() +
231  APoint.getY() * FNormal.getY() +
232  FD) / FNormal.getZ());
233  case YZ_Proj:
234  assert(FNormal.getX() != 0.0);
235  return CVertex(-(APoint.getX() * FNormal.getY() +
236  APoint.getY() * FNormal.getZ() +
237  FD) / FNormal.getX(),
238  APoint.getX(),
239  APoint.getY());
240  case XZ_Proj:
241  assert(FNormal.getY() != 0.0);
242  return CVertex(APoint.getX(),
243  -(APoint.getX() * FNormal.getX() +
244  APoint.getY() * FNormal.getZ() +
245  FD) / FNormal.getY(),
246  APoint.getY());
247  }
248 
249  return APoint;
250 }
251 //******************************************************************************