00001 # Software License Agreement (BSD License) 00002 # 00003 # Copyright (c) 2009, Willow Garage, Inc. 00004 # All rights reserved. 00005 # 00006 # Redistribution and use in source and binary forms, with or without 00007 # modification, are permitted provided that the following conditions 00008 # are met: 00009 # 00010 # * Redistributions of source code must retain the above copyright 00011 # notice, this list of conditions and the following disclaimer. 00012 # * Redistributions in binary form must reproduce the above 00013 # copyright notice, this list of conditions and the following 00014 # disclaimer in the documentation and/or other materials provided 00015 # with the distribution. 00016 # * Neither the name of Willow Garage, Inc. nor the names of its 00017 # contributors may be used to endorse or promote products derived 00018 # from this software without specific prior written permission. 00019 # 00020 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00021 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00022 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00023 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00024 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00025 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00026 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00027 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00028 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00029 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00030 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00031 # POSSIBILITY OF SUCH DAMAGE. 00032 00033 PKG = 'rxbag_plugins' 00034 import roslib; roslib.load_manifest(PKG) 00035 00036 import bisect 00037 00038 class DataSet(object): 00039 def __init__(self): 00040 self._points = [] 00041 00042 self._num_points = 0 00043 00044 self._min_x = None 00045 self._max_x = None 00046 self._min_y = None 00047 self._max_y = None 00048 00049 @property 00050 def points(self): return self._points 00051 00052 @property 00053 def num_points(self): return self._num_points 00054 00055 @property 00056 def min_x(self): return self._min_x 00057 00058 @property 00059 def max_x(self): return self._max_x 00060 00061 @property 00062 def min_y(self): return self._min_y 00063 00064 @property 00065 def max_y(self): return self._max_y 00066 00067 def add(self, x, y): 00068 pt = (x, y) 00069 00070 index = bisect.bisect_right(self._points, pt) 00071 00072 self._points.insert(index, pt) 00073 00074 self._num_points += 1 00075 00076 if self._num_points == 1: 00077 self._min_x = x 00078 self._max_x = x 00079 self._min_y = y 00080 self._max_y = y 00081 else: 00082 if x < self._min_x: 00083 self._min_x = x 00084 elif x > self._max_x: 00085 self._max_x = x 00086 if y < self._min_y: 00087 self._min_y = y 00088 elif y > self._max_y: 00089 self._max_y = y 00090 00091 def set(self, pts): 00092 self._points = pts 00093 00094 self._num_points = len(self._points) 00095 00096 if self._num_points == 0: 00097 self._min_x = None 00098 self._max_x = None 00099 self._min_y = None 00100 self._max_y = None 00101 else: 00102 xs = [x for x, y in pts] 00103 ys = [y for x, y in pts] 00104 00105 self._min_x = min(xs) 00106 self._max_x = max(xs) 00107 self._min_y = min(ys) 00108 self._max_y = max(ys)