Пример #1
0
void CIntersection::ApplyConvexIntersection(CSkeleton &skeleton, CVertexList &vl, IntersectionQueue &iq)
{
#ifdef FELKELDEBUG
	VTLOG("ApplyConvexIntersection\n");
#endif
	// create new vertex and link into current contour
	CVertex vtx (m_poi, *m_leftVertex, *m_rightVertex);
#if VTDEBUG
	if(!(vtx.m_point != C3DPoint(CN_INFINITY, CN_INFINITY, CN_INFINITY)))
		VTLOG("%s %d Assert failed\n", __FILE__, __LINE__);
#endif

	// Link vertex into overall chain
	CVertex *newNext = m_rightVertex->m_nextVertex;
	CVertex *newPrev = m_leftVertex->m_prevVertex;

	vtx.m_prevVertex = newPrev;
	vtx.m_nextVertex = newNext;

	vl.push_back (vtx);

	CVertex *vtxPointer = &vl.back();

	newPrev->m_nextVertex = vtxPointer;
	newNext->m_prevVertex = vtxPointer;

	// Set this vertex as the higher skeleton point for the vertices which have been
	// removed from the active contour
	m_leftVertex->m_higher = vtxPointer;
	m_rightVertex->m_higher = vtxPointer;

	// mark vertices as inactive
	m_leftVertex->m_done = true;
	m_rightVertex->m_done = true;

	CIntersection newI(vl, *vtxPointer);

	if (newI.m_height != CN_INFINITY)
		iq.push(newI);

	skeleton.push_back(CSkeletonLine(*m_leftVertex, *vtxPointer));

	CSkeletonLine *lLinePtr = &skeleton.back();

	skeleton.push_back(CSkeletonLine (*m_rightVertex, *vtxPointer));

	CSkeletonLine *rLinePtr = &skeleton.back();

	lLinePtr->m_lower.m_right = m_leftVertex->m_leftSkeletonLine;
	lLinePtr->m_lower.m_left = m_leftVertex->m_rightSkeletonLine;
	lLinePtr->m_higher.m_right = rLinePtr;
	rLinePtr->m_lower.m_right = m_rightVertex->m_leftSkeletonLine;
	rLinePtr->m_lower.m_left = m_rightVertex->m_rightSkeletonLine;
	rLinePtr->m_higher.m_left = lLinePtr;

	if (m_leftVertex->m_leftSkeletonLine)
		m_leftVertex->m_leftSkeletonLine->m_higher.m_left = lLinePtr;
	if (m_leftVertex->m_rightSkeletonLine)
		m_leftVertex->m_rightSkeletonLine->m_higher.m_right = lLinePtr;

	if (m_rightVertex->m_leftSkeletonLine)
		m_rightVertex->m_leftSkeletonLine->m_higher.m_left = rLinePtr;
	if (m_rightVertex->m_rightSkeletonLine)
		m_rightVertex->m_rightSkeletonLine->m_higher.m_right = rLinePtr;

	vtxPointer->m_leftSkeletonLine = lLinePtr;
	vtxPointer->m_rightSkeletonLine = rLinePtr;

	m_leftVertex->m_advancingSkeletonLine = lLinePtr;
	m_rightVertex->m_advancingSkeletonLine = rLinePtr;
}
Пример #2
0
void CIntersection::ApplyLast3(CSkeleton &skeleton, CVertexList &vl)
{
#ifdef FELKELDEBUG
	VTLOG("ApplyLast3\n");
#endif

	CVertex &v1 = *m_leftVertex;
	CVertex &v2 = *m_rightVertex;
	CVertex &v3 = *m_leftVertex->m_prevVertex;

	v1.m_done = true;
	v2.m_done = true;
	v3.m_done = true;


	C3DPoint is = m_poi;

	CVertex v(is);

	v.m_done = true;
	vl.push_back(v);
	CVertex *vtxPointer = &vl.back();

	skeleton.push_back (CSkeletonLine(v1, *vtxPointer));

	CSkeletonLine *line1Ptr = &skeleton.back();

	skeleton.push_back (CSkeletonLine(v2, *vtxPointer));

	CSkeletonLine *line2Ptr = &skeleton.back();

	skeleton.push_back (CSkeletonLine(v3, *vtxPointer));

	CSkeletonLine *line3Ptr = &skeleton.back ();

	line1Ptr->m_higher.m_right = line2Ptr;	// zapojeni okridlenych hran
	line2Ptr->m_higher.m_right = line3Ptr;
	line3Ptr->m_higher.m_right = line1Ptr;

	line1Ptr->m_higher.m_left = line3Ptr;
	line2Ptr ->m_higher.m_left = line1Ptr;
	line3Ptr->m_higher.m_left = line2Ptr;

	line1Ptr->m_lower.m_left = v1.m_rightSkeletonLine;
	line1Ptr->m_lower.m_right = v1.m_leftSkeletonLine;

	line2Ptr->m_lower.m_left = v2.m_rightSkeletonLine;
	line2Ptr->m_lower.m_right = v2.m_leftSkeletonLine;

	line3Ptr->m_lower.m_left = v3.m_rightSkeletonLine;
	line3Ptr->m_lower.m_right = v3.m_leftSkeletonLine;

	if (v1.m_leftSkeletonLine)
		v1.m_leftSkeletonLine->m_higher.m_left = line1Ptr;
	if (v1.m_rightSkeletonLine)
		v1.m_rightSkeletonLine->m_higher.m_right = line1Ptr;

	if (v2.m_leftSkeletonLine)
		v2.m_leftSkeletonLine->m_higher.m_left = line2Ptr;
	if (v2.m_rightSkeletonLine)
		v2.m_rightSkeletonLine->m_higher.m_right = line2Ptr;

	if (v3.m_leftSkeletonLine)
		v3.m_leftSkeletonLine->m_higher.m_left = line3Ptr;
	if (v3.m_rightSkeletonLine)
		v3.m_rightSkeletonLine->m_higher.m_right = line3Ptr;

	v1.m_advancingSkeletonLine = line1Ptr;
	v2.m_advancingSkeletonLine = line2Ptr;
	v3.m_advancingSkeletonLine = line3Ptr;
}
Пример #3
0
void CIntersection::ApplyNonconvexIntersection(CSkeleton &skeleton, CVertexList &vl, IntersectionQueue &iq, bool bCheckVertexinCurrentContour)
{
#ifdef FELKELDEBUG
	VTLOG("ApplyNonconvexIntersection\n");
#endif

#if VTDEBUG
	// Left and right vertices must always be the same point
	if (!(m_leftVertex == m_rightVertex))
		VTLOG("%s %d Assert failed\n", __FILE__, __LINE__);
	// Check to see of they are the same data structure RFJ !!!
	if (!(m_leftVertex->m_ID == m_rightVertex->m_ID))
		VTLOG("%s %d Assert failed\n", __FILE__, __LINE__);
#endif

	CVertex *leftPointer, *rightPointer;
	C3DPoint p;
	CNumber d3 = CN_INFINITY;

	d3 = m_leftVertex->NearestIntersection(vl, &leftPointer, &rightPointer, p);
	if (d3 == CN_INFINITY)
		return;

	if (p != m_poi)
		return;

	if (!m_leftVertex->VertexInCurrentContour(*leftPointer))
	{
		if (bCheckVertexinCurrentContour) // Temporary hack to disable checking in multiple contour buildings !!!! NEEDS FIXING
			return;
		else
			VTLOG("Vertex in current contour check failed - needs to be fixed - this check is not valid if one (or both?) of the contours is clockwise\n");
	}
// Left and right vertex are actually the same in this case
	if (!m_rightVertex->VertexInCurrentContour(*rightPointer))
	{
		if (bCheckVertexinCurrentContour) // Temporary hack to disable checking in multiple contour buildings !!!! NEEDS FIXING
			return;
		else
			VTLOG("Vertex in current contour check failed - needs to be fixed - this check is not valid if one (or both?) of the contours is clockwise\n");
	}

#ifdef FELKELDEBUG
	VTLOG("left vertex %d left ptr %d right ptr %d right vertex %d\n",
		m_leftVertex->m_ID,
		leftPointer->m_ID,
		rightPointer->m_ID,
		m_rightVertex->m_ID);
#endif

	// Treat as a split event
	CVertex v1 (p, *rightPointer, *m_rightVertex);
	CVertex v2 (p, *m_leftVertex, *leftPointer);

#if VTDEBUG
	if (!(v1.m_point != C3DPoint(CN_INFINITY, CN_INFINITY, CN_INFINITY)))
		VTLOG("%s %d Assert failed\n", __FILE__, __LINE__);
	if (!(v2.m_point != C3DPoint(CN_INFINITY, CN_INFINITY, CN_INFINITY)))
		VTLOG("%s %d Assert failed\n", __FILE__, __LINE__);
#endif

	m_leftVertex->m_done = true;
	//  i.rightVertex -> done = true;

	CVertex *newNext1 = m_rightVertex->m_nextVertex;
	CVertex *newPrev1 = leftPointer->Highest();
	v1.m_prevVertex = newPrev1;
	v1.m_nextVertex = newNext1;
	vl.push_back(v1);

	CVertex *v1Pointer = &vl.back();

	newPrev1->m_nextVertex = v1Pointer;
	newNext1->m_prevVertex = v1Pointer;
	m_rightVertex->m_higher = v1Pointer;

	CVertex *newNext2 = rightPointer->Highest();
	CVertex *newPrev2 = m_leftVertex->m_prevVertex;
	v2.m_prevVertex = newPrev2;
	v2.m_nextVertex = newNext2;
	vl.push_back(v2);

	CVertex *v2Pointer = &vl.back();

	newPrev2->m_nextVertex = v2Pointer;
	newNext2->m_prevVertex = v2Pointer;
	m_leftVertex->m_higher = v2Pointer;

	skeleton.push_back(CSkeletonLine(*m_rightVertex, *v1Pointer));

	CSkeletonLine *linePtr = &skeleton.back();

	skeleton.push_back(CSkeletonLine(*v1Pointer, *v2Pointer));

	CSkeletonLine *auxLine1Ptr = &skeleton.back ();

	skeleton.push_back(CSkeletonLine(*v2Pointer, *v1Pointer));

	CSkeletonLine *auxLine2Ptr = &skeleton.back();

	linePtr->m_lower.m_right = m_leftVertex->m_leftSkeletonLine;
	linePtr->m_lower.m_left = m_leftVertex->m_rightSkeletonLine;

	v1Pointer->m_rightSkeletonLine = v2Pointer->m_leftSkeletonLine = linePtr;
	v1Pointer->m_leftSkeletonLine = auxLine1Ptr;
	v2Pointer->m_rightSkeletonLine = auxLine2Ptr;

	auxLine1Ptr->m_lower.m_right = auxLine2Ptr;
	auxLine2Ptr->m_lower.m_left = auxLine1Ptr;

	if (m_leftVertex->m_leftSkeletonLine)
		m_leftVertex->m_leftSkeletonLine ->m_higher.m_left = linePtr;
	if (m_leftVertex->m_rightSkeletonLine)
		m_leftVertex->m_rightSkeletonLine->m_higher.m_right = linePtr;
	m_leftVertex->m_advancingSkeletonLine = linePtr;

	if (newNext1 == newPrev1)
	{
		v1Pointer->m_done = true;
		newNext1->m_done = true;
		skeleton.push_back(CSkeletonLine(*v1Pointer, *newNext1));
		CSkeletonLine *linePtr = &skeleton.back();
		linePtr->m_lower.m_right  = v1Pointer->m_leftSkeletonLine;
		linePtr->m_lower.m_left   = v1Pointer->m_rightSkeletonLine;
		linePtr->m_higher.m_right = newNext1->m_leftSkeletonLine;
		linePtr->m_higher.m_left  = newNext1->m_rightSkeletonLine;

		if (v1Pointer->m_leftSkeletonLine)
			v1Pointer->m_leftSkeletonLine->m_higher.m_left  = linePtr;
		if (v1Pointer->m_rightSkeletonLine)
			v1Pointer->m_rightSkeletonLine->m_higher.m_right = linePtr;
		if (newNext1->m_leftSkeletonLine)
			newNext1->m_leftSkeletonLine->m_higher.m_left  = linePtr;
		if (newNext1->m_rightSkeletonLine)
			newNext1->m_rightSkeletonLine->m_higher.m_right = linePtr;
	}
	else
	{
		CIntersection i1(vl, *v1Pointer);
		if (i1.m_height != CN_INFINITY)
			iq.push (i1);
	}

	if (newNext2 == newPrev2)
	{
		v2Pointer->m_done = true;
		newNext2 ->m_done = true;
		skeleton.push_back(CSkeletonLine (*v2Pointer, *newNext2));
		CSkeletonLine *linePtr = &skeleton.back();
		linePtr->m_lower.m_right = v2Pointer->m_leftSkeletonLine;
		linePtr->m_lower.m_left = v2Pointer->m_rightSkeletonLine;
		linePtr->m_higher.m_right = newNext2->m_leftSkeletonLine;
		linePtr->m_higher.m_left  = newNext2->m_rightSkeletonLine;

		if (v2Pointer->m_leftSkeletonLine)
			v2Pointer->m_leftSkeletonLine->m_higher.m_left  = linePtr;
		if (v2Pointer->m_rightSkeletonLine)
			v2Pointer->m_rightSkeletonLine->m_higher.m_right = linePtr;
		if (newNext2->m_leftSkeletonLine)
			newNext2 ->m_leftSkeletonLine->m_higher.m_left  = linePtr;
		if (newNext2->m_rightSkeletonLine)
			newNext2->m_rightSkeletonLine->m_higher.m_right = linePtr;
	}
	else
	{
		CIntersection i2 (vl, *v2Pointer);
		if (i2.m_height != CN_INFINITY)
			iq.push(i2);
	}
}