#!/usr/bin/env python ############################################################################### # Copyright 2018 The Apollo Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ############################################################################### from vector2d import Vector2 from rotation2d import * from util import segment_overlap class BoundingRectangle: def __init__(self, x, y, theta, length, width): self.vertices = [None] * 4 dx = 0.5 * length dy = 0.5 * width cos_theta = cos(theta) sin_theta = sin(theta) self.vertices[0] = rotate_fast(Vector2(dx, -dy), cos_theta, sin_theta) self.vertices[1] = rotate_fast(Vector2(dx, dy), cos_theta, sin_theta) self.vertices[2] = rotate_fast(Vector2(-dx, dy), cos_theta, sin_theta) self.vertices[3] = rotate_fast(Vector2(-dx, -dy), cos_theta, sin_theta) for i in range(4): self.vertices[i].x += x self.vertices[i].y += y def overlap(self, rect): for i in range(4): v0 = self.vertices[i] v1 = self.vertices[(i + 1) % 4] range_self = self.project(v0, v1) range_other = rect.project(v0, v1) if segment_overlap(range_self[0], range_self[1], range_other[0], range_other[1]) == False: return False for i in range(4): v0 = rect.vertices[i] v1 = rect.vertices[(i + 1) % 4] range_self = self.project(v0, v1) range_other = rect.project(v0, v1) if segment_overlap(range_self[0], range_self[1], range_other[0], range_other[1]) == False: return False return True def project(self, p0, p1): v = p1.subtract(p0) n = v.norm() rmin = float("inf") rmax = float("-inf") for i in range(4): t = self.vertices[i].subtract(p0) r = t.dot(v) / n if r < rmin: rmin = r if r > rmax: rmax = r return [rmin, rmax] def print_vertices(self): for i in range(4): print(str(self.vertices[i].x) + "\t" + str(self.vertices[i].y) + "\n")