示例#1
0
    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
示例#2
0
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)
示例#3
0
    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
示例#4
0
    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
示例#5
0
    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
示例#6
0
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)