void RegisterSegmentCrossing(int segmentIndex, SegmentCrossing crossing)
 {
     if (!segmentCrossings.ContainsKey(segmentIndex))
     {
         segmentCrossings[segmentIndex] = crossing;
     }
     else
     {
         if (segmentCrossings[segmentIndex].TrailCrossing != crossing.TrailCrossing)
         {
             overlaps.Add(segmentIndex);
         }
     }
 }
    void RegisterCrossing(Puff p1, Puff p2, Puff q1, Puff q2, IntersectionResult result)
    {
        Debug.Log("Crossing between " + p1.Index + " and " + q1.Index);

        var trailCrossing = TrailCrossingFor(p1, q1);

        if (trailCrossing.Height == CrossingHeight.Unknown)
        {
            trailCrossing.Height = ClassifyCrossingHeight(
                p1.Position, p2.Position, q1.Position, q2.Position
                );
        }
        if (trailCrossing.Direction == CrossingDirection.Unknown)
        {
            trailCrossing.Direction = (result == IntersectionResult.IntersectingFromRight)
                ? CrossingDirection.Right
                : CrossingDirection.Left;
        }

        var crossing = new SegmentCrossing(p1.Index, q1.Index, trailCrossing);

        RegisterSegmentCrossing(p1.Index, crossing);
        RegisterSegmentCrossing(q1.Index, crossing);
    }