Skip to content

Commit

Permalink
Update dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
lycantropos committed Jan 9, 2021
1 parent ed7c57b commit 5198b63
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 58 deletions.
10 changes: 5 additions & 5 deletions bentley_ottmann/core/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Sequence,
Tuple)

from ground.base import SegmentsRelationship
from ground.base import Relation
from ground.hints import (Point,
Segment)

Expand Down Expand Up @@ -65,16 +65,16 @@ def to_events_queue(segments: Sequence[Segment]) -> EventsQueue:
same_segments_ids.append(endpoints_with_ids[index][1])
index += 1
start, end = endpoints
relationship = (SegmentsRelationship.NONE
relationship = (Relation.DISJOINT
if len(same_segments_ids) == 1
else SegmentsRelationship.OVERLAP)
else Relation.EQUAL)
start_event = Event(is_left_endpoint=True,
relationship=relationship,
relation=relationship,
start=start,
complement=None,
segments_ids=same_segments_ids)
end_event = Event(is_left_endpoint=False,
relationship=relationship,
relation=relationship,
start=end,
complement=start_event,
segments_ids=same_segments_ids)
Expand Down
13 changes: 6 additions & 7 deletions bentley_ottmann/core/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@
from typing import (Optional,
Sequence)

from ground.base import SegmentsRelationship
from ground.base import Relation
from ground.hints import Point
from reprit.base import generate_repr


class Event:
__slots__ = ('is_left_endpoint', 'relationship', 'start', 'complement',
__slots__ = ('is_left_endpoint', 'relation', 'start', 'complement',
'segments_ids')

def __init__(self,
is_left_endpoint: bool,
relationship: SegmentsRelationship,
relation: Relation,
start: Point,
complement: Optional['Event'],
segments_ids: Sequence[int]) -> None:
self.is_left_endpoint = is_left_endpoint
self.relationship = relationship
self.relation = relation
self.start = start
self.complement = complement
self.segments_ids = segments_ids
Expand All @@ -29,6 +29,5 @@ def __init__(self,
def end(self) -> Point:
return self.complement.start

def set_both_relationships(self, relationship: SegmentsRelationship
) -> None:
self.relationship = self.complement.relationship = relationship
def set_both_relations(self, relation: Relation) -> None:
self.relation = self.complement.relation = relation
68 changes: 34 additions & 34 deletions bentley_ottmann/core/events_queue.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import (Optional,
Sequence)

from ground.base import (SegmentsRelationship,
from ground.base import (Relation,
get_context)
from ground.hints import Point
from prioq.base import PriorityQueue
Expand Down Expand Up @@ -46,23 +46,35 @@ def __lt__(self, other: 'EventsQueueKey') -> bool:


class EventsQueue:
__slots__ = '_queue', '_segments_relationship', '_segments_intersection'
__slots__ = '_queue', '_segments_relater', '_segments_intersector'

def __init__(self) -> None:
self._queue = PriorityQueue(key=EventsQueueKey)
context = get_context()
self._segments_relationship = context.segments_relationship
self._segments_intersection = context.segments_intersection
self._segments_relater = context.segments_relation
self._segments_intersector = context.segments_intersection

__repr__ = generate_repr(__init__)

def __bool__(self) -> bool:
return bool(self._queue)

def detect_intersection(self, below_event: Event, event: Event) -> None:
relationship = self._segments_relationship(
below_event.start, below_event.end, event.start, event.end)
if relationship is SegmentsRelationship.OVERLAP:
relation = self._segments_relater(below_event.start, below_event.end,
event.start, event.end)
if relation is Relation.TOUCH or relation is Relation.CROSS:
# segments touch or cross
point = self._segments_intersector(
below_event.start, below_event.end, event.start, event.end)
if point != below_event.start and point != below_event.end:
self._divide_segment(below_event, point)
if point != event.start and point != event.end:
self._divide_segment(event, point)
event.set_both_relations(max(event.relation,
relation))
below_event.set_both_relations(max(below_event.relation,
relation))
elif relation is not Relation.DISJOINT:
# segments overlap
starts_equal = event.start == below_event.start
if starts_equal:
Expand All @@ -86,46 +98,34 @@ def detect_intersection(self, below_event: Event, event: Event) -> None:
# segments are equal
below_event.segments_ids = event.segments_ids = (
segments_ids)
event.set_both_relationships(relationship)
below_event.set_both_relationships(relationship)
event.set_both_relations(relation)
below_event.set_both_relations(relation)
else:
# segments share the left endpoint
end_min.set_both_relationships(relationship)
end_max.complement.relationship = relationship
end_min.set_both_relations(relation)
end_max.complement.relation = relation
self._divide_segment(end_max.complement, end_min.start,
segments_ids)
elif ends_equal:
# segments share the right endpoint
start_max.set_both_relationships(relationship)
start_min.complement.relationship = relationship
start_max.set_both_relations(relation)
start_min.complement.relation = relation
self._divide_segment(start_min, start_max.start, segments_ids)
elif start_min is end_max.complement:
# one line segment includes the other one
start_max.set_both_relationships(relationship)
start_min_original_relationship = start_min.relationship
start_min.relationship = relationship
start_max.set_both_relations(relation)
start_min_original_relationship = start_min.relation
start_min.relation = relation
self._divide_segment(start_min, end_min.start, segments_ids)
start_min.relationship = start_min_original_relationship
start_min.complement.relationship = relationship
start_min.relation = start_min_original_relationship
start_min.complement.relation = relation
self._divide_segment(start_min, start_max.start, segments_ids)
else:
# no line segment includes the other one
start_max.relationship = relationship
start_max.relation = relation
self._divide_segment(start_max, end_min.start, segments_ids)
start_min.complement.relationship = relationship
start_min.complement.relation = relation
self._divide_segment(start_min, start_max.start, segments_ids)
elif relationship is not SegmentsRelationship.NONE:
# segments touch or cross
point = self._segments_intersection(
below_event.start, below_event.end, event.start, event.end)
if point != below_event.start and point != below_event.end:
self._divide_segment(below_event, point)
if point != event.start and point != event.end:
self._divide_segment(event, point)
event.set_both_relationships(max(event.relationship,
relationship))
below_event.set_both_relationships(max(below_event.relationship,
relationship))

def peek(self) -> Event:
return self._queue.peek()
Expand All @@ -149,12 +149,12 @@ def _divide_segment(self,
else:
event.segments_ids = segments_ids
left_event = Event(is_left_endpoint=True,
relationship=event.complement.relationship,
relation=event.complement.relation,
start=break_point,
complement=event.complement,
segments_ids=segments_ids)
right_event = Event(is_left_endpoint=False,
relationship=event.relationship,
relation=event.relation,
start=break_point,
complement=event,
segments_ids=segments_ids)
Expand Down
35 changes: 27 additions & 8 deletions bentley_ottmann/planar.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
Set,
Tuple)

from ground.base import get_context as _get_context
from ground.base import (Relation as _Relation,
get_context as _get_context)
from ground.hints import (Contour,
Point,
Segment)
from ground.base import SegmentsRelationship as _SegmentsRelationship

from .core.base import sweep as _sweep
from .core.utils import (merge_ids as _merge_ids,
Expand Down Expand Up @@ -68,8 +68,8 @@ def non_neighbours_intersect(edges_ids: Iterable[Tuple[int, int]],
and (segment_id != 0 or next_segment_id != last_edge_index)
for segment_id, next_segment_id in edges_ids)

return any((first_event.relationship is _SegmentsRelationship.OVERLAP
or second_event.relationship is _SegmentsRelationship.OVERLAP
return any((first_event.relation is _Relation.OVERLAP
or second_event.relation is _Relation.OVERLAP
or non_neighbours_intersect(_to_pairs_combinations(_merge_ids(
first_event.segments_ids, second_event.segments_ids))))
for first_event, second_event in _sweep(edges))
Expand Down Expand Up @@ -155,9 +155,9 @@ def segments_cross_or_overlap(segments: Sequence[Segment]) -> bool:
... Segment(Point(2, 0), Point(0, 2))])
True
"""
relationships = _SegmentsRelationship.CROSS, _SegmentsRelationship.OVERLAP
return any(first_event.relationship in relationships
or second_event.relationship in relationships
rest_relations = _Relation.DISJOINT, _Relation.TOUCH
return any(first_event.relation not in rest_relations
or second_event.relation not in rest_relations
for first_event, second_event in _sweep(segments))


Expand Down Expand Up @@ -200,7 +200,26 @@ def segments_intersections(segments: Sequence[Segment]
mapping between intersection points and corresponding segments indices.
"""
result = {}
segments_intersector = _get_context().segments_intersections
context = _get_context()

def segments_intersector(first_start: Point,
first_end: Point,
second_start: Point,
second_end: Point,
relater=context.segments_relation,
intersector=context.segments_intersection
) -> Tuple[Point, ...]:
relation = relater(first_start, first_end, second_start, second_end)
if relation is _Relation.DISJOINT:
return ()
if relation is _Relation.TOUCH or relation is _Relation.CROSS:
return intersector(first_start, first_end, second_start,
second_end),
else:
_, first_point, second_point, _ = sorted(
[first_start, first_end, second_start, second_end])
return first_point, second_point

for first_event, second_event in _sweep(segments):
for segment_id, next_segment_id in _to_pairs_combinations(_merge_ids(
first_event.segments_ids, second_event.segments_ids)):
Expand Down
8 changes: 4 additions & 4 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
dendroid~=1.1.0
ground~=1.3.0
prioq~=0.3.0
reprit~=0.3.1
dendroid~=1.1
ground~=2.0
prioq~=0.3
reprit~=0.3

0 comments on commit 5198b63

Please sign in to comment.