def GetCrossPointsWithLine(self, hexLine, stopOnFirstCross=True): crossPoints = [] myVertexCount = len(self.renderObject.vertices) otherVertexCount = len(hexLine.renderObject.vertices) if myVertexCount < 2 or otherVertexCount < 2: return crossPoints for m_i in xrange(myVertexCount - 1): m_p1 = self.renderObject.vertices[m_i].position m_p2 = self.renderObject.vertices[m_i + 1].position for o_i in xrange(otherVertexCount - 1): o_p1 = hexLine.renderObject.vertices[o_i].position o_p2 = hexLine.renderObject.vertices[o_i + 1].position if m_p1 == o_p1 or m_p1 == o_p2: crossPoint = m_p1 elif m_p2 == o_p1 or m_p2 == o_p2: crossPoint = m_p2 else: try: crossPoint = hexUtil.intersect_line_segments( (m_p1, m_p2), (o_p1, o_p2)) except ValueError: continue if crossPoint: crossPoints.append(crossPoint) if stopOnFirstCross: break if crossPoints and stopOnFirstCross: break return crossPoints
def ScanForLineLineOverlaps(hexMap, startPenalty = 0, stopAtPenalty = None): penalty = startPenalty line_line_overlaps = [] done = [] lineIDs = hexMap.connectionsByID.keys() for connectionID1 in lineIDs: line1 = hexMap.connectionsByID[connectionID1] if not line1.renderObject.vertices: continue for connectionID2 in lineIDs: if connectionID1 == connectionID2: continue if (connectionID1, connectionID2) in done: continue line2 = hexMap.connectionsByID[connectionID2] if not line2.renderObject.vertices: continue done.append((connectionID1, connectionID2)) done.append((connectionID2, connectionID1)) p11 = line1.renderObject.vertices[0].position p12 = line1.renderObject.vertices[1].position p21 = line2.renderObject.vertices[0].position p22 = line2.renderObject.vertices[1].position try: crossPoint = hexUtil.intersect_line_segments((p11, p12), (p21, p22)) except ValueError: crossPoint = True if crossPoint: line_line_overlaps.append((connectionID1, connectionID2)) penalty += 1 if stopAtPenalty is not None and penalty >= stopAtPenalty: return (line_line_overlaps, penalty) return (line_line_overlaps, penalty)
def GetCrossPointsWithLine(self, hexLine, stopOnFirstCross = True): crossPoints = [] myVertexCount = len(self.renderObject.vertices) otherVertexCount = len(hexLine.renderObject.vertices) if myVertexCount < 2 or otherVertexCount < 2: return crossPoints for m_i in xrange(myVertexCount - 1): m_p1 = self.renderObject.vertices[m_i].position m_p2 = self.renderObject.vertices[m_i + 1].position for o_i in xrange(otherVertexCount - 1): o_p1 = hexLine.renderObject.vertices[o_i].position o_p2 = hexLine.renderObject.vertices[o_i + 1].position if m_p1 == o_p1 or m_p1 == o_p2: crossPoint = m_p1 elif m_p2 == o_p1 or m_p2 == o_p2: crossPoint = m_p2 else: try: crossPoint = hexUtil.intersect_line_segments((m_p1, m_p2), (o_p1, o_p2)) except ValueError: continue if crossPoint: crossPoints.append(crossPoint) if stopOnFirstCross: break if crossPoints and stopOnFirstCross: break return crossPoints
def GetVectorBetweenObjectsOnSameLevel(self, fromObjectID, toObjectID, parentObjectID, i=0): plotData = GetPlotDataForObject(parentObjectID, ignoreFixed=False) if fromObjectID in plotData: column1, row1 = plotData[fromObjectID] fromPos = hexUtil.hex_slot_center_position(column1, row1, self.isFlatTop, self.hexGridSize) elif self.parentMap and fromObjectID in self.parentMap.markersByID: fromPos = self.parentMap.markersByID[fromObjectID].unscaledPosition else: return if toObjectID in plotData: column2, row2 = plotData[toObjectID] toPos = hexUtil.hex_slot_center_position(column2, row2, self.isFlatTop, self.hexGridSize) elif self.parentMap and toObjectID in self.parentMap.markersByID: toPos = self.parentMap.markersByID[toObjectID].unscaledPosition else: return diffVec = geo2.Vec2Subtract(toPos, fromPos) diffVec = geo2.Vec2Scale(diffVec, 100000000000.0) cornerPoints = [] for i in xrange(6): if self.isFlatTop: outlineRad = self.width * 0.5 angle = 2.0 * math.pi / 6.0 * i else: outlineRad = self.height * 0.5 angle = 2.0 * math.pi / 6.0 * (i + 0.5) x_i = outlineRad * math.cos(angle) y_i = outlineRad * math.sin(angle) cornerPoints.append((x_i, y_i)) for i in xrange(6): p1 = cornerPoints[i] p2 = cornerPoints[i - 1] crossPoint = hexUtil.intersect_line_segments((p1, p2), ((0.0, 0.0), diffVec)) if crossPoint: return crossPoint
def GetVectorBetweenObjectsOnSameLevel(self, fromObjectID, toObjectID, parentObjectID, i = 0): plotData = GetPlotDataForObject(parentObjectID, ignoreFixed=False) if fromObjectID in plotData: column1, row1 = plotData[fromObjectID] fromPos = hexUtil.hex_slot_center_position(column1, row1, self.isFlatTop, self.hexGridSize) elif self.parentMap and fromObjectID in self.parentMap.markersByID: fromPos = self.parentMap.markersByID[fromObjectID].unscaledPosition else: return if toObjectID in plotData: column2, row2 = plotData[toObjectID] toPos = hexUtil.hex_slot_center_position(column2, row2, self.isFlatTop, self.hexGridSize) elif self.parentMap and toObjectID in self.parentMap.markersByID: toPos = self.parentMap.markersByID[toObjectID].unscaledPosition else: return diffVec = geo2.Vec2Subtract(toPos, fromPos) diffVec = geo2.Vec2Scale(diffVec, 100000000000.0) cornerPoints = [] for i in xrange(6): if self.isFlatTop: outlineRad = self.width * 0.5 angle = 2.0 * math.pi / 6.0 * i else: outlineRad = self.height * 0.5 angle = 2.0 * math.pi / 6.0 * (i + 0.5) x_i = outlineRad * math.cos(angle) y_i = outlineRad * math.sin(angle) cornerPoints.append((x_i, y_i)) for i in xrange(6): p1 = cornerPoints[i] p2 = cornerPoints[i - 1] crossPoint = hexUtil.intersect_line_segments((p1, p2), ((0.0, 0.0), diffVec)) if crossPoint: return crossPoint
def ScanForLineLineOverlaps(hexMap, startPenalty=0, stopAtPenalty=None): penalty = startPenalty line_line_overlaps = [] done = [] lineIDs = hexMap.connectionsByID.keys() for connectionID1 in lineIDs: line1 = hexMap.connectionsByID[connectionID1] if not line1.renderObject.vertices: continue for connectionID2 in lineIDs: if connectionID1 == connectionID2: continue if (connectionID1, connectionID2) in done: continue line2 = hexMap.connectionsByID[connectionID2] if not line2.renderObject.vertices: continue done.append((connectionID1, connectionID2)) done.append((connectionID2, connectionID1)) p11 = line1.renderObject.vertices[0].position p12 = line1.renderObject.vertices[1].position p21 = line2.renderObject.vertices[0].position p22 = line2.renderObject.vertices[1].position try: crossPoint = hexUtil.intersect_line_segments((p11, p12), (p21, p22)) except ValueError: crossPoint = True if crossPoint: line_line_overlaps.append((connectionID1, connectionID2)) penalty += 1 if stopAtPenalty is not None and penalty >= stopAtPenalty: return (line_line_overlaps, penalty) return (line_line_overlaps, penalty)