void Delaunay::removeBounding( TriangleVector inSet, TriangleVector &outSet, const int &index ) { for (TriangleVector::iterator iter = inSet.begin(); iter != inSet.end(); iter++) { if (iter->m_vertices[0].m_index >= 0 && iter->m_vertices[1].m_index >= 0 && iter->m_vertices[2].m_index >= 0 && iter->isVertex(index) && iter->angleCriterion(m_minAngle, m_maxAngle)) { outSet.push_back(*iter); } } }
bool Delaunay::flipTest( TriangleVector &triSet, Triangle t ) { bool flipped = false; Vertex a = t.m_vertices[0]; Vertex b = t.m_vertices[1]; Vertex c = t.m_vertices[2]; TriangleVector tSet; for (TriangleVector::iterator iter = triSet.begin(); iter != triSet.end();) { Vertex d; d.m_index = -100; // 寻找拥有相同边ab的三角形 int satisfy[3] = {0, 0, 0}; for (int j = 0, k = 1; j < Triangle::Vertex_Size; j++, k *= 2) { if (iter->m_vertices[j].m_index == a.m_index || iter->m_vertices[j].m_index == b.m_index) { satisfy[j] = k; } } switch (satisfy[0] | satisfy[1] | satisfy[2]) { case 3: // v2 if (Vertex::cross(a, c, iter->m_vertices[2]) != 0 && Vertex::cross(b, c, iter->m_vertices[2]) != 0) { d = iter->m_vertices[2]; } break; case 5: // v1 if (Vertex::cross(a, c, iter->m_vertices[1]) != 0 && Vertex::cross(b, c, iter->m_vertices[1]) != 0) { d = iter->m_vertices[1]; } break; case 6: // v0 if (Vertex::cross(a, c, iter->m_vertices[0]) != 0 && Vertex::cross(b, c, iter->m_vertices[0]) != 0) { d = iter->m_vertices[0]; } break; default: break; } if (d.m_index != -100) { if (inCircle(a, b, c, d)) // 判断d是否在三角形abc的外接圆内 { flipped = true; Triangle t0(a, d, c); Triangle t1(d, b, c); tSet.push_back(t0); tSet.push_back(t1); iter = triSet.erase(iter); break; } else { iter++; } } else { iter++; } } for (int i = 0; i < tSet.size(); i++) { if (!flipTest(triSet, tSet[i])) { triSet.push_back(tSet[i]); } } return flipped; }
void Delaunay::insertVertex( TriangleVector &triSet, const Vertex &v ) { TriangleVector tmp; for (TriangleVector::iterator iter = triSet.begin(); iter != triSet.end();) { int r = iter->inTriangle(v); // 判断点是否在三角形内 // cout << iter->m_vertices[0].m_xyz // << iter->m_vertices[1].m_xyz // << iter->m_vertices[2].m_xyz << endl; switch (r) { case 0: // in { Triangle t0(iter->m_vertices[0], iter->m_vertices[1], v); Triangle t1(iter->m_vertices[1], iter->m_vertices[2], v); Triangle t2(iter->m_vertices[2], iter->m_vertices[0], v); tmp.push_back(t0); tmp.push_back(t1); tmp.push_back(t2); iter = triSet.erase(iter); } break; case -1: // on v0v1 { Triangle t0(iter->m_vertices[1], iter->m_vertices[2], v); Triangle t1(iter->m_vertices[2], iter->m_vertices[0], v); tmp.push_back(t0); tmp.push_back(t1); iter = triSet.erase(iter); } break; case -2: // on v1v2 { Triangle t0(iter->m_vertices[0], iter->m_vertices[1], v); Triangle t1(iter->m_vertices[2], iter->m_vertices[0], v); tmp.push_back(t0); tmp.push_back(t1); iter = triSet.erase(iter); } break; case -3: // on v2v0 { Triangle t0(iter->m_vertices[0], iter->m_vertices[1], v); Triangle t1(iter->m_vertices[1], iter->m_vertices[2], v); tmp.push_back(t0); tmp.push_back(t1); iter = triSet.erase(iter); } break; default: iter++; break; } if (r <= 0) { break; } } for (int i = 0; i < tmp.size(); i++) { if (!flipTest(triSet, tmp[i])) // 优化delaunay三角 { triSet.push_back(tmp[i]); } /* drawTrianglesOnPlane(triSet);*/ } }
virtual NxU32 * removeTjunctions(NxU32 vcount, const float *vertices, size_t tcount, const NxU32 *indices, size_t &tcount_out, const NxU32 * ids) { NxU32 *ret = 0; release(); mVcount = vcount; mVertices = vertices; mTcount = (NxU32)tcount; tcount_out = 0; mTcount = (NxU32)tcount; mMaxTcount = (NxU32)tcount*2; mInputTriangles = new Triangle[mMaxTcount]; Triangle *t = mInputTriangles; mEdges = new RtEdge[mMaxTcount*3]; mEdgeCount = 0; NxU32 id = 0; RtEdge *e = mEdges; for (NxU32 i=0; i<tcount; i++) { if ( ids ) id = *ids++; e =init(t,indices,vertices,e,id); indices+=3; t++; } { TriangleVector test; for (EdgeMap::Iterator i = mEdgeMap.getIterator(); !i.done(); ++i) { RtEdge *e = (*i).second; if ( e->mNextEdge == 0 ) // open edge! { Triangle *t = e->mTriangle; if ( !t->mPending ) { test.pushBack(t); t->mPending = true; } } } if ( !test.empty() ) { TriangleVector::Iterator i; for (i=test.begin(); i!=test.end(); ++i) { Triangle *t = (*i); locateIntersection(t); } } } while ( !mSplit.empty() ) { TriangleVector scan = mSplit; mSplit.clear(); TriangleVector::Iterator i; for (i=scan.begin(); i!=scan.end(); ++i) { Triangle *t = (*i); locateIntersection(t); } } mIndices.clear(); mIds.clear(); t = mInputTriangles; for (NxU32 i=0; i<mTcount; i++) { mIndices.pushBack(t->mI1); mIndices.pushBack(t->mI2); mIndices.pushBack(t->mI3); mIds.pushBack(t->mId); t++; } mEdgeMap.clear(); delete []mEdges; mEdges = 0; delete []mInputTriangles; mInputTriangles = 0; tcount_out = mIndices.size()/3; ret = tcount_out ? &mIndices[0] : 0; #ifdef _DEBUG if ( ret ) { const NxU32 *scan = ret; for (NxU32 i=0; i<tcount_out; i++) { NxU32 i1 = scan[0]; NxU32 i2 = scan[1]; NxU32 i3 = scan[2]; assert( i1 != i2 && i1 != i3 && i2 != i3 ); scan+=3; } } #endif return ret; }