private void AddObstaclePortEntranceToGraph(ObstaclePortEntrance entrance) {
            // Note: As discussed in ObstaclePortEntrance.AddToGraph, oport.VisibilityBorderIntersect may be
            // on a border shared with another obstacle, in which case we'll extend into that obstacle.  This
            // should be fine if we're consistent about "touching means overlapped", so that a path that comes
            // through the other obstacle on the shared border is OK.
            VisibilityVertex borderVertex = VisGraph.FindVertex(entrance.VisibilityBorderIntersect);
            if (null != borderVertex) {
                entrance.ExtendFromBorderVertex(TransUtil, borderVertex, this.portSpliceLimitRectangle, RouteToCenterOfObstacles);
                return;
            }

            // There may be no scansegment to splice to before we hit an adjacent obstacle, so if the edge 
            // is null there is nothing to do.
            VisibilityVertex targetVertex;
            double weight = entrance.IsOverlapped ? ScanSegment.OverlappedWeight : ScanSegment.NormalWeight;
            VisibilityEdge edge = this.FindorCreateNearestPerpEdge(entrance.MaxVisibilitySegment.End, entrance.VisibilityBorderIntersect,
                    entrance.OutwardDirection, weight /*checkForObstacle*/, out targetVertex);
            if (null != edge) {
                entrance.AddToAdjacentVertex(TransUtil, targetVertex, this.portSpliceLimitRectangle, RouteToCenterOfObstacles);
            }
        }