in UVAtlas/geodesics/ExactOneToAll.cpp [133:599]
void CExactOneToAll::InternalRun()
{
DVector2 w0, w1, w2, e0, e1, e2;
uint32_t dwFacePropagateTo, dwThirdPtIdxOnFacePropagateTo, dwEdgeIdxPropagateTo0, dwEdgeIdxPropagateTo1, dwPtE1Idx;
Face* pFacePropageteTo;
Edge* pEdge0, * pEdge1;
Vertex* pThridPtOnFacePropagateTo, * pPtE1;
DVector2 w0_to_e0_e2, w0_to_e1_e2, w1_to_e0_e2, w1_to_e1_e2;
bool bW2W0OnE0E2, bW2W0OnE1E2, bW2W1OnE0E2, bW2W1OnE1E2;
// the main propagation loop
while (!m_EdgeWindowsHeap.empty())
{
tmpWindow0.dwEdgeIdx = FLAG_INVALIDDWORD;
CutHeapTopData(WindowToBePropagated);
if (!WindowToBePropagated.pEdge->pAdjFace0 || !WindowToBePropagated.pEdge->pAdjFace1)
{
// this is a boundary edge, no need to propagate
continue;
}
if (fabs(WindowToBePropagated.b0 - WindowToBePropagated.b1) <= double(FLT_EPSILON))
{
// we don't process these too small windows
continue;
}
//pPtE0 = WindowToBePropagated.pMarkFromEdgeVertex;
dwFacePropagateTo = WindowToBePropagated.pEdge->GetAnotherFaceIdx(WindowToBePropagated.dwFaceIdxPropagatedFrom);
pFacePropageteTo = &m_FaceList[dwFacePropagateTo];
pFacePropageteTo->GetOtherTwoEdges(WindowToBePropagated.dwEdgeIdx, &pEdge0, &pEdge1);
pFacePropageteTo->GetOtherTwoEdgesIdx(WindowToBePropagated.dwEdgeIdx, dwEdgeIdxPropagateTo0, dwEdgeIdxPropagateTo1);
if (!pEdge0->HasVertexIdx(WindowToBePropagated.dwMarkFromEdgeVertexIdx))
{
std::swap(pEdge0, pEdge1);
std::swap(dwEdgeIdxPropagateTo0, dwEdgeIdxPropagateTo1);
}
dwThirdPtIdxOnFacePropagateTo = pEdge0->GetAnotherVertexIdx(WindowToBePropagated.dwMarkFromEdgeVertexIdx);
pThridPtOnFacePropagateTo = &m_VertexList[dwThirdPtIdxOnFacePropagateTo];
dwPtE1Idx = WindowToBePropagated.pEdge->GetAnotherVertexIdx(WindowToBePropagated.dwMarkFromEdgeVertexIdx);
pPtE1 = &m_VertexList[dwPtE1Idx];
w0.x = WindowToBePropagated.b0;
w0.y = 0;
w1.x = WindowToBePropagated.b1;
w1.y = 0;
// the parameterized pseudo source w2 may be computed by b0, b1, d1 and d0
//ComputeSrcPtFromb0b1d0d1( WindowToBePropagated.b0, WindowToBePropagated.b1, WindowToBePropagated.d0, WindowToBePropagated.d1, w2 ) ;
// however, in this improved version, it is stored directly
w2 = WindowToBePropagated.dv2Src;
e0.x = e0.y = 0;
e1.x = WindowToBePropagated.pEdge->dEdgeLength;
e1.y = 0;
if (w1.x > e1.x)
{
w1.x = e1.x;
}
ParameterizePt3ToPt2(*WindowToBePropagated.pMarkFromEdgeVertex,
*pPtE1,
*pThridPtOnFacePropagateTo, e2);
e2.y = -e2.y;
GetCommonPointOf2Lines(e0, e2, w2, w0, w0_to_e0_e2, bW2W0OnE0E2);
if (w0_to_e0_e2.x == DBL_MAX && fabs(w0.x - e0.x) < double(FLT_EPSILON))
{
bW2W0OnE0E2 = true;
w0_to_e0_e2 = e0;
}
GetCommonPointOf2Lines(e1, e2, w2, w0, w0_to_e1_e2, bW2W0OnE1E2);
GetCommonPointOf2Lines(e0, e2, w2, w1, w1_to_e0_e2, bW2W1OnE0E2);
GetCommonPointOf2Lines(e1, e2, w2, w1, w1_to_e1_e2, bW2W1OnE1E2);
if (w1_to_e1_e2.x == DBL_MAX && fabs(e1.x - w1.x) < double(FLT_EPSILON))
{
bW2W1OnE1E2 = true;
w1_to_e1_e2 = e1;
}
// this is the first figure shown
if (bW2W0OnE0E2 && bW2W1OnE1E2 && !bW2W1OnE0E2 && !bW2W0OnE1E2)
{
// the first possible new window
if ((tmpWindow0.b1 = sqrt(SquredD2Dist(w0_to_e0_e2, e2))) > double(FLT_EPSILON))
{
if (w0.x == e0.x)
tmpWindow0.b1 = pEdge0->dEdgeLength;
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, WindowToBePropagated.dwPseuSrcVertexIdx);
tmpWindow0.SetEdgeIdx(m_EdgeList, dwEdgeIdxPropagateTo0);
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance;
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, dwFacePropagateTo);
tmpWindow0.b0 = 0;
tmpWindow0.d0 = sqrt(SquredD2Dist(w2, e2));
if (w0.x == e0.x)
{
tmpWindow0.d1 = sqrt(SquredD2Dist(e0, w2));
}
else
{
tmpWindow0.d1 = sqrt(SquredD2Dist(w0_to_e0_e2, w2));
}
ParameterizePt2ToPt2(e2, e0, w2, tmpWindow0.dv2Src);
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, dwThirdPtIdxOnFacePropagateTo);
tmpWindow0.ksi = WindowToBePropagated.ksi;
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
}
// the second possible new window
if ((tmpWindow0.b1 = sqrt(SquredD2Dist(w1_to_e1_e2, e2))) > double(FLT_EPSILON))
{
if (w1.x == e1.x)
tmpWindow0.b1 = pEdge1->dEdgeLength;
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, WindowToBePropagated.dwPseuSrcVertexIdx);
tmpWindow0.SetEdgeIdx(m_EdgeList, dwEdgeIdxPropagateTo1);
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance;
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, dwFacePropagateTo);
tmpWindow0.b0 = 0;
tmpWindow0.d0 = sqrt(SquredD2Dist(w2, e2));
if (w1.x == e1.x)
{
tmpWindow0.d1 = sqrt(SquredD2Dist(e1, w2));
}
else
{
tmpWindow0.d1 = sqrt(SquredD2Dist(w1_to_e1_e2, w2));
}
ParameterizePt2ToPt2(e2, e1, w2, tmpWindow0.dv2Src);
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, dwThirdPtIdxOnFacePropagateTo);
tmpWindow0.ksi = WindowToBePropagated.ksi;
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
}
}
// this is the second figure shown in the mail
else if (bW2W0OnE1E2 && bW2W1OnE1E2)
{
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, WindowToBePropagated.dwPseuSrcVertexIdx);
tmpWindow0.SetEdgeIdx(m_EdgeList, dwEdgeIdxPropagateTo1);
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, dwFacePropagateTo);
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance;
tmpWindow0.b0 = sqrt(SquredD2Dist(w0_to_e1_e2, e2));
if (tmpWindow0.b0 < double(FLT_EPSILON))
{
tmpWindow0.b0 = 0;
}
if (w1.x == e1.x)
{
tmpWindow0.b1 = pEdge1->dEdgeLength; //SqrtWithAssert( SquredD2Dist( e1, e2 ) ) ;
tmpWindow0.d1 = sqrt(SquredD2Dist(e1, w2));
}
else
{
tmpWindow0.b1 = sqrt(SquredD2Dist(w1_to_e1_e2, e2));
tmpWindow0.d1 = sqrt(SquredD2Dist(w1_to_e1_e2, w2));
}
ParameterizePt2ToPt2(e2, e1, w2, tmpWindow0.dv2Src);
tmpWindow0.d0 = sqrt(SquredD2Dist(w0_to_e1_e2, w2));
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, dwThirdPtIdxOnFacePropagateTo);
tmpWindow0.ksi = WindowToBePropagated.ksi;
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
if (w0.x == e0.x && WindowToBePropagated.pMarkFromEdgeVertex->IsSaddleBoundary())
{
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, WindowToBePropagated.dwMarkFromEdgeVertexIdx);
tmpWindow0.SetEdgeIdx(m_EdgeList, dwEdgeIdxPropagateTo1);
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance + WindowToBePropagated.d0;
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, dwFacePropagateTo);
tmpWindow0.b0 = 0;
tmpWindow0.b1 = sqrt(SquredD2Dist(w0_to_e1_e2, e2));
tmpWindow0.d0 = pEdge0->dEdgeLength;
tmpWindow0.d1 = sqrt(SquredD2Dist(w0_to_e1_e2, e0));
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, dwThirdPtIdxOnFacePropagateTo);
//ParameterizePt2ToPt2( e2, e1, e0, tmpWindow0.dv2Src ) ;
ParameterizePt3ToPt2(*pThridPtOnFacePropagateTo, *pPtE1, *WindowToBePropagated.pMarkFromEdgeVertex, tmpWindow0.dv2Src);
tmpWindow0.ksi = WindowToBePropagated.ksi;
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
// process the "saddle shadow" (an uncovered issue in the paper)
if (!pThridPtOnFacePropagateTo->bShadowBoundary && !pEdge0->IsBoundary())
{
pThridPtOnFacePropagateTo->bShadowBoundary = true;
Edge* pBridgeEdge = pEdge0;
Face* pShadowFace = pBridgeEdge->GetAnotherFace(dwFacePropagateTo);
uint32_t dwShadowFace = pBridgeEdge->GetAnotherFaceIdx(dwFacePropagateTo);
Edge* pShadowEdge = pShadowFace->GetOpposingEdge(WindowToBePropagated.dwMarkFromEdgeVertexIdx);
uint32_t dwShadowEdge = pShadowFace->GetOpposingEdgeIdx(WindowToBePropagated.dwMarkFromEdgeVertexIdx);
uint32_t dwThisShadowVertex = dwThirdPtIdxOnFacePropagateTo;
Vertex* pNextShadowVertex = pShadowEdge->GetAnotherVertex(dwThirdPtIdxOnFacePropagateTo);
std::vector<uint32_t> shadowEdges;
std::vector<uint32_t> shadowFaces;
for (;;)
{
shadowEdges.push_back(dwShadowEdge);
shadowFaces.push_back(dwShadowFace);
if (pNextShadowVertex == pThridPtOnFacePropagateTo ||
pNextShadowVertex->bShadowBoundary /*||
pBridgeEdge->IsBoundary()*/
)
break;
pBridgeEdge = pShadowFace->GetOpposingEdge(dwThisShadowVertex);
if (pBridgeEdge->IsBoundary())
break;
dwThisShadowVertex = pShadowEdge->GetAnotherVertexIdx(dwThisShadowVertex);
pShadowFace = pBridgeEdge->GetAnotherFace(pShadowFace);
dwShadowFace = pBridgeEdge->GetAnotherFaceIdx(dwShadowFace);
pShadowEdge = pShadowFace->GetOpposingEdge(WindowToBePropagated.dwMarkFromEdgeVertexIdx);
dwShadowEdge = pShadowFace->GetOpposingEdgeIdx(WindowToBePropagated.dwMarkFromEdgeVertexIdx);
pNextShadowVertex = pShadowEdge->GetAnotherVertex(dwThisShadowVertex);
}
if (pNextShadowVertex != pThridPtOnFacePropagateTo &&
(pNextShadowVertex->bShadowBoundary || pBridgeEdge->IsBoundary())
)
{
for (size_t v = 0; v < shadowEdges.size(); ++v)
{
//EdgeWindow newWindow ;
tmpWindow0.SetEdgeIdx(m_EdgeList, shadowEdges[v]);
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, shadowFaces[v]);
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, tmpWindow0.pEdge->dwVertexIdx0);
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, WindowToBePropagated.dwMarkFromEdgeVertexIdx);
tmpWindow0.b0 = 0;
tmpWindow0.b1 = tmpWindow0.pEdge->dEdgeLength;
tmpWindow0.d0 = sqrt(SquredD3Dist(*tmpWindow0.pEdge->pVertex0, *WindowToBePropagated.pMarkFromEdgeVertex));
tmpWindow0.d1 = sqrt(SquredD3Dist(*tmpWindow0.pEdge->pVertex1, *WindowToBePropagated.pMarkFromEdgeVertex));
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance + WindowToBePropagated.d0;
ParameterizePt3ToPt2(*tmpWindow0.pEdge->pVertex0, *tmpWindow0.pEdge->pVertex1, *tmpWindow0.pPseuSrcVertex, tmpWindow0.dv2Src);
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
tmpWindow0.ksi = WindowToBePropagated.ksi;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
}
}
}
}
}
// this is the third figure shown in the mail
else if (bW2W0OnE0E2 && bW2W1OnE0E2)
{
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, WindowToBePropagated.dwPseuSrcVertexIdx);
tmpWindow0.SetEdgeIdx(m_EdgeList, dwEdgeIdxPropagateTo0);
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, dwFacePropagateTo);
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance;
tmpWindow0.b0 = sqrt(SquredD2Dist(w1_to_e0_e2, e2));
if (tmpWindow0.b0 < double(FLT_EPSILON))
{
tmpWindow0.b0 = 0;
}
if (w0.x == e0.x)
{
tmpWindow0.b1 = pEdge0->dEdgeLength; //SqrtWithAssert( SquredD2Dist( e0, e2 ) ) ;
tmpWindow0.d1 = sqrt(SquredD2Dist(e0, w2));
}
else
{
tmpWindow0.b1 = sqrt(SquredD2Dist(w0_to_e0_e2, e2));
tmpWindow0.d1 = sqrt(SquredD2Dist(w0_to_e0_e2, w2));
}
ParameterizePt2ToPt2(e2, e0, w2, tmpWindow0.dv2Src);
tmpWindow0.d0 = sqrt(SquredD2Dist(w1_to_e0_e2, w2));
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, dwThirdPtIdxOnFacePropagateTo);
tmpWindow0.ksi = WindowToBePropagated.ksi;
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
if (w1.x == e1.x && pPtE1->IsSaddleBoundary())
{
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, dwPtE1Idx);
tmpWindow0.SetEdgeIdx(m_EdgeList, dwEdgeIdxPropagateTo0);
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, dwFacePropagateTo);
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance + WindowToBePropagated.d1;
tmpWindow0.b0 = 0;
tmpWindow0.b1 = sqrt(SquredD2Dist(w1_to_e0_e2, e2));
tmpWindow0.d0 = pEdge1->dEdgeLength;
tmpWindow0.d1 = sqrt(SquredD2Dist(w1_to_e0_e2, e1));
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, dwThirdPtIdxOnFacePropagateTo);
ParameterizePt3ToPt2(*pThridPtOnFacePropagateTo, *WindowToBePropagated.pMarkFromEdgeVertex, *pPtE1, tmpWindow0.dv2Src);
tmpWindow0.ksi = WindowToBePropagated.ksi;
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
// process the "saddle shadow" (an uncovered issue in the paper)
if (!pThridPtOnFacePropagateTo->bShadowBoundary && !pEdge1->IsBoundary())
{
pThridPtOnFacePropagateTo->bShadowBoundary = true;
Edge* pBridgeEdge = pEdge1;
Face* pShadowFace = pBridgeEdge->GetAnotherFace(dwFacePropagateTo);
uint32_t dwShadowFace = pBridgeEdge->GetAnotherFaceIdx(dwFacePropagateTo);
uint32_t dwE1 = WindowToBePropagated.pEdge->GetAnotherVertexIdx(WindowToBePropagated.dwMarkFromEdgeVertexIdx);
Edge* pShadowEdge = pShadowFace->GetOpposingEdge(dwE1);
uint32_t dwShadowEdge = pShadowFace->GetOpposingEdgeIdx(dwE1);
uint32_t dwThisShadowVertex = dwThirdPtIdxOnFacePropagateTo;
Vertex* pNextShadowVertex = pShadowEdge->GetAnotherVertex(dwThirdPtIdxOnFacePropagateTo);
std::vector<uint32_t> shadowEdges;
std::vector<uint32_t> shadowFaces;
for (;;)
{
shadowEdges.push_back(dwShadowEdge);
shadowFaces.push_back(dwShadowFace);
if (pNextShadowVertex == pThridPtOnFacePropagateTo ||
pNextShadowVertex->bShadowBoundary /*||
pBridgeEdge->IsBoundary()*/
)
break;
pBridgeEdge = pShadowFace->GetOpposingEdge(dwThisShadowVertex);
if (pBridgeEdge->IsBoundary())
break;
dwThisShadowVertex = pShadowEdge->GetAnotherVertexIdx(dwThisShadowVertex);
pShadowFace = pBridgeEdge->GetAnotherFace(pShadowFace);
dwShadowFace = pBridgeEdge->GetAnotherFaceIdx(dwShadowFace);
pShadowEdge = pShadowFace->GetOpposingEdge(dwE1);
dwShadowEdge = pShadowFace->GetOpposingEdgeIdx(dwE1);
pNextShadowVertex = pShadowEdge->GetAnotherVertex(dwThisShadowVertex);
}
if (pNextShadowVertex != pThridPtOnFacePropagateTo &&
(pNextShadowVertex->bShadowBoundary || pBridgeEdge->IsBoundary())
)
{
for (size_t v = 0; v < shadowEdges.size(); ++v)
{
//EdgeWindow newWindow ;
tmpWindow0.SetEdgeIdx(m_EdgeList, shadowEdges[v]);
tmpWindow0.SetFaceIdxPropagatedFrom(m_FaceList, shadowFaces[v]);
tmpWindow0.SetMarkFromEdgeVertexIdx(m_VertexList, tmpWindow0.pEdge->dwVertexIdx0);
tmpWindow0.SetPseuSrcVertexIdx(m_VertexList, dwE1);
tmpWindow0.b0 = 0;
tmpWindow0.b1 = tmpWindow0.pEdge->dEdgeLength;
tmpWindow0.d0 = sqrt(SquredD3Dist(*tmpWindow0.pEdge->pVertex0, m_VertexList[dwE1]));
tmpWindow0.d1 = sqrt(SquredD3Dist(*tmpWindow0.pEdge->pVertex1, m_VertexList[dwE1]));
tmpWindow0.dPseuSrcToSrcDistance = WindowToBePropagated.dPseuSrcToSrcDistance + WindowToBePropagated.d1;
ParameterizePt3ToPt2(*tmpWindow0.pEdge->pVertex0, *tmpWindow0.pEdge->pVertex1, *tmpWindow0.pPseuSrcVertex, tmpWindow0.dv2Src);
tmpWindow0.pEdgePropagatedFrom = WindowToBePropagated.pEdge;
tmpWindow0.ksi = WindowToBePropagated.ksi;
if (tmpWindow0.b1 - tmpWindow0.b0 > double(FLT_EPSILON))
{
ProcessNewWindow(&tmpWindow0);
}
}
}
}
}
}
}
for (size_t i = 0; i < m_VertexList.size(); ++i)
{
if (m_VertexList[i].bUsed)
{
if (m_VertexList[i].dGeoDistanceToSrc == DBL_MAX)
{
for (size_t j = 0; j < m_VertexList[i].edgesAdj.size(); ++j)
{
Edge* pEdge;
pEdge = m_VertexList[i].edgesAdj[j];
for (size_t l = 0; l < pEdge->WindowsList.size(); ++l)
{
EdgeWindow& theWindow = pEdge->WindowsList[l].theWindow;
if (theWindow.dwMarkFromEdgeVertexIdx == i)
{
if (theWindow.b0 < theWindow.pMarkFromEdgeVertex->dLengthOfWindowEdgeToThisVertex)
{
theWindow.pMarkFromEdgeVertex->dLengthOfWindowEdgeToThisVertex = theWindow.b0;
theWindow.pMarkFromEdgeVertex->dGeoDistanceToSrc = theWindow.d0 + theWindow.dPseuSrcToSrcDistance;
}
else if (theWindow.b0 == theWindow.pMarkFromEdgeVertex->dLengthOfWindowEdgeToThisVertex)
{
theWindow.pMarkFromEdgeVertex->dGeoDistanceToSrc =
std::min(theWindow.pMarkFromEdgeVertex->dGeoDistanceToSrc, theWindow.d0 + theWindow.dPseuSrcToSrcDistance);
}
if (theWindow.pMarkFromEdgeVertex->dGeoDistanceToSrc == (theWindow.d0 + theWindow.dPseuSrcToSrcDistance))
{
theWindow.pMarkFromEdgeVertex->pEdgeReportedGeoDist = theWindow.pEdge;
}
}
else
{
Vertex* pAnotherPt = &m_VertexList[i];
if (theWindow.b1 > (theWindow.pEdge->dEdgeLength - pAnotherPt->dLengthOfWindowEdgeToThisVertex))
{
pAnotherPt->dLengthOfWindowEdgeToThisVertex = theWindow.pEdge->dEdgeLength - theWindow.b1;
pAnotherPt->dGeoDistanceToSrc = theWindow.d1 + theWindow.dPseuSrcToSrcDistance;
}
else if (theWindow.b1 == (theWindow.pEdge->dEdgeLength - pAnotherPt->dLengthOfWindowEdgeToThisVertex))
{
pAnotherPt->dGeoDistanceToSrc =
std::min(pAnotherPt->dGeoDistanceToSrc, theWindow.d1 + theWindow.dPseuSrcToSrcDistance);
}
if (pAnotherPt->dGeoDistanceToSrc == theWindow.d1 + theWindow.dPseuSrcToSrcDistance)
{
pAnotherPt->pEdgeReportedGeoDist = theWindow.pEdge;
}
}
}
}
}
}
}
}