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)
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
def slidePolytoMe(self, poly): top_index = GeoFunc.checkTop(poly) top = poly[top_index] GeoFunc.slideToPoint(poly, top, self.getXY())