コード例 #1
0
 def create_closest_plant(self, segment_part):
     closest_expected_projection = segment_part.expected_projections[0]
     closest_expected_position = projection_to_position_2d(closest_expected_projection, segment_part.start.position, segment_part.end.position)
     # Add on z value
     closest_expected_position = closest_expected_position + (segment_part.start.position[2],)
     new_plant = CreatedPlant(name='plant', position=closest_expected_position, zone=segment_part.start.zone)
     new_plant.projection = closest_expected_projection
     return new_plant
コード例 #2
0
 def split_segment_into_parts(self, segment_part, forward_plant, reverse_plant):
     
     if not forward_plant or not reverse_plant:
         return [] # Can't split up any more. 
     
     # First change reverse plant projection to be in the forward direction to make it consistent.
     _, reverse_plant.projection = lateral_and_projection_distance_2d(reverse_plant.position, segment_part.start.position,
                                                                         segment_part.end.position)
     
     projection_difference = reverse_plant.projection - forward_plant.projection
     
     selected_plants = []
     if abs(projection_difference) < 0.0001:
         # Segments split on same plant so it doesn't matter which one we choose.
         selected_plants = [forward_plant]
     elif projection_difference > self.closest_plant_spacing:
         # Normal case where forward/reverse don't overlap. We should now have 3 segments.
         selected_plants = [forward_plant, reverse_plant]
     else:
         # Forward/reverse overlap.  Need to decide which one to use.
         if forward_plant.type == 'CreatedPlant' and reverse_plant.type == 'CreatedPlant':
             avg_position = np.mean([forward_plant.position, reverse_plant.position], axis=0)
             avg_plant = CreatedPlant(name='plant', position=avg_position, zone=forward_plant.zone)
             avg_plant.projection = np.mean([forward_plant.projection, reverse_plant.projection], axis=0)
             selected_plants = [avg_plant]
         elif forward_plant.type == 'Plant' and reverse_plant.type == 'Plant':
             if forward_plant.penalty < reverse_plant.penalty:
                 selected_plants = [forward_plant]
             else:
                 selected_plants = [reverse_plant]
         elif forward_plant.type == 'Plant':
             selected_plants = [forward_plant]
         elif reverse_plant.type == 'Plant':
             selected_plants = [reverse_plant]
         else:
             assert(False)
     
     if len(selected_plants) == 0:
         return []
     elif len(selected_plants) == 1:
         selected_plant = selected_plants[0]
         first_subpart = SegmentPart(start=segment_part.start, end=selected_plant)
         second_subpart = SegmentPart(start=selected_plant, end=segment_part.end)
         before_plants, after_plants = self.split_possible_plants_by_projections(segment_part.possible_plants, [selected_plant.projection])
         first_subpart.possible_plants = before_plants
         second_subpart.possible_plants = after_plants
         return [first_subpart, second_subpart]
     elif len(selected_plants) == 2:
         first_subpart = SegmentPart(start=segment_part.start, end=selected_plants[0])
         second_subpart = SegmentPart(start=selected_plants[0], end=selected_plants[1])
         third_subpart = SegmentPart(start=selected_plants[1], end=segment_part.end)
         first_subpart.possible_plants, second_subpart.possible_plants, third_subpart.possible_plants = \
             self.split_possible_plants_by_projections(segment_part.possible_plants, [selected_plants[0].projection, selected_plants[1].projection])
         return [first_subpart, second_subpart, third_subpart]
     else:
         assert(False)