NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

hexMapLine.py (2910B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\mapView\hexagonal\hexMapLine.py
      2 from eve.client.script.ui.shared.mapView.hexagonal import hexUtil
      3 import geo2
      4 __author__ = 'fridrik'
      5 from carbonui.primitives.vectorlinetrace import VectorLineTrace
      6 
      7 class HexMapLine(VectorLineTrace):
      8     positionsUnscaled = None
      9     margin = 6
     10     lineColor = (1, 1, 1, 0)
     11 
     12     def ApplyAttributes(self, attributes):
     13         VectorLineTrace.ApplyAttributes(self, attributes)
     14 
     15     def AddPoints(self, posList, color = None, scaling = 1.0):
     16         posList = list(posList)
     17         totalPoints = len(posList)
     18         if totalPoints > 2:
     19             p1, p2 = self.ApplyLineMargin(posList[0], posList[1], self.margin, 0)
     20             posList[0] = p1
     21             p1, p2 = self.ApplyLineMargin(posList[-2], posList[-1], 0, self.margin)
     22             posList[-1] = p2
     23         elif totalPoints == 2:
     24             p1, p2 = self.ApplyLineMargin(posList[0], posList[1], self.margin, self.margin)
     25             posList[0] = p1
     26             posList[1] = p2
     27         for pos in posList:
     28             x, y = pos
     29             self.AddPoint((x * scaling, y * scaling), color or self.lineColor)
     30 
     31     def ApplyLineMargin(self, p1, p2, radius1, radius2):
     32         v = geo2.Vec2Subtract(p1, p2)
     33         vn = geo2.Vec2Normalize(v)
     34         l = geo2.Vec2Length(v)
     35         if not l:
     36             return (None, None)
     37         s = (radius1 + radius2) / l
     38         mp1 = geo2.Vec2Subtract(p1, geo2.Vec2Scale(vn, radius1))
     39         mp2 = geo2.Vec2Add(p2, geo2.Vec2Scale(vn, radius2))
     40         return (mp1, mp2)
     41 
     42     def GetCrossPointsWithLine(self, hexLine, stopOnFirstCross = True):
     43         crossPoints = []
     44         myVertexCount = len(self.renderObject.vertices)
     45         otherVertexCount = len(hexLine.renderObject.vertices)
     46         if myVertexCount < 2 or otherVertexCount < 2:
     47             return crossPoints
     48         for m_i in xrange(myVertexCount - 1):
     49             m_p1 = self.renderObject.vertices[m_i].position
     50             m_p2 = self.renderObject.vertices[m_i + 1].position
     51             for o_i in xrange(otherVertexCount - 1):
     52                 o_p1 = hexLine.renderObject.vertices[o_i].position
     53                 o_p2 = hexLine.renderObject.vertices[o_i + 1].position
     54                 if m_p1 == o_p1 or m_p1 == o_p2:
     55                     crossPoint = m_p1
     56                 elif m_p2 == o_p1 or m_p2 == o_p2:
     57                     crossPoint = m_p2
     58                 else:
     59                     try:
     60                         crossPoint = hexUtil.intersect_line_segments((m_p1, m_p2), (o_p1, o_p2))
     61                     except ValueError:
     62                         continue
     63 
     64                 if crossPoint:
     65                     crossPoints.append(crossPoint)
     66                     if stopOnFirstCross:
     67                         break
     68 
     69             if crossPoints and stopOnFirstCross:
     70                 break
     71 
     72         return crossPoints