Example #1
0
void addVertexOnEdge(Triangulation& trist,
                     FIndex triIJK,
                     FIndex triILJ,
                     shared_ptr<DAGNode> triRJK,
                     shared_ptr<DAGNode> triRKI,
                     shared_ptr<DAGNode> triRIL,
                     shared_ptr<DAGNode> triRLJ) {
	// Add the new triangles
	triRJK->fIndex_ = trist.addLinkedTri(triRJK->tri_);
	triRKI->fIndex_ = trist.addLinkedTri(triRKI->tri_);
	triRIL->fIndex_ = trist.addLinkedTri(triRIL->tri_);
	triRLJ->fIndex_ = trist.addLinkedTri(triRLJ->tri_);

	// Get the edge indicies (at least iIdx)
	int rIdx, iIdx, lIdx;
	triRIL->tri_.get(rIdx, iIdx, lIdx);

	const LinkedTriangle& ltriIJK = trist[triIJK];
	int ijkEdgeIdxIJ, ijkEdgeIdxJK, ijkEdgeIdxKI;
	ltriIJK.getEdgeIndices(iIdx, ijkEdgeIdxIJ, ijkEdgeIdxJK, ijkEdgeIdxKI);

	const LinkedTriangle& ltriILJ = trist[triILJ];
	int iljEdgeIdxIL, iljEdgeIdxLJ, iljEdgeIdxJI;
	ltriILJ.getEdgeIndices(iIdx, iljEdgeIdxIL, iljEdgeIdxLJ, iljEdgeIdxJI);

	// Get reference to adjacent triangles
	FIndex adjIndexKI = ltriIJK.links_[ijkEdgeIdxKI];
	FIndex adjIndexIL = ltriILJ.links_[iljEdgeIdxIL];
	FIndex adjIndexLJ = ltriILJ.links_[iljEdgeIdxLJ];
	FIndex adjIndexJK = ltriIJK.links_[ijkEdgeIdxJK];

	// internal links (4x: RK, RI, RL, RJ)
	trist.setLink(triRJK->fIndex_, 2, triRKI->fIndex_);  // RK
	trist.setLink(triRKI->fIndex_, 2, triRIL->fIndex_);  // RI
	trist.setLink(triRIL->fIndex_, 2, triRLJ->fIndex_);  // RL
	trist.setLink(triRLJ->fIndex_, 2, triRJK->fIndex_);  // RL

	// external links (4x: JK, KI, IL, LJ)
	// PERF: if store what the other edge idx is, could save lookup.
	trist.setLink(triRJK->fIndex_, 1, adjIndexJK);
	trist.setLink(triRKI->fIndex_, 1, adjIndexKI);
	trist.setLink(triRIL->fIndex_, 1, adjIndexIL);
	trist.setLink(triRLJ->fIndex_, 1, adjIndexLJ);

	// remove old triangles
	trist.removeLinkedTri(triIJK);
	trist.removeLinkedTri(triILJ);

#ifdef TRIANGULATION_CHECK
	assert(trist.checkConsistent());
#endif
}
Example #2
0
void addVertexInTri(Triangulation& trist,
                    FIndex triIJK,
                    shared_ptr<DAGNode> triRIJ,
                    shared_ptr<DAGNode> triRJK,
                    shared_ptr<DAGNode> triRKI) {
	// Add the new triangles
	triRIJ->fIndex_ = trist.addLinkedTri(triRIJ->tri_);
	triRJK->fIndex_ = trist.addLinkedTri(triRJK->tri_);
	triRKI->fIndex_ = trist.addLinkedTri(triRKI->tri_);

	// It can be assumed that call to this fn,
	// the given shared_ptr<DAGNode> contain points in order.
	//
	// But, no knowledge about the triangle referenced
	// by triIJK
	int rIdx, iIdx, jIdx;
	triRIJ->tri_.get(rIdx, iIdx, jIdx);

	const LinkedTriangle& ltriIJK = trist[triIJK];
	int edgeIdxIJ, edgeIdxJK, edgeIdxKI;
	ltriIJK.getEdgeIndices(iIdx, edgeIdxIJ, edgeIdxJK, edgeIdxKI);

	// Get reference to adjacent triangles,
	// (might not actually be triangles)
	FIndex adjIndexIJ = ltriIJK.links_[edgeIdxIJ];
	FIndex adjIndexJK = ltriIJK.links_[edgeIdxJK];
	FIndex adjIndexKI = ltriIJK.links_[edgeIdxKI];

	// unlink ... not necessary.

	// internal links (3x: RI, RJ, RK)
	trist.setLink(triRIJ->fIndex_, 2, triRJK->fIndex_); // RJ
	trist.setLink(triRJK->fIndex_, 2, triRKI->fIndex_); // RK
	trist.setLink(triRKI->fIndex_, 2, triRIJ->fIndex_); // RI

	// external links (3x: IJ, JK, KI)
	// PERF: if store what the other edge idx is, could save lookup.
	trist.setLink(triRIJ->fIndex_, 1, adjIndexIJ); // RJ
	trist.setLink(triRJK->fIndex_, 1, adjIndexJK); // RK
	trist.setLink(triRKI->fIndex_, 1, adjIndexKI); // RI

	// remove old triangles
	trist.removeLinkedTri(triIJK);

#ifdef TRIANGULATION_CHECK
	assert(trist.checkConsistent());
#endif
}
Example #3
0
void flipTriangles(Triangulation& trist,
                   FIndex triIJK,
                   FIndex triJIL,
                   shared_ptr<DAGNode> triILK,
                   shared_ptr<DAGNode> triLJK) {
	// Add the new triangles
	triILK->fIndex_ = trist.addLinkedTri(triILK->tri_);
	triLJK->fIndex_ = trist.addLinkedTri(triLJK->tri_);

	// Get the edge indicies (at least iIdx)
	int iIdx, lIdx, kIdx;
	triILK->tri_.get(iIdx, lIdx, kIdx);

	const LinkedTriangle& ltriIJK = trist[triIJK];
	int ijkEdgeIdxIJ, ijkEdgeIdxJK, ijkEdgeIdxKI;
	ltriIJK.getEdgeIndices(iIdx, ijkEdgeIdxIJ, ijkEdgeIdxJK, ijkEdgeIdxKI);

	const LinkedTriangle& ltriJIL = trist[triJIL];
	int jilEdgeIdxJI, jilEdgeIdxIL, jilEdgeIdxLJ;
	ltriJIL.getEdgeIndices(iIdx, jilEdgeIdxIL, jilEdgeIdxLJ, jilEdgeIdxJI);

	// Get reference to adjacent triangles
	FIndex adjIndexKI = ltriIJK.links_[ijkEdgeIdxKI];
	FIndex adjIndexIL = ltriJIL.links_[jilEdgeIdxIL];
	FIndex adjIndexLJ = ltriJIL.links_[jilEdgeIdxLJ];
	FIndex adjIndexJK = ltriIJK.links_[ijkEdgeIdxJK];

	// internal links (1x: KL)
	trist.setLink(triLJK->fIndex_, 2, triILK->fIndex_);

	// external links (4x: JK, KI, IL, LJ)
	// PERF: if store what the other edge idx is, could save lookup.
	trist.setLink(triLJK->fIndex_, 0, adjIndexLJ);  // LJ
	trist.setLink(triLJK->fIndex_, 1, adjIndexJK);  // JK
	trist.setLink(triILK->fIndex_, 0, adjIndexIL);  // IL
	trist.setLink(triILK->fIndex_, 2, adjIndexKI);  // KI

	// remove old triangles
	trist.removeLinkedTri(triIJK);
	trist.removeLinkedTri(triJIL);

#ifdef TRIANGULATION_CHECK
	assert(trist.checkConsistent());
#endif
}