示例#1
0
 def orderCorners(self, orderedBlocks, corners):
     time = min(self.contactData.keys())
     
     directionSign = 0
     for i in range(len(orderedBlocks)):
         x1 = self.blockData[time][orderedBlocks[i-2]]['x']
         y1 = self.blockData[time][orderedBlocks[i-2]]['y']
         x2 = self.blockData[time][orderedBlocks[i-1]]['x']
         y2 = self.blockData[time][orderedBlocks[i-1]]['y']
         x3 = self.blockData[time][orderedBlocks[i]]['x']
         y3 = self.blockData[time][orderedBlocks[i]]['y']
         xVec1 = x1-x2
         yVec1 = y1-y2
         xVec2 = x3-x2
         yVec2 = y3-y2
         vecAngle = Common.angle(xVec1, yVec1, xVec2, yVec2)
         vecSign = xVec1*yVec2-xVec2*yVec1
         directionSign += vecSign
     if directionSign > 0:
         directionSign = -directionSign
         orderedBlocks = orderedBlocks[::-1]
     corners = copy.deepcopy(corners)
     orderedBlocks = copy.deepcopy(orderedBlocks)
     newCorners = []
     
     for i in range(len(orderedBlocks)):
         allBlockCorners = self.blockData[time][orderedBlocks[i]]['corners']
         blockCorners = Common.listIntersection(corners, allBlockCorners)           
         orderedBlockCorners = []
         for corner in allBlockCorners:
             if corner in blockCorners:
                 orderedBlockCorners.append(corner)
         blockCorners = orderedBlockCorners
         
         blockDirection = 0
      
         for j in range(len(allBlockCorners)):
             x1 = self.gridPointData[time][self.cornerData[time][allBlockCorners[j-2]]['gridPoint']]['x']
             y1 = self.gridPointData[time][self.cornerData[time][allBlockCorners[j-2]]['gridPoint']]['y']
             x2 = self.gridPointData[time][self.cornerData[time][allBlockCorners[j-1]]['gridPoint']]['x']
             y2 = self.gridPointData[time][self.cornerData[time][allBlockCorners[j-1]]['gridPoint']]['y']
             x3 = self.gridPointData[time][self.cornerData[time][allBlockCorners[j]]['gridPoint']]['x']
             y3 = self.gridPointData[time][self.cornerData[time][allBlockCorners[j]]['gridPoint']]['y']
             xVec1 = x1-x2
             yVec1 = y1-y2
             xVec2 = x3-x2
             yVec2 = y3-y2
             vecAngle = Common.angle(xVec1, yVec1, xVec2, yVec2)
             vecSign = xVec1*yVec2-xVec2*yVec1
             blockDirection += vecSign
         if math.copysign(1, blockDirection) != math.copysign(1, directionSign):
             blockCorners = blockCorners[::-1]
             
         previousBlockCorners = self.blockData[time][orderedBlocks[i-1]]['corners']
         startingCornerDistance = -1
         for corner in blockCorners:
             gridPoint = self.cornerData[time][corner]['gridPoint']
             for previousCorner in previousBlockCorners:
                 previousGridPoint = self.cornerData[time][previousCorner]['gridPoint']
                 xDistance = self.gridPointData[time][previousGridPoint]['x'] - self.gridPointData[time][gridPoint]['x']
                 yDistance = self.gridPointData[time][previousGridPoint]['y'] - self.gridPointData[time][gridPoint]['y']
                 distance = math.hypot(xDistance, yDistance)
                 if startingCornerDistance < 0 or distance < startingCornerDistance:
                     startingCornerDistance = distance
                     startingCorner = corner
                 
                 
         index = blockCorners.index(startingCorner)
         blockCorners = blockCorners[index:] + blockCorners[:index]
         newCorners += blockCorners
     return newCorners