def Centroid(points): xsum = 0.0 ysum = 0.0 for p in points: xsum += p.X ysum += p.Y return PointR(xsum / len(points), ysum / len(points))
def Resample(points, n): I = 1.0 * Utils.PathLength(points) / (n-1) D = 0.0 srcPts = [] for p in points: srcPts.append(p[:]) dstPts = [] dstPts.append(srcPts[0][:]) counts = len(srcPts) i = 1 while i < counts: pt1 = srcPts[i-1] pt2 = srcPts[i] d = Utils.Distance(pt1, pt2) if (D+d) >= I: qx = pt1.X + ((I - D) / d) * (pt2.X - pt1.X) qy = pt1.Y + ((I - D) / d) * (pt2.Y - pt1.Y) q = PointR(qx, qy) dstPts.append(q) srcPts.insert(i, q[:]) counts += 1 D = 0.0 else: D += d i += 1 if len(dstPts) == n-1: dstPts.append(srcPts[len(srcPts) -1][:]) return dstPts
def RotateByRadians(points, radians): newPoints = [] c = Utils.Centroid(points) cos = math.cos(radians) sin = math.sin(radians) cx = c.X cy = c.Y counts = len(points) for i in range(counts): p = points[i] dx = p.X - cx dy = p.Y - cy q = PointR() q.X = dx * cos - dy * sin + cx q.Y = dx * sin + dy * cos + cy newPoints.append(q) return newPoints
def ReadGesture(self, root): if root.tag != "Gesture": return None name = root.get("Name") points = [] plist = root.findall("Point") for p in plist: qx = string.atof(p.get("X")) qy = string.atof(p.get("Y")) qt = string.atoi(p.get("T")) q = PointR(qx,qy,qt) points.append(q) return Gesture(name, points)
def Center(self): return PointR(self.X+self.Width/2.0, self.Y+self.Height/2.0)
def BottomRight(self): return PointR(self.X+self.Width, self.Y+self.Height)
def TopLeft(self): return PointR(self.X,self.Y)
def RotatePoint(p, c, radians): q = PointR() q.X = (p.X - c.X) * math.cos(radians) - (p.Y - c.Y) * math.sin(radians) + c.X q.Y = (p.X - c.X) * math.sin(radians) + (p.Y - c.Y) * math.cos(radians) + c.Y return q