python+基本3D顯示

    想要將雙目照片合成立體圖實現三維重建,徹底沒有頭緒。可是對三維理解是必須的。因此將之前在單片機上運行的 3D畫圖 程序移植到python上。效果以下:html

    沒有用numpy、openGL等,只用了純math庫,這樣移植起來很快,只須要將原來的C代碼簡單修改就能夠了,但代價是效率很低,後面加上圖片旋轉後更爲明顯,速度急劇降低,功耗急劇上升,臺式機帶起來速度都不怎麼樣,更別說運行在JetsonTx2開發板上了。python

   理論上來講,只要實現了裏面的畫點函數和畫線函數,就能夠快速移植到包括 Micropython在內的python環境中了,個人好幾塊Mycropython板子不知扔哪去了,以前的編程環境也很差找了,屏幕還須要現插,就不實驗了。算法

   忽然發現我還有塊荔枝派的堪智K210開發板,上面刷了Micropython環境,等有空移植試試。編程

    整個程序是在之前的 3D旋轉立方體 的C代碼上移植過來的,新增長了任意中文字符顯示函數和圖片顯示函數,圖片顯示使用了opencv。數組

    程序中,最核心的處理部分就是如下幾點:緩存

gMAT=structure_3D()    			      #//構建單位矩陣
    gMAT=Translate3D(gMAT,-(width/2),-(height/2),0);  #//平移變換矩陣
    gMAT=Scale_3D(gMAT,size,size,size);		      #//比例變換矩陣
    gMAT=Rotate_3D(gMAT,ax,ay,az);	              #//旋轉變換矩陣

    Point1=vector_matrix_MULTIPLY(Point0,gMAT)   #座標點矩陣變換,Point0即爲當前點的三維座標
    PointDis=PerProject(Point1,0,0)              #三維轉二維計算

 而後按照上面的順序,將每一個點帶入Point0中,進行計算後就能夠得出二維座標下三維數據應該所在的座標。微信

    程序由兩個文檔組成,Transform.py 和 main.py 兩部分,第一部分使用了pygame庫,若有須要請自行更改實現爲其餘顯示庫。第二部分爲展現部分,裏面還實現了圖片3D旋轉的程序,使用了opencv庫,若有須要可屏蔽或是換爲其餘庫來實現圖片的讀取和計算。ide

    程序中實現的3D顯示包含:立方體,圓,取模字符,任意中文字符和彩色圖片的簡單3D顯示。因爲沒有進行更高級的三維處理,因此點陣類目標(字符和圖片)會出現近處的點或者放大必定倍數後有空隙的狀況,若有須要請自行進行更高級的算法處理,好比將畫點的大小與三維轉換算法結合起來。函數

    程序中任意中文文本的顯示使用到了HZK16和HZK32兩種字庫,注意將路徑修改成本身字庫的路徑下。圖片顯示中也須要修改圖片的路徑。測試

    Transform.py 內容以下:

 1 from math import *
 2 import pygame  3 from pygame.locals import *
 4 import time  5 import sys  6 import binascii  #任意中文字符時使用到此庫
 7 
 8 '''
 9 * 文檔: Transform3D.py  10 * 做者: 執念執戰  11 * QQ:572314251  12 * 微信:zhinianzhizhan  13 * 原名:王成程  14 * 時間:2019-6  15 * 隨夢,隨心,隨願,恆執念,爲夢執戰,執戰蒼天!  16 *  17 *  18 *  19 * 說明: 本文檔是由以前的能夠在單片機上實現3D顯示的程序修改而來  20 * 直接運行時須要math、time、sys、pygame、binascii 等庫的支持  21 * 3D算法從底層一步一步實現  22 * 全部的算法都是使用基本的math庫算法實現,沒有使用高級的numpy矩陣算法  23 * 因此理論上來講,只要移植好Gui_Point()函數和GUI_Line()函數,去掉須要pygame庫支持的部分,  24 * 就能夠移植到任意Python環境中(包括能夠在單片機上運行的MicroPython環境中),只不過速度有差距  25 *  26 * 轉載或使用情註明出處  27 '''
 28 
 29 
 30 
 31 FOCAL_DISTANCE = 512 #透視模型 
 32 '''基於透視投影的基本模型'''
 33 
 34 
 35 
 36 
 37 SCREEN_X_MAX = 800 #屏幕的寬和高
 38 SCREEN_Y_MAX = 600
 39 
 40 BLACK=(0,0,0)  41 WHITE=(255,255,255)  42 RED=(255,0,0)  43 GREEN=(0,255,0)  44 BLUE=(0,0,255)  45 
 46 ForeColor = RED #前景色和背景色
 47 BackColor = BLACK  48 #Screen=[[0 for i in range(SCREEN_X_MAX)] for j in range(SCREEN_Y_MAX)] #屏幕緩存
 49 
 50 screen = pygame.display.set_mode((SCREEN_X_MAX,SCREEN_Y_MAX))  51 
 52 def Gui_Point(x,y,color):  53     '''|**********************************************************  54  |**函數:Gui_Point  55  |**功能:畫點函數  56  |**說明:x,y:座標點  57  | color:顏色  58  | 若想支持其餘Python環境,須要完成本函數的移植  59  |  60  |  61  |**做者: 執念執戰  62  |**時間:2019-6-3  63  |*********************************************************'''
 64     #Screen[(int)(y)][(int)(x)]=color
 65     pygame.draw.line(screen,color,(x,y),(x+1,y),2)  66 def GUI_Line(xstart,ystart,xend,yend,color):  67     '''|**********************************************************  68  |**GUI_Line  69  |**功能:畫線函數  70  |**說明:xstart,ystart:起始座標點  71  | xend,yend:結束座標點  72  | color:顏色  73  | 若想支持其餘Python環境,須要完成本函數的移植  74  |  75  |  76  |**做者: 執念執戰  77  |**時間:2019-6-3  78  |*********************************************************'''
 79     pygame.draw.line(screen,color,(xstart,ystart),(xend,yend),2)  80  
 81 
 82 
 83 class zuobiaostruct:  84     '''座標結構體'''
 85     def __init__(self):  86         self.x=0  87         self.y=0  88         self.z=0  89 
 90 Cube_Size = 16.0 #立方體基本邊長
 91 Cube=[zuobiaostruct() for i in range(8)]  92 
 93 '''
 94 至關於正方形的頂點座標。  95 修改長度能夠改成長方形,或是修改邊長等。  96 固然,也可修改頂點座標爲任意數據,而後對頂點座標進行3D運算,最後按照順序在須要的頂點之間畫線,就能生成其餘3D圖形  97 
 98 '''
 99 Cube[0].x=0.0
100 Cube[0].y=0.0
101 Cube[0].z=0.0
102 
103 Cube[1].x=Cube_Size 104 Cube[1].y=0.0
105 Cube[1].z=0.0
106 
107 Cube[2].x=0.0
108 Cube[2].y=Cube_Size 109 Cube[2].z=0.0
110 
111 Cube[3].x=Cube_Size 112 Cube[3].y=Cube_Size 113 Cube[3].z=0.0
114 
115 Cube[4].x=0.0
116 Cube[4].y=0.0
117 Cube[4].z=Cube_Size 118 
119 Cube[5].x=Cube_Size 120 Cube[5].y=0.0
121 Cube[5].z=Cube_Size 122 
123 Cube[6].x=0.0
124 Cube[6].y=Cube_Size 125 Cube[6].z=Cube_Size 126 
127 Cube[7].x=Cube_Size 128 Cube[7].y=Cube_Size 129 Cube[7].z=Cube_Size 130 '''Cube=[[0,0,0], 131  [16,0,0], 132  [0,16,0], 133  [16,16,0], 134 
135  [0,0,16], 136  [16,0,16], 137  [0,16,16], 138  [16,16,16]] 139 '''
140 
141 
142 
143 
144 
145         
146 '''
147 -**************************************************************- 148  3D座標運算部分 149 -**************************************************************- 150 '''
151         
152 
153 
154 
155 def MATRIX_copy(sourceMAT): 156     '''|********************************************************** 157  |**函數:MATRIX_copy 158  |**功能:矩陣拷貝 159  |**說明: sourceMAT[4][4](源矩陣,source matrix), 160  | targetMAT[4][4] (目標矩陣 target matrix) 161  | 邊學邊寫 162  |**做者: 執念執戰 163  |**時間:2015-11-29,21:52 164  |*********************************************************'''
165     targetMAT=[[0.0 for i in range(4)] for n in range(4)] 166     for a in range(4): 167         for b in range(4): 168             targetMAT[a][b]=sourceMAT[a][b] 169     return targetMAT 170 
171 ''
172 
173 def MATRIX_multiply(MAT1,MAT2): 174     '''|******************************************************* 175  |**函數:MATRIX_multiply 176  |**功能:矩陣相乘 177  |**說明: MAT1[4][4](矩陣1),MAT2[4][4](矩陣2), 178  | newMAT[4][4] (結果矩陣 ) 179  | 邊學邊寫 180  |**做者: 執念執戰 181  |**時間:2015-11-29 182  |**********************************************************'''
183     newMAT=[[0.0 for i in range(4)] for n in range(4)] 184     for a in range(4): 185         for b in range(4): 186             newMAT[a][b]=MAT1[a][0]*MAT2[0][b]+MAT1[a][1]*MAT2[1][b]+MAT1[a][2]*MAT2[2][b]+MAT1[a][3]*MAT2[3][b] 187     return newMAT 188  
189    
190 
191 def vector_matrix_MULTIPLY(Source,MAT): 192     '''********************************************************** 193  |**函數: vector_matrix_MULTIPLY 194  |**功能:矢量與矩陣相乘 195  |**說明: Source(源矢量座標) MAT[][](變換座標) 196  | 邊學邊寫 197  |**做者: 執念執戰 198  |**時間:2015-11-29 199  |***********************************************************''' 
200     Result=zuobiaostruct() 201     Result.x=Source.x*MAT[0][0]+Source.y*MAT[1][0]+Source.z*MAT[2][0]+MAT[3][0] 202     Result.y=Source.x*MAT[0][1]+Source.y*MAT[1][1]+Source.z*MAT[2][1]+MAT[3][1] 203     Result.z=Source.x*MAT[0][2]+Source.y*MAT[1][2]+Source.z*MAT[2][2]+MAT[3][2] 204     return Result 205  
206     
207 
208 def structure_3D(): 209     '''********************************************************** 210  |**函數: structure_3D 211  |**功能:構造單位矩陣 212  |**說明: 將一個數組構形成單位矩陣(對角線上全爲1,其餘爲0) 213  | 邊學邊寫 214  |**做者: 執念執戰 215  |**時間:2015-11-29 216  |*********************************************************'''
217     MAT=[[0.0 for i in range(4)] for i  in range(4)] 218     MAT[0][0]=1.0
219     MAT[0][1]=0.0
220     MAT[0][2]=0.0
221     MAT[0][3]=0.0    #// 1 0 0 0 
222     
223     MAT[1][0]=0.0
224     MAT[1][1]=1.0
225     MAT[1][2]=0.0
226     MAT[1][3]=0.0   #// 0 1 0 0
227     
228     MAT[2][0]=0.0
229     MAT[2][1]=0.0
230     MAT[2][2]=1.0
231     MAT[2][3]=0.0
232                     #// 0 0 1 0
233     MAT[3][0]=0.0
234     MAT[3][1]=0.0
235     MAT[3][2]=0.0
236     MAT[3][3]=1.0
237                     #// 0 0 0 1 
238     
239     return MAT 240     
241     
242   
243 def Translate3D(MAT,tx, ty, tz): 244     '''******************************************************** 245  |**函數: Translate3D 246  |**功能:平移變換矩陣 247  |**說明: 1:tx,ty,tz 爲平移參數 248  | 2:當爲邊長的一半的倒數時,圖像繞着本身旋轉,即原點在中心 249  | 250  | 邊學邊寫 251  |**做者: 執念執戰 252  |**時間:2015-11-29 253  |**********************************************************''' 
254     tMAT=[[0.0 for i in range(4)] for i  in range(4)] 255     tMAT[0][0]=1
256     tMAT[0][1]=0 257     tMAT[0][2]=0 258     tMAT[0][3]=0    #// 1 0 0 tx
259     
260     tMAT[1][0]=0 261     tMAT[1][1]=1
262     tMAT[1][2]=0 263     tMAT[1][3]=0    #// 0 1 0 ty
264     
265     tMAT[2][0]=0 266     tMAT[2][1]=0 267     tMAT[2][2]=1
268     tMAT[2][3]=0    #// 0 0 1 tz
269     
270     tMAT[3][0]=tx 271     tMAT[3][1]=ty 272     tMAT[3][2]=tz 273     tMAT[3][3]=1;    #// 0 0 0 1
274 
275     return MATRIX_multiply(MAT,tMAT)#//相乘
276 
277 
278 
279 def Scale_3D( MAT, sx, sy, sz): 280     '''******************************************************* 281  |**函數: Scale_3D 282  |**功能:比例(scale)變換矩陣 283  |**說明: 1:相對於原點上的比例變換 284  | 2:sx,sy,sz 是對應軸上的縮放量 285  | 3:矩陣根據三個比例進行比例變換 286  | 邊學邊寫 287  |**做者: 執念執戰 288  |**時間:2015-11-30,7:45 289  |*********************************************************'''
290     tMAT=[[0.0 for i in range(4)] for i  in range(4)] 291     tMAT[0][0]=sx 292     tMAT[0][1]=0 293     tMAT[0][2]=0 294     tMAT[0][3]=0    #// sx0 0 0 
295     tMAT[1][0]=0 296     tMAT[1][1]=sy 297     tMAT[1][2]=0 298     tMAT[1][3]=0    #// 0 sy0 0
299     tMAT[2][0]=0 300     tMAT[2][1]=0 301     tMAT[2][2]=sz 302     tMAT[2][3]=0    #// 0 0 sz0
303     tMAT[3][0]=0 304     tMAT[3][1]=0 305     tMAT[3][2]=0 306     tMAT[3][3]=1    #// 0 0 0 1
307     return MATRIX_multiply(MAT,tMAT) # //相乘
308 
309 
310 
311 
312 
313 
314 def Rotate_3D( MAT, ax, ay, az): 315     '''**********************************************************/ 316  |**函數: Rotate_3D 317  |**功能:旋轉變換矩陣 318  |**說明: 1:繞z軸旋轉az度角 319  | 2:az爲旋轉的角度量,賦正值爲順時針轉 320  | 3:矩陣MAT根據AZ度角進行旋轉變換 321  | 邊學邊寫 322  |**做者: 執念執戰 323  |**時間:2015-11-30,7:45 324  |**********************************************************'''
325     MAT1=[[0.0 for i in range(4)] for i  in range(4)] 326     MAT2=[[0.0 for i in range(4)] for i  in range(4)] 327     MATx=[[0.0 for i in range(4)] for i  in range(4)] 328     MATy=[[0.0 for i in range(4)] for i  in range(4)] 329     MATz=[[0.0 for i in range(4)] for i  in range(4)] 330 
331     ax=(3.1415926*ax)/180.0    #//角度轉換爲弧度量
332     ay=(3.1415926*ay)/180.0
333     az=(3.1415926*az)/180.0
334     '''/*****************************繞x軸旋轉********************************************/'''
335 
336     MATx[0][0]=1
337     MATx[0][1]=0 338     MATx[0][2]=0 339     MATx[0][3]=0    #//1 0 0 0
340     MATx[1][0]=0 341     MATx[1][1]=cos(ax) 342     MATx[1][2]=-sin(ax) 343     MATx[1][3]=0    #//0 cos(ax) -sin(ax) 0
344     MATx[2][0]=0 345     MATx[2][1]=sin(ax) 346     MATx[2][2]=cos(ax) 347     MATx[2][3]=0    #//0 sin(ax) cos(ax) 0 
348     MATx[3][0]=0 349     MATx[3][1]=0 350     MATx[3][2]=0 351     MATx[3][3]=1    #//0 0 0 1
352 
353     '''/*****************************繞y軸旋轉********************************************/'''
354     MATy[0][0]=cos(ay) 355     MATy[0][1]=0 356     MATy[0][2]=sin(ay) 357     MATy[0][3]=0    #//cos(ay) 0 sin(ay) 0
358     MATy[1][0]=0 359     MATy[1][1]=1
360     MATy[1][2]=0 361     MATy[1][3]=0    #// 0 1 0 0
362     MATy[2][0]=-sin(ay) 363     MATy[2][1]=0 364     MATy[2][2]=cos(ay) 365     MATy[2][3]=0    #// -sin(ay) 0 cos(ay) 0
366     MATy[3][0]=0 367     MATy[3][1]=0 368     MATy[3][2]=0 369     MATy[3][3]=1    #// 0 0 0 1
370 
371 
372     '''/*****************************繞z軸旋轉********************************************/'''
373     MATz[0][0]=cos(az) 374     MATz[0][1]=-sin(az) 375     MATz[0][2]=0 376     MATz[0][3]=0    #//cos(az) -sin(az) 0 0
377     MATz[1][0]=sin(az) 378     MATz[1][1]=cos(az) 379     MATz[1][2]=0 380     MATz[1][3]=0    #// sin(az) cos(az) 0 0
381     MATz[2][0]=0 382     MATz[2][1]=0 383     MATz[2][2]=1
384     MATz[2][3]=0    #// 0 0 1 0
385     MATz[3][0]=0 386     MATz[3][1]=0 387     MATz[3][2]=0 388     MATz[3][3]=1    #// 0 0 0 1
389 
390     MAT1=MATRIX_multiply(MAT,MATx) 391     MAT2=MATRIX_multiply(MAT1,MATy) 392     return MATRIX_multiply(MAT2,MATz) 393     #return MAT 
394 
395 '''    
396 /********************************************************************************/ 397 /*------------------------------------------------------------------------------*/ 398 /* 投影算法 三維轉二維的相關函數 */ 399 /*------------------------------------------------------------------------------*/ 400 /********************************************************************************/ 401 '''
402     
403 
404 
405 
406 
407 def OrtProject(Space): 408     '''******************************************************** 409  |**函數: OrtProject 410  |**功能:透視投影(Perspective projection) 411  |**說明:簡單透視 412     
413  | 邊學邊寫 414  |**做者: 執念執戰 415  |**時間:2015-11-30 416  |*********************************************************'''
417     Screen=zuobiaostruct() 418     Screen.x=(int)(Space.x) 419     Screen.y=(int)(Space.y) 420     
421     return Screen; 422         
423     
424 
425 def PerProject( Space, XO, YO): 426     '''**********************************************************/ 427  |**函數: PerProject 428  |**功能:透視投影(Perspective projection) 429  |**說明:XO,YO爲投影后的圖形中心的屏幕座標 430     
431  | 邊學邊寫 432  |**做者: 執念執戰 433  |**時間:2015-11-30 434  |********************************************************'''
435 
436     Screen=zuobiaostruct() 437     if (Space.z==0): 438         Space.z=0.01        #//被除數不能爲零
439     Screen.x=(int)(FOCAL_DISTANCE*Space.x /(Space.z+FOCAL_DISTANCE)+XO) 440     Screen.y=(int)(FOCAL_DISTANCE*Space.y /(Space.z+FOCAL_DISTANCE)+YO) 441     return Screen 442 
443 
444 
445 
446 
447 
448 
449    
450 
451     
452 
453 
454 
455 
456 
457 def RateCube_size( sx, sy, sz, x,y,color,X_Size=1,Y_Size=1,Z_Size=1, ratio=1): 458     '''**********************************************************/ 459  |**函數: RateCube_size 460  |**功能:顯示3D的立方體 461  |**說明:sx,sy,sz :角度值 462  | x,y: 欲顯示的座標位置 463  | X_Size,Y_Size,Z_Size:立方體的三個邊長,默認爲1 464  | ratio:放大比例 465     
466  | 467  |**做者: wcc 執念執戰 468  |**時間:2019-6-3 469  |********************************************************'''
470     gMAT=[[0.0 for i in range(4)]  for n in range(4)] 471     temp=zuobiaostruct() 472     Cube_dis=[zuobiaostruct() for i in range(8)] 473 
474         
475 
476     
477     gMAT=structure_3D()                  #//構造爲單位矩陣
478     gMAT=Translate3D(gMAT,-10,-8,-8)     #//平移變換矩陣,當爲邊長的一半的倒數時,圖像繞着本身旋轉,即原點在中心
479     gMAT=Scale_3D(gMAT,X_Size*ratio,Y_Size*ratio,Z_Size*ratio)  #//比例變換矩陣
480     gMAT=Rotate_3D(gMAT,sx,sy,sz)          #//旋轉變換矩陣
481     gMAT=Translate3D(gMAT,8,8,8)        #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z
482                                                           #// y:上下調動位置 ,具體根據實際修改
483 
484     
485     for i in range(8): 486         
487 
488         temp=vector_matrix_MULTIPLY(Cube[i],gMAT)# //矢量與矩陣相乘
489         Cube_dis[i]=PerProject(temp,0,0)# //正射投影 xo,yo:position
490         Cube_dis[i].x+=x 491         Cube_dis[i].y+=y 492         #Cube_dis[i].x+=SCREEN_X_MAX
493         #Cube_dis[i].y+=SCREEN_Y_MAX
494 
495 
496     '''將目標頂點按照預期鏈接起來'''
497     GUI_Line(Cube_dis[0].x,Cube_dis[0].y,Cube_dis[1].x,Cube_dis[1].y,color) 498     GUI_Line(Cube_dis[0].x,Cube_dis[0].y,Cube_dis[2].x,Cube_dis[2].y,color) 499     GUI_Line(Cube_dis[3].x,Cube_dis[3].y,Cube_dis[1].x,Cube_dis[1].y,color) 500     GUI_Line(Cube_dis[3].x,Cube_dis[3].y,Cube_dis[2].x,Cube_dis[2].y,color) 501     
502     
503     GUI_Line(Cube_dis[0+4].x,Cube_dis[0+4].y,Cube_dis[1+4].x,Cube_dis[1+4].y,color) 504     GUI_Line(Cube_dis[0+4].x,Cube_dis[0+4].y,Cube_dis[2+4].x,Cube_dis[2+4].y,color) 505     GUI_Line(Cube_dis[3+4].x,Cube_dis[3+4].y,Cube_dis[1+4].x,Cube_dis[1+4].y,color) 506     GUI_Line(Cube_dis[3+4].x,Cube_dis[3+4].y,Cube_dis[2+4].x,Cube_dis[2+4].y,color) 507     
508     
509     GUI_Line(Cube_dis[0].x,Cube_dis[0].y,Cube_dis[0+4].x,Cube_dis[0+4].y,color) 510     GUI_Line(Cube_dis[1].x,Cube_dis[1].y,Cube_dis[1+4].x,Cube_dis[1+4].y,color) 511     GUI_Line(Cube_dis[2].x,Cube_dis[2].y,Cube_dis[2+4].x,Cube_dis[2+4].y,color) 512     GUI_Line(Cube_dis[3].x,Cube_dis[3].y,Cube_dis[3+4].x,Cube_dis[3+4].y,color) 513 
514 
515 
516 
517 
518 Last_flg1=False 519 Last_flg2=False 520 Last_x1=0 521 Last_y1=0 522 
523 Last_x2=0 524 Last_y2=0 525 
526 
527 def Rotatecircle( ax, ay, az,x, y,Z_Size, r, color ): 528     '''**********************************************************/ 529  |**函數: Rotatecircle 530  |**功能:顯示3D的圓 531  |**說明:sx,sy,sz :角度值 532  | x,y: 欲顯示的座標位置 533  | Z_Size:距旋轉軸的距離 534  | r:半徑 535  | color:顏色 536     
537  | 538  |**做者: wcc 執念執戰 539  |**時間:2019-6-3 540  |********************************************************'''
541     
542     global Last_flg1 543     global Last_flg2 544     global Last_x1,Last_y1,Last_x2,Last_y2 545     
546     gMAT=[[0.0 for i in range(4)]  for n in range(4)] 547     Point0=zuobiaostruct() 548     Point3=zuobiaostruct() 549 
550     Point1=zuobiaostruct() 551     PointDis=zuobiaostruct() 552 
553     gMAT=structure_3D()                             #//構造單位矩陣
554     gMAT=Translate3D(gMAT,-r,0,0)          #//平移變換矩陣
555     gMAT=Scale_3D(gMAT,3,3,3)                     #//比例變換矩陣
556     gMAT=Rotate_3D(gMAT,ax,ay,az)                 #//旋轉變換矩陣
557     #gMAT=Translate3D(gMAT,-r/2,-r/2,-r/2) #//平移變換矩陣 
558 
559     
560 
561     for i in range(0,r+r+1): 562       
563         Point0.x=i 564         Point0.y=r-(r-sqrt(r*r-(r-i)*(r-i))) 565         Point0.z=0#Point0.z+Z_Size
566         Point3.x=i 567         Point3.y=r-(r+sqrt(r*r-(r-i)*(r-i))) 568         Point3.z=0#Point3.z+Z_Size
569 
570 
571         Point1=vector_matrix_MULTIPLY(Point0,gMAT)    #//矢量與矩陣相乘 
572         PointDis=PerProject(Point1,0,0)                    #//映射投影
573         #PointDis.x+=SCREEN_X_MAX
574         #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線,
575                                     #// 還要注意圖像不要大到超過兩個屏
576                                                                        
577         if Last_flg1 == True and  i!=0: 578             GUI_Line(PointDis.x+x,PointDis.y+y,Last_x1+x,Last_y1+y,color) #鏈接上次的保存,避免點的空隙過大
579         else: 580             GUI_Line(PointDis.x+x,PointDis.y+y,PointDis.x+1+x,PointDis.y+1+y,color) 581         Last_x1= PointDis.x 582         Last_y1= PointDis.y 583         Last_flg1=True 584 
585         Point1=vector_matrix_MULTIPLY(Point3,gMAT)    #//矢量與矩陣相乘
586         PointDis=PerProject(Point1,0,0)            #//映射投影
587 
588         #PointDis.x+=SCREEN_X_MAX
589        # PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線,
590         if Last_flg2 == True and  i!=0: 591             GUI_Line(PointDis.x+x,PointDis.y+y,Last_x2+x,Last_y2+y,color)#鏈接上次的保存,避免點的空隙過大
592         else: 593             GUI_Line(PointDis.x+x,PointDis.y+y,PointDis.x+1+x,PointDis.y+1+y,color) 594         Last_x2= PointDis.x 595         Last_y2= PointDis.y 596         Last_flg2=True 597         
598 
599 SETCH32X29=[[0 for i in range(128)] for i in range(4)] 600 
601 '''// 設置宋體小二常規, 參數中的其餘選項爲縱向取模,字節倒序,保留,任什麼時候候都加零'''
602 ''' 本字符集爲 寬29 高 32的字符,使用時注意 32/8'''
603     
604 '''
605 /*-- 執--*/ 606 /*-- 29 x32 ---*/ 607 '''
608 SETCH32X29[0]=(0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFC,0x04,0x80,0x80,0x00,0x00,0x00,0xFC, 609 0xFC,0xFC,0x08,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, 610 0x81,0x81,0x81,0xFF,0xFF,0xFF,0x61,0x23,0xB3,0x93,0x82,0x82,0xFF,0xFF,0xFF,0x02, 611 0x02,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x01,0x01, 612 0xFF,0xFF,0xFF,0x00,0x00,0x80,0xE0,0xF9,0x7F,0x1F,0x07,0x0E,0x1E,0x1C,0x1F,0x7F, 613 0xFF,0xF0,0x80,0xC0,0xF8,0xF8,0x00,0x00,0x00,0x02,0x02,0x06,0x0E,0x0F,0x0F,0x0B, 614 0x0C,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03, 615 0x07,0x07,0x07,0x00, 616 ) 617 
618 '''/*-- 念 --*/ 619 /*-- 29 x32 ---*/'''
620 SETCH32X29[1]=( 621 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFC,0xBE,0x1E,0x3C, 622 0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x30, 623 0x18,0x18,0x0C,0x26,0x27,0x23,0x21,0x21,0x20,0x21,0x27,0x2F,0x2F,0x24,0xE0,0xF1, 624 0xF1,0x73,0x27,0x06,0x0E,0x0E,0x0C,0x0C,0x04,0x00,0x00,0x00,0x80,0xC0,0xF0,0xF8, 625 0x78,0x00,0xFC,0xFC,0xFC,0x0B,0x0F,0x3E,0x3C,0x1E,0x07,0x07,0x03,0xE0,0xE0,0x88, 626 0x38,0xF8,0xF0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x07, 627 0x07,0x07,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x07,0x07,0x07,0x02,0x00,0x01, 628 0x01,0x00,0x00,0x00, ) 629 
630 '''/*-- 執--*/ 631 /*-- 29 x32 ---*/'''
632 SETCH32X29[2]=( 633 
634 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFC,0x04,0x80,0x80,0x00,0x00,0x00,0xFC, 635 0xFC,0xFC,0x08,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, 636 0x81,0x81,0x81,0xFF,0xFF,0xFF,0x61,0x23,0xB3,0x93,0x82,0x82,0xFF,0xFF,0xFF,0x02, 637 0x02,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x01,0x01, 638 0xFF,0xFF,0xFF,0x00,0x00,0x80,0xE0,0xF9,0x7F,0x1F,0x07,0x0E,0x1E,0x1C,0x1F,0x7F, 639 0xFF,0xF0,0x80,0xC0,0xF8,0xF8,0x00,0x00,0x00,0x02,0x02,0x06,0x0E,0x0F,0x0F,0x0B, 640 0x0C,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03, 641 0x07,0x07,0x07,0x00, ) 642 '''/*-- 戰 --*/ 643 /*-- 29 x32 ---*/'''
644 SETCH32X29[3]=( 645 
646 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0x08,0x00,0x00,0x80,0x80,0x80,0x00, 647 0xFE,0xFE,0xFC,0x04,0x08,0x18,0x70,0xF0,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,0xC0, 648 0xC0,0x80,0x80,0xFF,0xFF,0xFF,0x81,0x81,0xC9,0xC9,0xC9,0x89,0x0D,0x0F,0xFF,0xFF, 649 0xF4,0x04,0x04,0xC4,0xF6,0xF7,0x63,0x66,0x04,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x80, 650 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xC3,0xFF,0x7F,0xFC,0xFF, 651 0xCF,0x07,0x01,0xF0,0xF0,0x00,0x00,0x00,0x00,0x07,0x03,0x03,0x00,0x00,0x00,0x00, 652 0x00,0x08,0x0B,0x0F,0x07,0x06,0x03,0x01,0x01,0x00,0x00,0x00,0x01,0x03,0x07,0x07, 653 0x0F,0x0F,0x08,0x00,) 654 
655 
656 
657 
658 
659 
660 
661 
662 
663 
664 def Show3DCharXxY(dp,dp_x,dp_y,ax,ay,az,x,y,Z_Size,color): 665     '''**********************************************************/ 666  |**函數: Show3DCharXxY 667  |**功能:顯示3D字體,須要本身取模,支持任意python環境 668  |**說明:dp:字體數組的名稱,爲須要取模的字體。如上面的 SETCH32X29[]數組 669  取模方式:設置宋體小二常規, 參數中的其餘選項爲縱向取模,字節倒序,保留,任什麼時候候都加零 670  dp_x,dp_y:取模字體的長寬,好比32x29的字符爲:29,32/4,由於保存的字符格式爲列項一個字節表示8個像素點,具體參考取模原理 671  | ax,ay,az:角度值 672  | x,y: 欲顯示的座標位置 673  | Z_Size:距旋轉軸的距離 674  | color:顏色 675     
676  | 677  |**做者: wcc 執念執戰 678  |**時間:2019-6-3 679  |********************************************************'''
680     
681     gMAT=[[0.0 for i in range(4)]  for n in range(4)] 682     Point0=zuobiaostruct() 683     Point1=zuobiaostruct() 684     PointDis=zuobiaostruct() 685     
686     gMAT=structure_3D()                        #//構建單位矩陣
687     gMAT=Translate3D(gMAT,-16,-12,-6);         #//平移變換矩陣
688     gMAT=Scale_3D(gMAT,4,4,4);                #//比例變換矩陣
689     gMAT=Rotate_3D(gMAT,ax,ay,az);            #//旋轉變換矩陣
690     #gMAT=Translate3D(gMAT,0,-8,8); #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z
691                                             #//y:上下調動位置 ,具體根據實際修改
692 
693     
694     
695     for i in range(dp_y): 696         for k in range(8): 697             temp = 0x01 << k 698             for j in range(dp_x): 699                 data=dp[i*dp_x+j] 700                 if data & temp == temp: 701                     
702                     Point0.x=j 703                     Point0.y=(i*8)+k 704                     Point0.z =Z_Size        #//此參數可以改變字符距離旋轉軸中心的距離
705                     
706                     Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘
707                     PointDis=PerProject(Point1,0,0)       #//映射投影
708                     #PointDis.x+=SCREEN_X_MAX
709                     #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線,
710                     Gui_Point(PointDis.x+x,PointDis.y+y,color) 711         
712     
713     
714 
715 
716 
717 def Show3D16x16Font(font,ax,ay,az,x,y,Z_Size,frontcolor,backcolor,model=0): 718     '''**********************************************************/ 719  |**函數: Show3D16x16Font 720  |**功能:顯示3D的16x16字符,爲從漢字庫讀取的字符數據,支持數千個漢字 721  | 本函數須要 binascii 庫的支持,不支持此庫的環境沒法運行本函數 722  |**說明:font:欲顯示的漢字,目前只支持一個字符的顯示,只支持漢字的顯示 723  | sx,sy,sz :角度值 724  | x,y: 欲顯示的座標位置 725  | Z_Size:距旋轉軸的距離 726  | frontcolor,backcolor:顏色,前景色和背景色 727  | model:顯示模式,只有模式爲1時才填充背景色,不然只填充前景色 728  | 729  |**做者: wcc 執念執戰 730  |**時間:2019-6-3 731  |********************************************************'''
732     length = len(font) 733     if length == 1: #只支持一個支付的顯示
734         text = font 735     else: 736         return
737     gb2312 = text.encode('gb2312') 738     hex_str = binascii.b2a_hex(gb2312) 739     result = str(hex_str,encoding = 'utf-8' ) 740     
741     area = eval('0x' + result[:2]) - 0xA0
742     index = eval('0x' + result[2:]) - 0xA0
743     offset = (94 * (area - 1)+ (index - 1))*32
744     font_rect = None 745     with open("D:/Mystudy/Python/pyGame/HZK16","rb") as f: #16x16字符集的地址
746  f.seek(offset) 747         font_rect = f.read(32) 748  f.close() 749     
750     gMAT=[[0.0 for i in range(4)]  for n in range(4)] 751     Point0=zuobiaostruct() 752     Point1=zuobiaostruct() 753     PointDis=zuobiaostruct() 754     
755     gMAT=structure_3D()                        #//構建單位矩陣
756     gMAT=Translate3D(gMAT,-8,-8,-8);         #//平移變換矩陣
757     gMAT=Scale_3D(gMAT,4,4,4);                #//比例變換矩陣
758     gMAT=Rotate_3D(gMAT,ax,ay,az);            #//旋轉變換矩陣
759     #gMAT=Translate3D(gMAT,8,8,8); #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z
760        
761     
762     
763     i=0 764     k=0 765     j=0 766     XO=0 767     YO=0 768 
769     for i in range(16): 770         for k in range(8): 771             temp = 0x01 << k 772             for j in range(2): 773                 data=font_rect[i*2+j] 774                 if data & temp == temp: 775                     
776                     Point0.x=16-(k+(1-j)*8) 777                     Point0.y=i #(i*8)+k
778                     Point0.z=Z_Size        #//此參數可以改變字符距離旋轉軸中心的距離
779                     
780                     Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘
781                     PointDis=PerProject(Point1,XO,YO)       #//映射投影
782                     #PointDis.x+=SCREEN_X_MAX
783                     #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線,
784                     Gui_Point(PointDis.x+x,PointDis.y+y,frontcolor) 785                 else: 786                     if model ==1: #模式爲1 時纔會繪製底色
787                         Point0.x=16-(k+(1-j)*8) 788                         Point0.y=i #(i*8)+k
789                         Point0.z=Z_Size        #//此參數可以改變字符距離旋轉軸中心的距離
790                         
791                         Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘
792                         PointDis=PerProject(Point1,XO,YO)       #//映射投影
793                         #PointDis.x+=SCREEN_X_MAX
794                         #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線,
795                         Gui_Point(PointDis.x+x,PointDis.y+y,backcolor) 796      
797 
798 
799 
800 
801 
802 
803 
804 def Show3D32x32Font(font,ax,ay,az,x,y,Z_Size,frontcolor,backcolor,model=0): 805     '''**********************************************************/ 806  |**函數: Show3D32x32Font 807  |**功能:顯示3D的32x32字符,爲從漢字庫讀取的字符數據,支持數千個漢字 808  | 本函數須要 binascii 庫的支持,不支持此庫的環境沒法運行本函數 809  |**說明:font:欲顯示的漢字,目前只支持一個字符的顯示,只支持漢字的顯示 810  | sx,sy,sz :角度值 811  | x,y: 欲顯示的座標位置 812  | Z_Size:距旋轉軸的距離 813  | frontcolor,backcolor:顏色,前景色和背景色 814  | model:顯示模式,只有模式爲1時才填充背景色,不然只填充前景色 815  | 816  |**做者: wcc 執念執戰 817  |**時間:2019-6-3 818  |********************************************************'''
819     length = len(font) 820     if length == 1:   #只支持一個支付的書寫
821         text = font 822     else: 823         return 
824     gb2312 = text.encode('gb2312') 825     hex_str = binascii.b2a_hex(gb2312) 826     result = str(hex_str,encoding = 'utf-8' ) 827     
828     area = eval('0x' + result[:2]) - 0xA0
829     index = eval('0x' + result[2:]) - 0xA0
830     offset = (94 * (area - 1)+ (index - 1))*32*4
831     font_rect = []*32*4
832     with open("D:/Mystudy/Python/pyGame/HZK32zkkh","rb") as f:#32x32字符集的地址,HZK32wryh 爲微軟雅黑字體,HZK32zkkh爲站酷酷黑字體
833  f.seek(offset) 834         font_rect = f.read(32*4) 835  f.close() 836     
837     gMAT=[[0.0 for i in range(4)]  for n in range(4)] 838     #temp=zuobiaostruct()
839     Point0=zuobiaostruct() 840     Point1=zuobiaostruct() 841     PointDis=zuobiaostruct() 842     
843     gMAT=structure_3D()                        #//構建單位矩陣
844     gMAT=Translate3D(gMAT,-16,-12,-6);         #//平移變換矩陣,可以調節字體相對中心軸的位置
845     gMAT=Scale_3D(gMAT,4,4,4);                #//比例變換矩陣
846     gMAT=Rotate_3D(gMAT,ax,ay,az);            #//旋轉變換矩陣
847     #gMAT=Translate3D(gMAT,8,8,8); #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z
848        
849     
850     
851     i=0 852     k=0 853     j=0 854     XO=0 855     YO=0 856 
857     for i in range(32): 858         for k in range(8): 859             temp = 0x01 << k 860             for j in range(4): 861                 data=font_rect[i*4+j] 862                 if data & temp == temp: 863                     
864                     Point0.x=32-(k+(3-j)*8) 865                     Point0.y=i #(i*8)+k
866                     Point0.z=Z_Size        #//此參數可以改變字符距離旋轉軸中心的距離
867                     
868                     Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘
869                     PointDis=PerProject(Point1,XO,YO)       #//映射投影
870                     #PointDis.x+=SCREEN_X_MAX
871                     #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線,
872                     Gui_Point(PointDis.x+x,PointDis.y+y,frontcolor) 873                 else: 874                     if model ==1: #模式爲1 時纔會繪製底色
875                         Point0.x=32-(k+(3-j)*8) 876                         Point0.y=i #(i*8)+k
877                         Point0.z=Z_Size        #//此參數可以改變字符距離旋轉軸中心的距離
878                         
879                         Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘
880                         PointDis=PerProject(Point1,XO,YO)       #//映射投影
881                         #PointDis.x+=SCREEN_X_MAX
882                         #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線,
883                         Gui_Point(PointDis.x+x,PointDis.y+y,backcolor) 884      
885 
886 
887 
888 
889 
890 
891 
892 def example_1(ax,ay,az,x,y,char1,char2,forecolor,backcolor): 893     '''**********************************************************/ 894  |**函數: example_1 895  |**功能:旋轉立方體 + 旋轉字符,字符爲取模字符,支持取模,支持其餘Python環境 896  | 只能顯示取模字體 897  |**說明: 898  | ax,ay,az :角度值 899  | x,y: 欲顯示的座標位置 900  char1,char2:切換顯示哪一個字符 901  | Z_Size:距旋轉軸的距離 902  | frontcolor,backcolor:顏色,前景色和背景色 903  | 904  | 905  |**做者: wcc 執念執戰 906  |**時間:2019-6-3 907  |********************************************************'''
908     RateCube_size(ax,ay,az,x,y,forecolor,8,8,8,1) 909     RateCube_size(ax,ay+45,az,x,y,forecolor,12,12,12,1) 910     
911     Show3DCharXxY(SETCH32X29[char1],29,4,ax,ay,az,x,y,-12,forecolor) 912     Show3DCharXxY(SETCH32X29[char2],29,4,ax,ay-90,az,x,y,-12,forecolor) 913     
914 def example_2(ax,ay,az,x,y,char1,char2,forecolor,backcolor): 915     '''**********************************************************/ 916  |**函數: example_2 917  |**功能:旋轉立方體 + 旋轉字符,字符爲字符集,須要庫支持,須要字符集支持 918  | 修改內部的 char 字符串可現實任意(字符集所支持的)中文字符 919  |**說明: 920  | ax,ay,az :角度值 921  | x,y: 欲顯示的座標位置 922  char1,char2:切換顯示哪一個字符 923  | Z_Size:距旋轉軸的距離 924  | frontcolor,backcolor:顏色,前景色和背景色 925  | 926  | 927  |**做者: wcc 執念執戰 928  |**時間:2019-6-3 929  |********************************************************'''
930     
931     char="執念執戰"
932     RateCube_size(ax,ay,az,x,y,forecolor,8,8,8,1) 933     RateCube_size(ax,ay,az,x,y,forecolor,12,12,12,1) 934     
935     Show3D32x32Font(char[char1],ax,ay%90,az,x,y,-12,forecolor,backcolor,0) 936     Show3D32x32Font(char[char2],ax,ay%90-90,az,x,y,-12,forecolor,backcolor,0) 937 
938 def example_3(ax,ay,az,x,y,char1,char2,forecolor,backcolor): 939     '''**********************************************************/ 940  |**函數: example_3 941  |**功能:旋轉的16x16的中文字符串 942  | 修改內部的 char 字符串可現實任意(字符集所支持的)中文字符 943  |**說明: 944  | ax,ay,az :角度值 945  | x,y: 欲顯示的座標位置 946  char1,char2:切換顯示哪一個字符 947  | Z_Size:距旋轉軸的距離 948  | frontcolor,backcolor:顏色,前景色和背景色 949  | 950  | 951  |**做者: wcc 執念執戰 952  |**時間:2019-6-3 953  |********************************************************'''
954     char="任意中文字符測試"
955     length = len(char) 956     for i in range(length): 957         Show3D16x16Font(char[i],ax,ay,az,x+16*4*i,y,2,forecolor,backcolor,0) 958         
959
View Code

    main.py 內容以下:

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Mon Jun 3 14:41:48 2019  4 
 5 @author: Administrator  6 """
 7 
 8 
 9 from Transform3D import *
 10 import cv2  11 
 12 def Pic3DShow(ax,ay,az,x,y,size):  13     '''**********************************************************/  14  |**函數: Pic3DShow  15  |**功能:顯示3D圖片  16  |**說明:ax,ay,az:旋轉角度  17  | x,y:顯示位置  18  | size:放大倍數  19  本函數因爲是使用的基礎運算符,沒有加速,因此圖片過大時,佔用運算資源較多  20  修改成numpy來進行運算會快  21  |  22  |**做者: wcc 執念執戰  23  |**時間:2019-6-3  24  |********************************************************'''
 25     
 26     
 27     color1=[0,0,0]  28     img=cv2.imread("D:/Mystudy/Python/pyGame/python.png")  29     width=img.shape[1]  30     height=img.shape[0]  31     
 32     gMAT=[[0.0 for i in range(4)]  for n in range(4)]  33     Point0=zuobiaostruct()  34     Point1=zuobiaostruct()  35     PointDis=zuobiaostruct()  36     
 37     gMAT=structure_3D()                                  #//構建單位矩陣
 38     gMAT=Translate3D(gMAT,-(width/2),-(height/2),0);  #//平移變換矩陣,繞着中心軸轉
 39     gMAT=Scale_3D(gMAT,size,size,size);                  #//比例變換矩陣,放大多少倍
 40     gMAT=Rotate_3D(gMAT,ax,ay,az);                      #//旋轉變換矩陣
 41     
 42     
 43     for i in range(width):  44         for j in range(height):  45             color=img[j][i]  46             color1[0]=color[2] #將 opencv的BGR顏色轉換爲正常的RGB顏色
 47             color1[1]=color[1]  48             color1[2]=color[0]  49             Point0.x=i  50             Point0.y=j  51             Point0.z=0  52             Point1=vector_matrix_MULTIPLY(Point0,gMAT)  53             PointDis=PerProject(Point1,0,0)  54             Gui_Point(PointDis.x+x,PointDis.y+y,color1)  55 
 56 
 57 
 58 SCREEN_X_MAX = 800 #屏幕的寬和高
 59 SCREEN_Y_MAX = 600
 60 
 61 BLACK=(0,0,0)  62 WHITE=(255,255,255)  63 RED=(255,0,0)  64 GREEN=(0,255,0)  65 BLUE=(0,0,255)  66 
 67 ForeColor = RED #前景色和背景色
 68 BackColor = BLACK  69 
 70 
 71 pygame.init()  72 sx=0  73 sy=0  74 sz=0  75 turn=0  76 flg1=0  77 flg2=1
 78 screen = pygame.display.set_mode((SCREEN_X_MAX,SCREEN_Y_MAX))  79 
 80 while True:  81     for event in pygame.event.get():  82         if event.type in (QUIT,KEYDOWN):  83  pygame.quit()  84  sys.exit()  85 
 86     sx+=1
 87     sy+=1
 88     sz+=1
 89     turn+=1
 90     if sy>89:  91         sy=0  92         flg1+=1
 93         flg2+=1
 94     if flg1>3:  95         flg1=0  96     if flg2>3:  97         flg2=0  98  screen.fill(BackColor)  99     example_1(0,sy,0,SCREEN_X_MAX/4,SCREEN_Y_MAX/2,flg1,flg2,ForeColor,BackColor) 100     example_2(0,sy,0,SCREEN_X_MAX/2+100,SCREEN_Y_MAX/2,flg1,flg2,ForeColor,BackColor) 101     example_3(0,turn,0,SCREEN_X_MAX/4,100,flg1,flg2,ForeColor,BackColor) 102     Pic3DShow(0,turn,0,100,100,3) 103  pygame.display.update() 104     #time.sleep(30/1000) #延時,防止速度過快
105
View Code

全部的代碼都有基本註釋,若是想要了解更詳細的的3D算法的實現能夠參考 https://wenku.baidu.com/view/ba9e9e64783e0912a2162ab2.html 等3維計算原理的講解。

 本文代碼和字庫及圖片打包見 附件

本文水平有限,內容不少詞語因爲知識水平問題不嚴謹或很離譜,但主要做爲記錄做用,能理解就行了,但願之後的本身和路過的大神對必要的錯誤提出批評與指點,對好笑的錯誤不要嘲笑,指出來我會改正的。 

 另外,轉載使用請註明出處。                                                                                                

                                                                                                                                                             -------------隨夢,隨心,隨願,執念執戰,執戰蒼天!

 

 

 

 

 

    

原文出處:https://www.cnblogs.com/zhinianzhizhan/p/10968302.html

相關文章
相關標籤/搜索