SubCAM在相差比較大的兩數之間插值

SubCAM在相差比較大的兩數之間插值

import numpy as npimport operatorimport osimport copyfrom matplotlib.font_manager import FontPropertiesfrom scipy.interpolate import lagrangeimport randomimport matplotlib.pyplot as pltimport math np.set_printoptions(suppress=True)# 把opt文件內的逗號變為空格#數據在我的百度雲資料庫txt文件,及opt文件np.set_printoptions(threshold=np.inf) #輸出全部矩陣不帶省略號random.seed(10)##########################################data = np.loadtxt(txt//SubCAM.txt)# data = data.astype(np.int64)#變為整數,易於觀看數字x1 = data[:,5]#x起點坐標x2 = data[:,9]#x終點坐標y1 = data[:,6]#y起y2 = data[:,10]#y起z1 = data[:,4]#IDpartz2 = data[:,8]#IDpartdiam = data[:,12]s1 = [a1 for a1 in range(1,len(x1)-1) if z1[a1]==z2[a1-1]!=-1 or z1[a1]!= z2[a1-1]]#id相同不等於0,或id不同# print(s1)lx = []#x1,x2相同的部分組成的列表lxqi = []lxzg = []for i1 in range(len(s1)-1): b1 = x1[s1[i1]:s1[i1+1]] b1 = b1.tolist() b2 = x2[s1[i1+1]-1]#s1[i1]相當於a1# b1 = b1 + [b2]#把與x2最後相連的一個數和x1拼接起來 b5 = z1[s1[i1]]#x,y起點id b1qi_id = [b5]+b1 +[b2] b6 = z2[s1[i1+1]-1]#x,y終點id b1zg_id = [b6] + b1+[b2] lx.append(b1) lxqi.append(b1qi_id) lxzg.append(b1zg_id)###################################################ly = []#y坐標以及管徑大小for i3 in range(len(s1)-1): b3 = y1[s1[i3]:s1[i3+1]] b3 = b3.tolist() b4 = y2[s1[i3+1]-1]#y最後一個不相等的數 b3 = b3 + [b4] dm = diam[s1[i3+1]-1] b3 = b3 + [dm]#加上管徑 ly.append(b3)######################################################帶有起點id的x坐標與y坐標合併for q1 in range(len(lxqi)): for q2 in range(len(ly[q1])): lxqi[q1].append(ly[q1][q2])#帶有終點id的x坐標與y坐標合併for p1 in range(len(lxzg)): for p2 in range(len(ly[p1])): lxzg[p1].append(ly[p1][p2])lxqi.sort(key=operator.itemgetter(0))#排序,只按照第一個索引大小排序tou = lxqilxzg.sort(key=operator.itemgetter(0)) wei = lxzg # #########################################toudeng = []weideng = []for dwei in wei: for i in range(len(tou)-1): if dwei[0] ==tou[i][0] and dwei[0]==tou[i+1][0]: toud = [dwei,tou[i],tou[i+1]] toudeng.append(toud)for dtou in tou: for i in range(len(wei)-1): if dtou[0] == wei[i][0] and dtou[0]==wei[i+1][0]: weid = [wei[i],wei[i+1],dtou] weideng.append(weid)# ###################################################datatoudeng = []dataweideng = []#去掉起點idfor i in range(len(toudeng)): a = toudeng[i][0][1::] b = toudeng[i][1][1::] c = toudeng[i][2][1::] d = [a]+[b]+[c] datatoudeng.append(d)for i in range(len(weideng)): a1 = weideng[i][0][1::] b1 = weideng[i][1][1::] c1 = weideng[i][2][1::] d1 = [a1]+[b1]+[c1] dataweideng.append(d1)# print(dataweideng)#####################################################################判斷管徑信息是否加進列表,若未加進則只為x,y坐標,為偶數for i in range(len(dataweideng)): a = dataweideng[i] assert len(a[0])%2==1 assert len(a[1])%2==1 assert len(a[2])%2==1for i in range(len(datatoudeng)): a = datatoudeng[i] assert len(a[0])%2==1 assert len(a[1])%2==1 assert len(a[2])%2==1finaldata = datatoudeng +dataweideng#未插值final = datatoudengprint(len(final))#####################################在相鄰兩坐標之間最大的兩點插值finalinsert = []for i in range(len(final)): a = np.array(final[i]) datab = [] for j in range(len(a)): b = np.array(a[j]) lenlist = len(b) halflen = lenlist//2 chalist = [] for k in range(halflen-1): cha =abs( b[k+1]-b[k]) chalist.append(cha) listmax = max(chalist) indexmax = chalist.index(listmax)# print(indexmax)# print(b) startx = b[indexmax] stopx = b[indexmax+1] starty = b[indexmax+halflen] stopy = b[indexmax+halflen+1] insertcount = (25-lenlist)//2 insertx = np.linspace(startx,stopx,insertcount)# print(insertx) f = lagrange([b[indexmax],b[indexmax+1]],[b[indexmax+halflen],b[indexmax+halflen+1]]) inserty = f(insertx) b = b.tolist() for filex in insertx[::-1][1:-1]: b.insert(indexmax+1,filex) for filey in inserty[::-1][1:-1]: b.insert((halflen+indexmax+len(insertx[::-1][1:-1])+1),filey) datab.append(b) finalinsert.append(datab)final = np.array(finalinsert)# print(final)# print(final.shape)#(484,3,21)# print(np.nanmax(final))# print(np.nanmin(final))# print(np.isnan(final).sum())//nan的總數########################x = final[:,:,0:10]y = final[:,:,10:20]############################旋轉def rotate(angle,valuex,valuey): rotatex = math.cos(angle)*valuex -math.sin(angle)*valuey rotatey = math.cos(angle)*valuey + math.sin(angle)* valuex return rotatex,rotateyrotatedata = []for i in range(0,360,3): x1,y1 = rotate(i,x,y) final[:,:,0:10] = x1 final[:,:,10:20] = y1 rotatedata.append(final)finaldata = []for file in rotatedata: for data in file: finaldata.append(data)finaldata = np.array(finaldata)# finaldata[:,:,-1] = finaldata[:,:,-1]*100# print(finaldata[0:10])# # print(finaldata.shape)max = np.nanmax(finaldata)min = np.nanmin(finaldata)# print(max)# print(min)finalnorm = (finaldata -min)/(max-min)print(finalnorm.shape)# print(np.nanmax(finalnorm))# print(np.nanmin(finalnorm))np.save(data//SubCAMinsert.npy,finalnorm)########################################### 可視化旋轉效果# final = finalnorm# # final = finaldata# for file in final:# lenth0 = len(file[0])-1# lenth1 = len(file[1])-1# lenth2 = len(file[2])-1# ban0 = lenth0 // 2# ban1 = lenth1 // 2# ban2 = lenth2 // 2# plt.plot(file[0][0:ban0],file[0][ban0:lenth0])# plt.plot(file[1][0:ban1],file[1][ban1:lenth1])# plt.plot(file[2][0:ban2],file[2][ban2:lenth2])# plt.show()

推薦閱讀:

UE4中的基於物理的著色(一)
圖靈宇宙漫遊指南
GAN在2017年實現四大突破,未來可能對計算機圖形學產生衝擊
Shader篇之GrabTexture

TAG:計算機圖形學 | 圖像處理 |