Skip to content

Commit

Permalink
Complete events
Browse files Browse the repository at this point in the history
  • Loading branch information
lycantropos committed Aug 24, 2022
1 parent 26a3012 commit 0a88619
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 129 deletions.
113 changes: 60 additions & 53 deletions clipping/core/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
TypeVar)

from ground.hints import Point
from reprit import seekers
from reprit.base import generate_repr

from .enums import OverlapKind
Expand Down Expand Up @@ -223,28 +224,30 @@ def from_endpoints(cls,
event.right = RightShapedEvent(end, event)
return event

__slots__ = ('from_first', 'from_shaped_result', 'interior_to_left',
'other_interior_to_left', 'overlap_kind', 'position',
'start')
__slots__ = ('from_first', 'from_shaped_result', 'id', 'interior_to_left',
'other_interior_to_left', 'overlap_kind', 'start')

def __init__(self,
start: Point,
right: Optional['RightShapedEvent'],
from_first: bool,
interior_to_left: bool,
other_interior_to_left: bool = False,
overlap_kind: OverlapKind = OverlapKind.NONE,
*,
from_shaped_result: bool = False,
position: int = 0) -> None:
self.right, self.start = right, start
self.from_first = from_first
self.interior_to_left = interior_to_left
self.other_interior_to_left = other_interior_to_left
self.overlap_kind = overlap_kind
self.from_shaped_result = from_shaped_result
self.position = position
id_: int = 0,
other_interior_to_left: bool = False,
overlap_kind: OverlapKind = OverlapKind.NONE) -> None:
(
self.from_first, self.from_shaped_result, self.id,
self.interior_to_left, self.other_interior_to_left,
self.overlap_kind, self.right, self.start
) = (
from_first, from_shaped_result, id_, interior_to_left,
other_interior_to_left, overlap_kind, right, start
)

__repr__ = recursive_repr()(generate_repr(__init__))
__repr__ = recursive_repr()(generate_repr(__init__,
field_seeker=seekers.complex_))

@property
def inside(self) -> bool:
Expand Down Expand Up @@ -319,40 +322,42 @@ def from_endpoints(cls,

__slots__ = ('below_event_from_shaped_result', 'contour_id', 'from_first',
'from_in_to_out', 'from_shaped_result', 'interior_to_left',
'other_interior_to_left', 'overlap_kind', 'position',
'start', 'start_index')

def __init__(self,
start: Point,
right: Optional['RightShapedEvent'],
from_first: bool,
interior_to_left: bool,
other_interior_to_left: bool = False,
overlap_kind: OverlapKind = OverlapKind.NONE,
from_shaped_result: bool = False,
from_in_to_out: bool = False,
position: int = UNDEFINED_INDEX,
start_index: int = UNDEFINED_INDEX,
contour_id: Optional[int] = None,
below_event_from_shaped_result: Optional['LeftHoleyEvent']
= None) -> None:
self.right, self.start = right, start
self.from_first = from_first
self.from_shaped_result = from_shaped_result
self.interior_to_left = interior_to_left
self.other_interior_to_left = other_interior_to_left
self.overlap_kind = overlap_kind
self.position = position
self.start_index = start_index
self.from_in_to_out = from_in_to_out
self.contour_id = contour_id
self.below_event_from_shaped_result = below_event_from_shaped_result
'other_interior_to_left', 'overlap_kind', 'id', 'start',
'start_id')

def __init__(
self,
start: Point,
right: Optional['RightShapedEvent'],
from_first: bool,
interior_to_left: bool,
*,
below_event_from_shaped_result: Optional['LeftHoleyEvent'] = None,
contour_id: Optional[int] = None,
from_in_to_out: bool = False,
from_shaped_result: bool = False,
id_: int = UNDEFINED_INDEX,
other_interior_to_left: bool = False,
overlap_kind: OverlapKind = OverlapKind.NONE,
start_id: int = UNDEFINED_INDEX
) -> None:
(
self.below_event_from_shaped_result, self.contour_id,
self.from_first, self.from_in_to_out, self.from_shaped_result,
self.id, self.interior_to_left, self.other_interior_to_left,
self.overlap_kind, self.right, self.start, self.start_id
) = (
below_event_from_shaped_result, contour_id, from_first,
from_in_to_out, from_shaped_result, id_, interior_to_left,
other_interior_to_left, overlap_kind, right, start, start_id
)

__repr__ = recursive_repr()(generate_repr(__init__))
__repr__ = recursive_repr()(generate_repr(__init__,
field_seeker=seekers.complex_))

@property
def end_index(self) -> int:
return self.opposite.start_index
def end_id(self) -> int:
return self.opposite.start_id

@property
def inside(self) -> bool:
Expand Down Expand Up @@ -419,22 +424,24 @@ def divide(self, point: Point) -> 'LeftHoleyEvent':


class RightShapedEvent(RightEvent):
__slots__ = 'position', 'start', 'start_index'
__slots__ = 'id', 'start', 'start_id'

def __init__(self,
start: Point,
left: LeftShapedEvent,
position: int = UNDEFINED_INDEX,
start_index: int = UNDEFINED_INDEX) -> None:
self.left, self.position, self.start, self.start_index = (
left, position, start, start_index
*,
id_: int = UNDEFINED_INDEX,
start_id: int = UNDEFINED_INDEX) -> None:
self.id, self.left, self.start, self.start_id = (
id_, left, start, start_id
)

__repr__ = recursive_repr()(generate_repr(__init__))
__repr__ = recursive_repr()(generate_repr(__init__,
field_seeker=seekers.complex_))

@property
def end_index(self) -> int:
return self.opposite.start_index
def end_id(self) -> int:
return self.opposite.start_id

@property
def from_first(self) -> bool:
Expand Down
35 changes: 18 additions & 17 deletions clipping/core/holeless.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
from reprit.base import generate_repr

from . import bounding
from .event import (LeftHolelessEvent as LeftEvent,
from .event import (UNDEFINED_INDEX,
LeftHolelessEvent as LeftEvent,
RightShapedEvent as RightEvent,
events_to_connectivity)
from .events_queue import HolelessEventsQueue as EventsQueue
Expand Down Expand Up @@ -79,32 +80,32 @@ def events_to_regions(self, events: Iterable[Event]) -> Sequence[Region]:
for event in events
if event.primary.from_shaped_result],
key=self._events_queue.key)
for index, event in enumerate(events):
event.position = index
for event_id, event in enumerate(events):
event.id = event_id
processed = [False] * len(events)
result = []
connectivity = events_to_connectivity(events)
contour_cls, orienteer = (self.context.contour_cls,
self.context.angle_orientation)
for index, event in enumerate(events):
if processed[index]:
for event_id, event in enumerate(events):
if processed[event_id]:
continue
contour_start = event.start
vertices = [contour_start]
contour_events = [event]
cursor = event
opposite_position = event.opposite.position
processed[index] = processed[opposite_position] = True
opposite_event_id = event.opposite.id
processed[event_id] = processed[opposite_event_id] = True
while cursor.end != contour_start:
vertices.append(cursor.end)
position = _to_next_position(opposite_position, processed,
event_id = _to_next_event_id(opposite_event_id, processed,
connectivity)
if position is None:
if event_id == UNDEFINED_INDEX:
break
cursor = events[position]
cursor = events[event_id]
contour_events.append(cursor)
opposite_position = cursor.opposite.position
processed[position] = processed[opposite_position] = True
opposite_event_id = cursor.opposite.id
processed[event_id] = processed[opposite_event_id] = True
shrink_collinear_vertices(vertices, orienteer)
result.append(contour_cls(vertices))
return result
Expand Down Expand Up @@ -253,13 +254,13 @@ def from_shaped_result(self, event: LeftEvent) -> bool:
or not event.from_first and event.is_common_region_boundary)


def _to_next_position(position: int,
def _to_next_event_id(event_id: int,
processed: List[bool],
connectivity: Sequence[int]) -> Optional[int]:
candidate = position
connectivity: Sequence[int]) -> int:
candidate = event_id
while True:
candidate = connectivity[candidate]
if not processed[candidate]:
return candidate
elif candidate == position:
return None
elif candidate == event_id:
return UNDEFINED_INDEX

0 comments on commit 0a88619

Please sign in to comment.