<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

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

         理論上來說,只要實現了里面的畫點函數和畫線函數,就可以快速移植到包括 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庫,如有需要可屏蔽或是換為其他庫來實現圖片的讀取和計算。

          程序中實現的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維計算原理的講解。

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

      本文水平有限,內容很多詞語由于知識水平問題不嚴謹或很離譜,但主要作為記錄作用,能理解就好了,希望以后的自己和路過的大神對必要的錯誤提出批評與指點,對可笑的錯誤不要嘲笑,指出來我會改正的。 

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

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

       

       

       

       

       

          

      posted on 2019-06-03 17:06  執念執戰  閱讀(7919)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 人妻中文字幕精品一页| 起碰免费公开97在线视频| 国产精品中文字幕av| 国色天香成人一区二区| 日韩精品亚洲专在线电影| 丝袜美腿亚洲综合在线观看视频| 亚洲色大成网站WWW永久麻豆| 国产精品三级中文字幕| 亚洲av一本二本三本| 亚洲爆乳少妇无码激情| 国产在线精品无码二区| 九九热在线视频只有精品| 国产成AV人片久青草影院| 国产好大好硬好爽免费不卡| 高潮射精日本韩国在线播放| 日本亚洲欧洲无免费码在线| 亚洲av日韩av永久无码电影| 精品无码人妻一区二区三区| 免费费很色大片欧一二区| 久青草国产在视频在线观看| 99RE6在线视频精品免费下载| 99久久精品国产一区二区| 久久亚洲av成人无码软件| 亚洲日本va午夜中文字幕久久| 垦利县| 成人午夜伦理在线观看| 开心五月婷婷综合网站| 久久不见久久见免费视频观看| 免费无遮挡无码视频网站| 日本一区三区高清视频| 国产一级特黄高清大片一| 国产99视频精品免费专区| 欧美熟妇乱子伦XX视频| 亚洲性日韩精品一区二区| 幻女free性俄罗斯毛片| 亚洲欧洲∨国产一区二区三区| 欧美叉叉叉bbb网站| 国产特色一区二区三区视频| 日韩中文字幕有码av| 色欲国产精品一区成人精品| 亚洲夂夂婷婷色拍ww47|