Beispiel #1
0
    def placePoly(self, index):
        adjoin = self.polygons[index]
        # 是否垂直
        if self.vertical == True:
            ifr = packing.PackingUtil.getInnerFitRectangle(
                self.polygons[index], self.width, self.length)
        else:
            ifr = packing.PackingUtil.getInnerFitRectangle(
                self.polygons[index], self.length, self.width)
        differ_region = Polygon(ifr)

        for main_index in range(0, index):
            main = self.polygons[main_index]
            if self.NFPAssistant == None:
                nfp = NFP(main, adjoin).nfp
            else:
                nfp = self.NFPAssistant.getDirectNFP(main, adjoin)
            nfp_poly = Polygon(nfp)
            try:
                differ_region = differ_region.difference(nfp_poly)
            except:
                print('NFP failure, areas of polygons are:')
                self.showAll()
                for poly in main, adjoin:
                    print(Polygon(poly).area)
                self.showPolys([main] + [adjoin] + [nfp])
                print('NFP loaded from: ', self.NFPAssistant.history_path)

        differ = GeoFunc.polyToArr(differ_region)
        differ_index = self.getBottomLeft(differ)
        refer_pt_index = GeoFunc.checkTop(adjoin)
        GeoFunc.slideToPoint(self.polygons[index], adjoin[refer_pt_index],
                             differ[differ_index])
 def __init__(self,poly1,poly2,**kw):
     self.stationary=copy.deepcopy(poly1)
     self.sliding=copy.deepcopy(poly2)
     start_point_index=GeoFunc.checkBottom(self.stationary)
     self.start_point=[poly1[start_point_index][0],poly1[start_point_index][1]]
     self.locus_index=GeoFunc.checkTop(self.sliding)
     # 如果不加list则original_top是指针
     self.original_top=list(self.sliding[self.locus_index])
     GeoFunc.slideToPoint(self.sliding,self.sliding[self.locus_index],self.start_point)
     self.start=True # 判断是否初始
     self.nfp=[]
     self.rectangle=False
     if 'rectangle' in kw:
         if kw["rectangle"]==True:
             self.rectangle=True
     self.error=1
     self.main()
     if 'show' in kw:
         if kw["show"]==True:
             self.showResult()
     # 计算完成之后平移回原始位置
     GeoFunc.slideToPoint(self.sliding,self.sliding[self.locus_index],self.original_top)
Beispiel #3
0
 def MinimizeOverlap(self, oris, v, o):
     '''
     oris: 允许旋转的角度集合
     v: 多边形位置 实际已通过self.polygons得到
     o: 旋转的角度 后期可考虑把多边形封装成类
     '''
     n_polys = self.n_polys
     it = 0
     fitness = 999999
     while it < self.n_mo:
         Q = np.random.permutation(range(n_polys))
         for i in range(n_polys):
             curPoly = self.polygons[Q[i]]
             # 记录原始位置
             top_index = GeoFunc.checkTop(curPoly)
             top = list(curPoly[top_index])
             F = self.evaluate(Q[i])  # 以后考虑旋转
             print('F of',Q[i],':',F)
             v_i = self.CuckooSearch(Q[i])
             self.evaluate(Q[i], v_i)
             F_new = v_i.getF()
             print('new F of',Q[i],':',F)
             if F_new < F:
                 print('polygon', Q[i], v_i.getXY())
             else:
                 # 平移回原位置
                 GeoFunc.slideToPoint(curPoly, curPoly[top_index], top)
         fitness_new = self.evaluateAll()
         if fitness_new == 0:
             return it  # 可行解
         elif fitness_new < fitness:
             fitness = fitness_new
             it = 0
         self.updatePenalty()
         it = it+1
     return it
Beispiel #4
0
 def slidePolytoMe(self, poly):
     top_index = GeoFunc.checkTop(poly)
     top = poly[top_index]
     GeoFunc.slideToPoint(poly, top, self.getXY())