Loading [MathJax]/extensions/tex2jax.js
ug4
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
element_aspect_ratios.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2018: G-CSC, Goethe University Frankfurt
3 * Author: Martin Stepniewski
4 *
5 * This file is part of UG4.
6 *
7 * UG4 is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License version 3 (as published by the
9 * Free Software Foundation) with the following additional attribution
10 * requirements (according to LGPL/GPL v3 §7):
11 *
12 * (1) The following notice must be displayed in the Appropriate Legal Notices
13 * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 *
15 * (2) The following notice must be displayed at a prominent place in the
16 * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 *
18 * (3) The following bibliography is recommended for citation and must be
19 * preserved in all covered files:
20 * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 * parallel geometric multigrid solver on hierarchically distributed grids.
22 * Computing and visualization in science 16, 4 (2013), 151-164"
23 * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 * flexible software system for simulating pde based models on high performance
25 * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 *
27 * This program is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU Lesser General Public License for more details.
31 */
32
33#ifndef __H__UG_ELEMENT_ASPECT_RATIOS
34#define __H__UG_ELEMENT_ASPECT_RATIOS
35
36#ifdef UG_PARALLEL
38#endif
39
41
42/* system includes */
43#include <stddef.h>
44#include <cmath>
45#include <stdlib.h>
46#include <stdio.h>
47#include <string.h>
48#include <fstream>
49#include <vector>
50#include <string>
51#include <algorithm>
52
53#include "lib_grid/lib_grid.h"
54
55
56using namespace std;
57
58
59namespace ug {
60
61
63// CalculateMinTriangleHeight
65
66template <class TAAPosVRT>
67number CalculateMinTriangleHeight(Face* face, TAAPosVRT& aaPos)
68{
69 //PROFILE_FUNC();
70 if(face->num_vertices() == 3)
71 {
72 // Get type of vertex attachment in aaPos and define it as ValueType
73 typedef typename TAAPosVRT::ValueType ValueType;
74
75 number minHeight, tmpMinHeight;
76 ValueType v = aaPos[face->vertex(2)];
77 ValueType dir;
78
79 // Calculate start height and set to minHeight
80 VecSubtract(dir, aaPos[face->vertex(1)], aaPos[face->vertex(0)]);
81 minHeight = DistancePointToRay( v, aaPos[face->vertex(0)], dir);
82
83 for(uint i = 1; i < 3; ++i)
84 {
85 v = aaPos[face->vertex((i+2)%3)];
86 VecSubtract(dir, aaPos[face->vertex((i+1)%3)], aaPos[face->vertex((i))]);
87 tmpMinHeight = DistancePointToRay(v, aaPos[face->vertex(i )], dir);
88
89 if(tmpMinHeight < minHeight)
90 {
91 minHeight = tmpMinHeight;
92 }
93 }
94
95 return minHeight;
96 }
97 else
98 UG_ASSERT(false, "Error. Face is not a triangle.");
99
100 return NAN;
101}
102
103
105// CalculateAspectRatio
107
109template <class TElem, class TAAPosVRT>
110number CalculateAspectRatio(Grid& grid, TElem* elem, TAAPosVRT& aaPos);
111
113template <class TAAPosVRT>
114number CalculateAspectRatio(Grid& grid, Quadrilateral* quad, TAAPosVRT& aaPos) {
116 Vertex* const* vrts = quad->vertices();
117 box_t box(aaPos[vrts[0]], aaPos[vrts[0]]);
118 for (size_t i = 1; i < quad->num_vertices(); ++i){
119 box = box_t(box, aaPos[vrts[i]]);
120 }
121 const number xDist = box.max.x() - box.min.x();
122 const number yDist = box.max.y() - box.min.y();
123 return xDist > yDist ? xDist/yDist : yDist/xDist;
124}
125
127template <class TAAPosVRT>
128number CalculateAspectRatio(Grid& grid, Triangle* tri, TAAPosVRT& aaPos)
129{
130 number maxEdgeLength;
131
132 // Collect element edges, find longest edge and calculate its length
133 vector<Edge*> edges;
134 CollectAssociated(edges, grid, tri);
135 Edge* longestEdge = FindLongestEdge(edges.begin(), edges.end(), aaPos);
136 maxEdgeLength = EdgeLength(longestEdge, aaPos);
137
138 /*
139 * optimal aspect ratio of a regular tetrahedron with edge lengths a:
140 * Q = hmin/lmax = sqrt(3)/2*a / a = 0.866...
141 *
142 * Info: return value is normalized by factor 2/sqrt(3)
143 * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002)
144 */
145
146 // Calculate minimal triangle height
147 number minTriangleHeight = CalculateMinTriangleHeight(tri, aaPos);
148
149 // Calculate the aspect ratio
150 return 2/std::sqrt(3.0) * minTriangleHeight / maxEdgeLength;
151}
152
154template <class TAAPosVRT>
155number CalculateAspectRatio(Grid& grid, Face* face, TAAPosVRT& aaPos)
156{
157 switch (face->reference_object_id())
158 {
159 case ROID_TRIANGLE:
160 {
161 return CalculateAspectRatio(grid, static_cast<Triangle*>(face), aaPos);
162 }
163
165 {
166 return CalculateAspectRatio(grid, static_cast<Quadrilateral*>(face), aaPos);
167 }
168
169 default:
170 {
171 UG_THROW("Note: Currently only faces of type triangle and quadrilateral"
172 " supported in aspect ratio calculation.");
173 break;
174 }
175 }
176 return NAN;
177}
178
180template <class TAAPosVRT>
181number CalculateAspectRatio(Grid& grid, Tetrahedron* tet, TAAPosVRT& aaPos)
182{
183 /*
184 * optimal Aspect Ratio of a regular tetrahedron with edge lengths a:
185 * Q = hmin/lmax = sqrt(2/3)*a / a = 0.8164...
186 *
187 * Info: return value is normalized by factor sqrt(3/2)
188 * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002)
189 */
190 return CalculateTetrahedronAspectRatio(grid, tet, aaPos);
191}
192
194template <class TAAPosVRT>
195number CalculateAspectRatio(Grid& grid, Hexahedron* hex, TAAPosVRT& aaPos)
196{
197 return CalculateHexahedronAspectRatio(grid, hex, aaPos);
198}
199
201template <class TAAPosVRT>
202number CalculateAspectRatio(Grid& grid, Pyramid* pyr, TAAPosVRT& aaPos) {
203 return CalculatePyramidAspectRatio(grid, pyr, aaPos);
204}
205
207template <class TAAPosVRT>
208number CalculateAspectRatio(Grid& grid, Volume* vol, TAAPosVRT& aaPos)
209{
210 switch (vol->reference_object_id())
211 {
212 case ROID_TETRAHEDRON:
213 {
214 return CalculateAspectRatio(grid, static_cast<Tetrahedron*>(vol), aaPos);
215 }
216
217 case ROID_HEXAHEDRON:
218 {
219 return CalculateAspectRatio(grid, static_cast<Hexahedron*>(vol), aaPos);
220 }
221
222 case ROID_PYRAMID:
223 {
224 return CalculateAspectRatio(grid, static_cast<Pyramid*>(vol), aaPos);
225 }
226
227 default:
228 {
229 UG_THROW("Note: Currently only volumes of type tetrahedron, hexahedron"
230 "and pyramids supported in aspect ratio calculation.");
231 break;
232 }
233 }
234
235 return NAN;
236}
237
238
240// CalculateVolToRMSFaceAreaRatio
242
244template <class TElem, class TAAPosVRT>
245number CalculateVolToRMSFaceAreaRatio(Grid& grid, TElem* elem, TAAPosVRT& aaPos);
246
248template <class TAAPosVRT>
249number CalculateVolToRMSFaceAreaRatio(Grid& grid, Face* face, TAAPosVRT& aaPos)
250{
251 UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron"
252 " supported in volume to root-mean-square face area ratio calculation.");
253 return NAN;
254}
255
257template <class TAAPosVRT>
259{
260 //PROFILE_FUNC();
261 number ratio;
262
263 /*
264 * optimal volume to root-mean-square face area ratio of a
265 * regular tetrahedron with edge lengths a:
266 * Q = V/A_rms^(3/2)
267 *
268 * Info: return value is normalized by factor pow(3, 7/4.0) / 2.0 / sqrt(2);
269 * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002)
270 */
271
272 // Calculate the ratio
273 ratio = CalculateTetrahedronVolToRMSFaceAreaRatio(grid, tet, aaPos);
274
275 return ratio;
276}
277
279template <class TAAPosVRT>
281{
282 //PROFILE_FUNC();
283 number ratio;
284
285 // Calculate the ratio
286 ratio = CalculateHexahedronVolToRMSFaceAreaRatio(grid, hex, aaPos);
287
288 return ratio;
289}
290
292template <class TAAPosVRT>
293number CalculateVolToRMSFaceAreaRatio(Grid& grid, Volume* vol, TAAPosVRT& aaPos)
294{
295 switch (vol->reference_object_id())
296 {
297 case ROID_TETRAHEDRON:
298 {
299 return CalculateVolToRMSFaceAreaRatio(grid, static_cast<Tetrahedron*>(vol), aaPos);
300 }
301
302 case ROID_HEXAHEDRON:
303 {
304 return CalculateVolToRMSFaceAreaRatio(grid, static_cast<Hexahedron*>(vol), aaPos);
305 }
306
307 default:
308 {
309 UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron"
310 " supported in volume to root-mean-square face area ratio calculation.");
311 break;
312 }
313 }
314
315 return NAN;
316}
317
318
320// FindLargestFace
321template <class TIterator, class TAAPosVRT>
322Face* FindLargestFace(TIterator facesBegin, TIterator facesEnd, TAAPosVRT& aaPos)
323{
324 //PROFILE_FUNC();
325 // if facesBegin equals facesEnd, then the list is empty and we can
326 // immediately return NULL
327 if(facesBegin == facesEnd)
328 return NULL;
329
330 // the first face is the first candidate for the smallest face.
331 Face* largestFace = *facesBegin;
332 number largestArea = FaceArea(largestFace, aaPos);
333 ++facesBegin;
334
335 for(; facesBegin != facesEnd; ++facesBegin){
336 Face* curFace = *facesBegin;
337 number curArea = FaceArea(curFace, aaPos);
338 if(curArea > largestArea){
339 largestFace = curFace;
340 largestArea = curArea;
341 }
342 }
343
344 return largestFace;
345}
346
347
349// FindSmallestVolumeElement
350template <class TIterator, class TAAPosVRT>
351typename TIterator::value_type
352FindSmallestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT& aaPos)
353{
354 //PROFILE_FUNC();
355// if volumesBegin equals volumesBegin, then the list is empty and we can
356// immediately return NULL
357 if(volumesBegin == volumesEnd)
358 return NULL;
359
360// Initializations
361 typename TIterator::value_type smallestVolume = *volumesBegin;
362 number smallestVolumeVolume = CalculateVolume(smallestVolume, aaPos);
363 ++volumesBegin;
364
365// compare all tetrahedrons and find minimal volume
366 for(; volumesBegin != volumesEnd; ++volumesBegin)
367 {
368 Volume* curVolume = *volumesBegin;
369 number curVolumeVolume = CalculateVolume(curVolume, aaPos);
370
371 if(curVolumeVolume < smallestVolumeVolume)
372 {
373 smallestVolume = curVolume;
374 smallestVolumeVolume = curVolumeVolume;
375 }
376 }
377
378 return smallestVolume;
379}
380
381
383// FindLargestVolumeElement
384template <class TIterator, class TAAPosVRT>
385typename TIterator::value_type
386FindLargestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT& aaPos)
387{
388 //PROFILE_FUNC();
389// if volumesBegin equals volumesBegin, then the list is empty and we can
390// immediately return NULL
391 if(volumesBegin == volumesEnd)
392 return NULL;
393
394// Initializations
395 typename TIterator::value_type largestVolume = *volumesBegin;
396 number largestVolumeVolume = CalculateVolume(largestVolume, aaPos);
397 ++volumesBegin;
398
399// compare all tetrahedrons and find minimal volume
400 for(; volumesBegin != volumesEnd; ++volumesBegin)
401 {
402 Volume* curVolume = *volumesBegin;
403 number curVolumeVolume = CalculateVolume(curVolume, aaPos);
404
405 if(curVolumeVolume > largestVolumeVolume)
406 {
407 largestVolume = curVolume;
408 largestVolumeVolume = curVolumeVolume;
409 }
410 }
411
412 return largestVolume;
413}
414
415
417// FindElementWithSmallestAspectRatio
418template <class TIterator, class TAAPosVRT>
419typename TIterator::value_type
420FindElementWithSmallestAspectRatio(Grid& grid, TIterator elemsBegin,
421 TIterator elemsEnd, TAAPosVRT& aaPos)
422{
423 //PROFILE_FUNC();
424// if volumesBegin equals volumesBegin, then the list is empty and we can
425// immediately return NULL
426 if(elemsBegin == elemsEnd)
427 return NULL;
428
429// Initializations
430 typename TIterator::value_type elementWithSmallestAspectRatio = *elemsBegin;
431 number smallestAspectRatio = CalculateAspectRatio(grid, elementWithSmallestAspectRatio, aaPos);
432 ++elemsBegin;
433
434// compare all tetrahedrons and find that one with minimal aspect ratio
435 for(; elemsBegin != elemsEnd; ++elemsBegin)
436 {
437 typename TIterator::value_type curElement = *elemsBegin;
438 //TElem* curElement = *elemsBegin;
439 number curSmallestAspectRatio = CalculateAspectRatio(grid, curElement, aaPos);
440
441 if(curSmallestAspectRatio < smallestAspectRatio)
442 {
443 elementWithSmallestAspectRatio = curElement;
444 smallestAspectRatio = curSmallestAspectRatio;
445 }
446 }
447
448 return elementWithSmallestAspectRatio;
449}
450
451
453// FindElementWithLargestAspectRatio
454template <class TIterator, class TAAPosVRT>
455typename TIterator::value_type
456FindElementWithLargestAspectRatio(Grid& grid, TIterator elemsBegin,
457 TIterator elemsEnd, TAAPosVRT& aaPos)
458{
459 //PROFILE_FUNC();
460// if volumesBegin equals volumesBegin, then the list is empty and we can
461// immediately return NULL
462 if(elemsBegin == elemsEnd)
463 return NULL;
464
465// Initializations
466 typename TIterator::value_type elementWithLargestAspectRatio = *elemsBegin;
467 number largestAspectRatio = CalculateAspectRatio(grid, elementWithLargestAspectRatio, aaPos);
468 ++elemsBegin;
469
470// compare all tetrahedrons and find that one with maximal aspect ratio
471 for(; elemsBegin != elemsEnd; ++elemsBegin)
472 {
473 typename TIterator::value_type curElement = *elemsBegin;
474 //TElem* curElement = *elemsBegin;
475 number curSmallestAspectRatio = CalculateAspectRatio(grid, curElement, aaPos);
476
477 if(curSmallestAspectRatio > largestAspectRatio)
478 {
479 elementWithLargestAspectRatio = curElement;
480 largestAspectRatio = curSmallestAspectRatio;
481 }
482 }
483
484 return elementWithLargestAspectRatio;
485}
486
487
489// FindElementWithSmallestVolToRMSFaceAreaRatio
490template <class TIterator, class TAAPosVRT>
491typename TIterator::value_type
493 TIterator elemsEnd, TAAPosVRT& aaPos)
494{
495 //PROFILE_FUNC();
496// if volumesBegin equals volumesBegin, then the list is empty and we can
497// immediately return NULL
498 if(elemsBegin == elemsEnd)
499 return NULL;
500
501// Initializations
502 typename TIterator::value_type elementWithSmallestRatio = *elemsBegin;
503 number smallestRatio = CalculateVolToRMSFaceAreaRatio(grid, elementWithSmallestRatio, aaPos);
504 ++elemsBegin;
505
506// compare all tetrahedrons and find that one with minimal aspect ratio
507 for(; elemsBegin != elemsEnd; ++elemsBegin)
508 {
509 typename TIterator::value_type curElement = *elemsBegin;
510 //TElem* curElement = *elemsBegin;
511 number curSmallestRatio = CalculateVolToRMSFaceAreaRatio(grid, curElement, aaPos);
512
513 if(curSmallestRatio < smallestRatio)
514 {
515 elementWithSmallestRatio = curElement;
516 smallestRatio = curSmallestRatio;
517 }
518 }
519
520 return elementWithSmallestRatio;
521}
522
523
525// FindElementWithLargestVolToRMSFaceAreaRatio
526template <class TIterator, class TAAPosVRT>
527typename TIterator::value_type
529 TIterator elemsEnd, TAAPosVRT& aaPos)
530{
531 //PROFILE_FUNC();
532// if volumesBegin equals volumesBegin, then the list is empty and we can
533// immediately return NULL
534 if(elemsBegin == elemsEnd)
535 return NULL;
536
537// Initializations
538 typename TIterator::value_type elementWithLargestRatio = *elemsBegin;
539 number largestRatio = CalculateVolToRMSFaceAreaRatio(grid, elementWithLargestRatio, aaPos);
540 ++elemsBegin;
541
542// compare all tetrahedrons and find that one with maximal aspect ratio
543 for(; elemsBegin != elemsEnd; ++elemsBegin)
544 {
545 typename TIterator::value_type curElement = *elemsBegin;
546 //TElem* curElement = *elemsBegin;
547 number curSmallestRatio = CalculateVolToRMSFaceAreaRatio(grid, curElement, aaPos);
548
549 if(curSmallestRatio > largestRatio)
550 {
551 elementWithLargestRatio = curElement;
552 largestRatio = curSmallestRatio;
553 }
554 }
555
556 return elementWithLargestRatio;
557}
558}
559#endif
virtual Face::ConstVertexArray vertices() const
Definition grid_objects_2d.h:266
virtual size_t num_vertices() const
Definition grid_objects_2d.h:267
Base-class for edges.
Definition grid_base_objects.h:397
Faces are 2-dimensional objects.
Definition grid_base_objects.h:510
virtual ReferenceObjectID reference_object_id() const
Definition grid_base_objects.h:550
virtual size_t num_vertices() const
Definition grid_base_objects.h:488
virtual Vertex * vertex(size_t index) const
Definition grid_base_objects.h:486
Manages the elements of a grid and their interconnection.
Definition grid.h:132
A volume element with 6 quadrilateral sides.
Definition grid_objects_3d.h:227
A volume element with 4 triangle and 1 quadrilateral sides.
Definition grid_objects_3d.h:493
a face with four points.
Definition grid_objects_2d.h:323
the most simple volume-element.
Definition grid_objects_3d.h:91
the most simple form of a face
Definition grid_objects_2d.h:174
Base-class for all vertex-types.
Definition grid_base_objects.h:231
Volumes are 3-dimensional objects.
Definition grid_base_objects.h:754
virtual ReferenceObjectID reference_object_id() const
Definition grid_base_objects.h:927
static number FaceArea(TDomain &dom, ISubsetHandler &sh, int si, size_t lvl)
Definition domain_bridge.cpp:262
UG_API number EdgeLength(const EdgeVertices *e, TAAPosVRT &aaPos)
Calculates the length of the given edge.
Definition edge_util_impl.hpp:80
UG_API void CollectAssociated(std::vector< Vertex * > &vVertexOut, Grid &grid, GridObject *obj, bool clearContainer=true)
Definition grid_util_impl.hpp:169
number CalculateVolume(Volume *elem, TAAPos aaPos)
Calculates the volume of the given element.
Definition volume_calculation_impl.hpp:43
UG_API number CalculateHexahedronVolToRMSFaceAreaRatio(Grid &grid, Hexahedron *hex, Grid::VertexAttachmentAccessor< APosition > &aaPos)
Definition volume_util.cpp:313
UG_API number CalculateTetrahedronVolToRMSFaceAreaRatio(Grid &grid, Tetrahedron *tet, Grid::VertexAttachmentAccessor< APosition > &aaPos)
Definition volume_util.cpp:285
number CalculatePyramidAspectRatio(Grid &grid, Pyramid *pyr, Grid::VertexAttachmentAccessor< AVector3 > &aaPos)
calculates the aspect ratio of a pyramidal element Pyramid aspect ratio (AR) is the ratio of the heig...
Definition volume_util.cpp:228
number CalculateHexahedronAspectRatio(Grid &grid, Hexahedron *hex, Grid::VertexAttachmentAccessor< AVector3 > &aaPos)
calculates the aspect ratio of a hexahedral element
Definition volume_util.cpp:171
number CalculateTetrahedronAspectRatio(Grid &grid, Tetrahedron *tet, Grid::VertexAttachmentAccessor< AVector3 > &aaPos)
calculates the aspect ratio of a tetrahedral element
Definition volume_util.cpp:138
#define UG_ASSERT(expr, msg)
Definition assert.h:70
#define UG_THROW(msg)
Definition error.h:57
unsigned int uint
Definition types.h:114
double number
Definition types.h:124
number DistancePointToRay(const vector_t &v, const vector_t &from, const vector_t &dir)
calculates the distance of a point to a ray
Definition math_util_impl.hpp:225
void VecSubtract(vector_t &vOut, const vector_t &v1, const vector_t &v2)
subtracts v2 from v1 and stores the result in a vOut
Definition math_vector_functions_common_impl.hpp:226
Definition smart_pointer.h:814
the ug namespace
TIterator::value_type FindElementWithLargestVolToRMSFaceAreaRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:528
TIterator::value_type FindElementWithSmallestVolToRMSFaceAreaRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:492
@ ROID_TETRAHEDRON
Definition grid_base_objects.h:80
@ ROID_QUADRILATERAL
Definition grid_base_objects.h:79
@ ROID_PYRAMID
Definition grid_base_objects.h:83
@ ROID_HEXAHEDRON
Definition grid_base_objects.h:81
@ ROID_TRIANGLE
Definition grid_base_objects.h:78
TIterator::value_type FindLargestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:386
number CalculateVolToRMSFaceAreaRatio(Grid &grid, TElem *elem, TAAPosVRT &aaPos)
An unimplemented version, so that a compile error occurs if no overload exists.
Face * FindLargestFace(TIterator facesBegin, TIterator facesEnd, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:322
TIterator::value_type FindElementWithSmallestAspectRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:420
TIterator::value_type FindSmallestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:352
TIterator::value_type FindElementWithLargestAspectRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:456
number CalculateAspectRatio(Grid &grid, TElem *elem, TAAPosVRT &aaPos)
An unimplemented version, so that a compile error occurs if no overload exists.
Edge * FindLongestEdge(TEdgeIterator edgesBegin, TEdgeIterator edgesEnd, TAAPosVRT &aaPos)
Definition edge_util_impl.hpp:332
number CalculateMinTriangleHeight(Face *face, TAAPosVRT &aaPos)
Definition element_aspect_ratios.h:67
Definition shapes.h:60