extend adjacent edges when generating 3D intervals
remove broken data and add two pretty interval3D
move generation of intervals in separate module
add : store "squares" in Interval2D

    find them while generating a random Interval2D
    will be used to find in O(log(n)) if a point lies in this interval2D
move _is_in method to Interval2D.__contains__()

    call _points3d_from_projections() directly with Interval2Ds
    remove 'close' parameter from __contains__, assume it's always True
add: use squares of Interval2Ds for __contains__()

    with a binary search