void CExactOneToAll::InternalRun()

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;
                            }
                        }
                    }
                }
            }
        }
    }
}