/**
 * Searches the edge of the common tangent face
 * @param target vertex
 * @param eye point
 * @param scan direction
 * @return edge of the common tangent face
 */
int ConvexHull::searchEdgeOfCTFace(int iv0, int eye, ScanDir dir) {
    int e = kve[iv0];
    bool or2 = false;
    if (dir == ScanDir::CW) {
        or2 = isFront(leftFace(iv0, e), eye);
    } else {
        or2 = isFront(rightFace(iv0, e), eye);
    }
    while (1) {
        bool or1 = false;
        if (dir == ScanDir::CW) {
            or1 = isFront(rightFace(iv0, e), eye);
        } else {
            or1 = isFront(leftFace(iv0, e), eye);
        }
        // if the edge between 2 adjacent faces is the ridge line for the eye point,
        // that is the edge of the common tangent face
        if (!or1 && or2) {
            break;
        }
        if (dir == ScanDir::CW) {
            e = nextCWEdge(iv0, e);
        } else {
            e = nextCCWEdge(iv0, e);
        }
        or2 = or1;
    }
    return e;
}
Exemple #2
0
    forall_nodes(v, primalGraph)
    {
		edge ePrimal = v->firstAdj()->theEdge();
		edge eDual = m_dualEdge[ePrimal];
		face fDual = rightFace(eDual->adjSource());
		if(ePrimal->source()==v)
			fDual = leftFace(eDual->adjSource());
		m_dualFace[v] = fDual;
		m_primalNode[fDual] = v;
    }
/**
 * Searches and deletes non convex hull primitives
 * @param vertex of the common tangent edge
 * @param common tangent edge
 * @param scan direction
 */
void ConvexHull::deleteNonHullPrims(int iv0, int cte0, ScanDir dir) {
    int e = cte0;
    do {
        e = (dir == ScanDir::CW ? nextCWEdge(iv0, e) : nextCCWEdge(iv0, e));
        
        // deletes all primitives
        if (e == cte0) {
            deleteAllPrimitives(iv0);
            break;
        }
    } while (kep[e] != PrimProperty::BOUNDARY);
    
    // deletes interior primitives
    if (kep[e] == PrimProperty::BOUNDARY) {
        deleteIntPrimitives(dir == ScanDir::CW ? leftFace(iv0, e) : rightFace(iv0, e));
    }
}
/**
 * Searches vertices on the silhouette of the convex hull
 * @param number of vertices
 * @param vertices
 * @return left most vertex on the silhouette of the convex hull
 */
int ConvexHull::searchSilhouette(int nv, int* kv0) {
    int iv0 = 0;
    for (int i = 0; i < nv; i++) {
        iv0 = kv0[i];
        int iv = iv0;
        bool found = false;
        do {
            int e0 = kve[iv];
            int e = e0;
            bool or2 = isFront(rightFace(iv, e));
            found = false;
            do {
                bool or1 = isFront(leftFace(iv, e));
                // if the silhouette edge is found, entries vertex to cyclic list
                if (!or1 && or2) {
                    int nxv = otherVertex(iv, e);
                    kcnxv[iv] = nxv;
                    kccnxv[nxv] = iv;
                    iv = nxv;
                    found = true;
                    break;
                }
                e = nextCCWEdge(iv, e);
                or2 = or1;
            } while (e != e0);
            if (!found) {
                break;
            }
        } while (iv != iv0);
        if (found) {
            break;
        }
        // if silhouette edge is not found, the vertex is not on the silhouette edge
        // then, searches next vertex
    }
    return iv0;
}