def check(i, j): """ Checks the endpoints and returns two that don't already exist in the structure. If they do already exist, then it returns two endpoints that don't. It does this by changing the j-endpoint. This function also takes into account making sure that the returned value is still within the robot's tendency to build up. (ie, it does not return a beam which would build below the limit angle_constraint) """ # There is already a beam here, so let's move our current beam slightly to # some side if not self.structure.available(i, j): # Create a small disturbace lim = BEAM["random"] f = random.uniform disturbance = (f(-1 * lim, lim), f(-1 * lim, lim), f(-1 * lim, lim)) # find the new j-point for the beam new_j = helpers.beam_endpoint(i, helpers.sum_vectors(j, disturbance)) return check(i, new_j) else: # Calculate the actual endpoint of the beam (now that we now direction # vector) return (i, helpers.beam_endpoint(i, j))
def acceptable_support(angle,coord): # Find beam endpoints beam_endpoint = helpers.beam_endpoint(pivot,coord) # Calculate angle from vertical of beam we wish to construct based on the # information we've gathered from_vertical = (angle_from_vertical + angle if beam_endpoint[2] <= endpoint[2] else angle_from_vertical - angle) simple = not (from_vertical < min_constraining_angle or from_vertical > max_constraining_angle) # On the ground if self.beam is None: return simple # On a beam, so check our support_angle_difference else: beam_vector = helpers.make_vector(self.beam.endpoints.i, self.beam.endpoints.j) support_vector = helpers.make_vector(self.location,coord) angle = helpers.smallest_angle(beam_vector,support_vector) real_angle = abs(90-angle) if angle > 90 else angle return simple and real_angle > BConstants.beam['support_angle_difference']
def acceptable_support(angle, coord): # Find beam endpoints beam_endpoint = helpers.beam_endpoint(pivot, coord) # Calculate angle from vertical of beam we wish to construct based on the # information we've gathered from_vertical = (angle_from_vertical + angle if beam_endpoint[2] <= endpoint[2] else angle_from_vertical - angle) simple = not (from_vertical < min_constraining_angle or from_vertical > max_constraining_angle) # On the ground if self.beam is None: return simple # On a beam, so check our support_angle_difference else: beam_vector = helpers.make_vector(self.beam.endpoints.i, self.beam.endpoints.j) support_vector = helpers.make_vector(self.location, coord) angle = helpers.smallest_angle(beam_vector, support_vector) real_angle = abs(90 - angle) if angle > 90 else angle return simple and real_angle > BConstants.beam[ 'support_angle_difference']
def support_beam_endpoint(self): ''' Returns the endpoint for a support beam ''' #pdb.set_trace() # Get broken beam e1,e2 = self.structure.get_endpoints(self.memory['broken_beam_name'], self.location) # Direction v = helpers.make_unit(helpers.make_vector(e1,e2)) # Get pivot and repair beam midpoint pivot = self.location midpoint1 = helpers.midpoint(e1,e2) # Upper midpoint to encourate upward building midpoint = helpers.midpoint(e2,midpoint1) # Add an offset to mimick inability to determine location exactly offset = helpers.scale(random.uniform(-1*BEAM['random'],BEAM['random']),v) midpoint = (helpers.sum_vectors(midpoint,offset) if random.randint(0,4) == 1 else midpoint) # Calculate starting beam_endpoint endpoint = helpers.beam_endpoint(pivot,midpoint) # Calculate angle from vertical angle_from_vertical = helpers.smallest_angle(helpers.make_vector(pivot, endpoint),(0,0,1)) # Get angles sorted_angles = self.local_angles(pivot,endpoint) min_support_angle,max_support_angle = self.get_angles() min_constraining_angle,max_constraining_angle = self.get_angles( support=False) # Defining here to have access to min,max, etc. def acceptable_support(angle,coord): # Find beam endpoints beam_endpoint = helpers.beam_endpoint(pivot,coord) # Calculate angle from vertical of beam we wish to construct based on the # information we've gathered from_vertical = (angle_from_vertical + angle if beam_endpoint[2] <= endpoint[2] else angle_from_vertical - angle) simple = not (from_vertical < min_constraining_angle or from_vertical > max_constraining_angle) # On the ground if self.beam is None: return simple # On a beam, so check our support_angle_difference else: beam_vector = helpers.make_vector(self.beam.endpoints.i, self.beam.endpoints.j) support_vector = helpers.make_vector(self.location,coord) angle = helpers.smallest_angle(beam_vector,support_vector) real_angle = abs(90-angle) if angle > 90 else angle return simple and real_angle > BConstants.beam['support_angle_difference'] return_coord = None for coord,angle in sorted_angles: if acceptable_support(angle,coord) and helpers.on_line(e1,e2,coord): self.memory['broken_beam_name'] = '' return coord elif acceptable_support(angle,coord): return_coord = coord if return_coord is not None: return return_coord else: # Otherwise, do default behaviour return super(Repairer,self).support_beam_endpoint()
def support_beam_endpoint(self): ''' Returns the endpoint for a support beam ''' #pdb.set_trace() # Get broken beam e1, e2 = self.structure.get_endpoints(self.memory['broken_beam_name'], self.location) # Direction v = helpers.make_unit(helpers.make_vector(e1, e2)) # Get pivot and repair beam midpoint pivot = self.location midpoint1 = helpers.midpoint(e1, e2) # Upper midpoint to encourate upward building midpoint = helpers.midpoint(e2, midpoint1) # Add an offset to mimick inability to determine location exactly offset = helpers.scale( random.uniform(-1 * BEAM['random'], BEAM['random']), v) midpoint = (helpers.sum_vectors(midpoint, offset) if random.randint( 0, 4) == 1 else midpoint) # Calculate starting beam_endpoint endpoint = helpers.beam_endpoint(pivot, midpoint) # Calculate angle from vertical angle_from_vertical = helpers.smallest_angle( helpers.make_vector(pivot, endpoint), (0, 0, 1)) # Get angles sorted_angles = self.local_angles(pivot, endpoint) min_support_angle, max_support_angle = self.get_angles() min_constraining_angle, max_constraining_angle = self.get_angles( support=False) # Defining here to have access to min,max, etc. def acceptable_support(angle, coord): # Find beam endpoints beam_endpoint = helpers.beam_endpoint(pivot, coord) # Calculate angle from vertical of beam we wish to construct based on the # information we've gathered from_vertical = (angle_from_vertical + angle if beam_endpoint[2] <= endpoint[2] else angle_from_vertical - angle) simple = not (from_vertical < min_constraining_angle or from_vertical > max_constraining_angle) # On the ground if self.beam is None: return simple # On a beam, so check our support_angle_difference else: beam_vector = helpers.make_vector(self.beam.endpoints.i, self.beam.endpoints.j) support_vector = helpers.make_vector(self.location, coord) angle = helpers.smallest_angle(beam_vector, support_vector) real_angle = abs(90 - angle) if angle > 90 else angle return simple and real_angle > BConstants.beam[ 'support_angle_difference'] return_coord = None for coord, angle in sorted_angles: if acceptable_support(angle, coord) and helpers.on_line( e1, e2, coord): self.memory['broken_beam_name'] = '' return coord elif acceptable_support(angle, coord): return_coord = coord if return_coord is not None: return return_coord else: # Otherwise, do default behaviour return super(Repairer, self).support_beam_endpoint()