Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "collapseEdge.H"
00027
00028
00029 static void markPointNbrs
00030 (
00031 const triSurface& surf,
00032 const label faceI,
00033 const bool val,
00034 boolList& okToCollapse
00035 )
00036 {
00037 const labelledTri& f = surf.localFaces()[faceI];
00038
00039 forAll(f, fp)
00040 {
00041 const labelList& pFaces = surf.pointFaces()[f[fp]];
00042
00043 forAll(pFaces, i)
00044 {
00045 okToCollapse[pFaces[i]] = false;
00046 }
00047 }
00048 }
00049
00050
00051 static triSurface pack
00052 (
00053 const triSurface& surf,
00054 const pointField& localPoints,
00055 const labelList& pointMap
00056 )
00057 {
00058 List<labelledTri> newTriangles(surf.size());
00059 label newTriangleI = 0;
00060
00061 forAll(surf, faceI)
00062 {
00063 const labelledTri& f = surf.localFaces()[faceI];
00064
00065 label newA = pointMap[f[0]];
00066 label newB = pointMap[f[1]];
00067 label newC = pointMap[f[2]];
00068
00069 if ((newA != newB) && (newA != newC) && (newB != newC))
00070 {
00071 newTriangles[newTriangleI++] =
00072 labelledTri(newA, newB, newC, f.region());
00073 }
00074 }
00075 newTriangles.setSize(newTriangleI);
00076
00077 return triSurface(newTriangles, surf.patches(), localPoints);
00078 }
00079
00080
00081
00082 label collapseEdge(triSurface& surf, const scalar minLen)
00083 {
00084 label nTotalCollapsed = 0;
00085
00086 while (true)
00087 {
00088 const pointField& localPoints = surf.localPoints();
00089 const List<labelledTri>& localFaces = surf.localFaces();
00090
00091
00092
00093 labelList pointMap(surf.nPoints());
00094 forAll(pointMap, i)
00095 {
00096 pointMap[i] = i;
00097 }
00098
00099
00100 pointField newPoints(localPoints);
00101
00102
00103 boolList okToCollapse(surf.size(), true);
00104 label nCollapsed = 0;
00105
00106 forAll(localFaces, faceI)
00107 {
00108 if (okToCollapse[faceI])
00109 {
00110
00111 const labelledTri& f = localFaces[faceI];
00112
00113 forAll(f, fp)
00114 {
00115 label v = f[fp];
00116 label v1 = f[(fp+1) % 3];
00117
00118 if (mag(localPoints[v1] - localPoints[v]) < minLen)
00119 {
00120
00121 pointMap[v1] = v;
00122 newPoints[v] = 0.5*(localPoints[v1] + localPoints[v]);
00123
00124 Pout<< "Collapsing triange " << faceI << " to edge mid "
00125 << newPoints[v] << endl;
00126
00127 nCollapsed++;
00128 okToCollapse[faceI] = false;
00129
00130
00131 markPointNbrs(surf, faceI, false, okToCollapse);
00132
00133 break;
00134 }
00135 }
00136 }
00137 }
00138
00139 Pout<< "collapseEdge : collapsing " << nCollapsed << " triangles"
00140 << endl;
00141
00142 nTotalCollapsed += nCollapsed;
00143
00144 if (nCollapsed == 0)
00145 {
00146 break;
00147 }
00148
00149
00150 surf = pack(surf, newPoints, pointMap);
00151 }
00152
00153
00154 surf = triSurface(surf.localFaces(), surf.patches(), surf.localPoints());
00155
00156 return nTotalCollapsed;
00157 }
00158
00159
00160