博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python+基本3D显示
阅读量:5282 次
发布时间:2019-06-14

本文共 36371 字,大约阅读时间需要 121 分钟。

    想要将双目照片合成立体图实现三维重建,完全没有头绪。但是对三维理解是必须的。所以将以前在单片机上运行的 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.0100 Cube[0].y=0.0101 Cube[0].z=0.0102 103 Cube[1].x=Cube_Size104 Cube[1].y=0.0105 Cube[1].z=0.0106 107 Cube[2].x=0.0108 Cube[2].y=Cube_Size109 Cube[2].z=0.0110 111 Cube[3].x=Cube_Size112 Cube[3].y=Cube_Size113 Cube[3].z=0.0114 115 Cube[4].x=0.0116 Cube[4].y=0.0117 Cube[4].z=Cube_Size118 119 Cube[5].x=Cube_Size120 Cube[5].y=0.0121 Cube[5].z=Cube_Size122 123 Cube[6].x=0.0124 Cube[6].y=Cube_Size125 Cube[6].z=Cube_Size126 127 Cube[7].x=Cube_Size128 Cube[7].y=Cube_Size129 Cube[7].z=Cube_Size130 '''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_copy158     |**功能:矩阵拷贝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 targetMAT170 171 ''172 173 def MATRIX_multiply(MAT1,MAT2):174     '''|*******************************************************175     |**函数:MATRIX_multiply176     |**功能:矩阵相乘177     |**说明: MAT1[4][4](矩阵1),MAT2[4][4](矩阵2),178     |            newMAT[4][4] (结果矩阵 )179     |                     边学边写180     |**作者:  执念执战181     |**时间:2015-11-29182     |**********************************************************'''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 newMAT188  189    190 191 def vector_matrix_MULTIPLY(Source,MAT):192     '''**********************************************************193     |**函数: vector_matrix_MULTIPLY194     |**功能:矢量与矩阵相乘195     |**说明: Source(源矢量坐标)  MAT[][](变换坐标)196     |                     边学边写197     |**作者:  执念执战198     |**时间:2015-11-29199     |***********************************************************''' 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_3D211     |**功能:构造单位矩阵212     |**说明: 将一个数组构造成单位矩阵(对角线上全为1,其他为0)213     |                     边学边写214     |**作者:  执念执战215     |**时间:2015-11-29216     |*********************************************************'''217     MAT=[[0.0 for i in range(4)] for i  in range(4)]218     MAT[0][0]=1.0219     MAT[0][1]=0.0220     MAT[0][2]=0.0221     MAT[0][3]=0.0    #// 1 0 0 0 222     223     MAT[1][0]=0.0224     MAT[1][1]=1.0225     MAT[1][2]=0.0226     MAT[1][3]=0.0   #// 0 1 0 0227     228     MAT[2][0]=0.0229     MAT[2][1]=0.0230     MAT[2][2]=1.0231     MAT[2][3]=0.0232                     #// 0 0 1 0233     MAT[3][0]=0.0234     MAT[3][1]=0.0235     MAT[3][2]=0.0236     MAT[3][3]=1.0237                     #// 0 0 0 1    238     239     return MAT240     241     242   243 def Translate3D(MAT,tx, ty, tz):244     '''********************************************************245     |**函数: Translate3D246     |**功能:平移变换矩阵247     |**说明:  1:tx,ty,tz 为平移参数248     |           2:当为边长的一半的倒数时,图像绕着自己旋转,即原点在中心249     |                    250     |                     边学边写251     |**作者:  执念执战252     |**时间:2015-11-29253     |**********************************************************''' 254     tMAT=[[0.0 for i in range(4)] for i  in range(4)]255     tMAT[0][0]=1256     tMAT[0][1]=0257     tMAT[0][2]=0258     tMAT[0][3]=0    #//    1 0 0 tx259     260     tMAT[1][0]=0261     tMAT[1][1]=1262     tMAT[1][2]=0263     tMAT[1][3]=0    #//    0 1 0 ty264     265     tMAT[2][0]=0266     tMAT[2][1]=0267     tMAT[2][2]=1268     tMAT[2][3]=0    #//    0 0 1 tz269     270     tMAT[3][0]=tx271     tMAT[3][1]=ty272     tMAT[3][2]=tz273     tMAT[3][3]=1;    #//    0 0 0 1274 275     return MATRIX_multiply(MAT,tMAT)#//相乘276 277 278 279 def   Scale_3D( MAT, sx, sy, sz):280     '''*******************************************************281     |**函数: Scale_3D282     |**功能:比例(scale)变换矩阵283     |**说明: 1:相对于原点上的比例变换284     |                    2:sx,sy,sz 是对应轴上的缩放量285     |                    3:矩阵根据三个比例进行比例变换286     |                     边学边写287     |**作者:  执念执战288     |**时间:2015-11-30,7:45289     |*********************************************************'''290     tMAT=[[0.0 for i in range(4)] for i  in range(4)]291     tMAT[0][0]=sx292     tMAT[0][1]=0293     tMAT[0][2]=0294     tMAT[0][3]=0    #//    sx0 0 0 295     tMAT[1][0]=0296     tMAT[1][1]=sy297     tMAT[1][2]=0298     tMAT[1][3]=0    #//    0 sy0 0299     tMAT[2][0]=0300     tMAT[2][1]=0301     tMAT[2][2]=sz302     tMAT[2][3]=0    #//    0 0 sz0303     tMAT[3][0]=0304     tMAT[3][1]=0305     tMAT[3][2]=0306     tMAT[3][3]=1    #//    0 0 0 1307     return MATRIX_multiply(MAT,tMAT) #    //相乘308 309 310 311 312 313 314 def  Rotate_3D( MAT, ax, ay, az):315     '''**********************************************************/316     |**函数: Rotate_3D317     |**功能:旋转变换矩阵318     |**说明: 1:绕z轴旋转az度角319     |            2:az为旋转的角度量,赋正值为顺时针转320     |            3:矩阵MAT根据AZ度角进行旋转变换321     |                     边学边写322     |**作者:  执念执战323     |**时间:2015-11-30,7:45324     |**********************************************************'''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.0333     az=(3.1415926*az)/180.0334     '''/*****************************绕x轴旋转********************************************/'''335 336     MATx[0][0]=1337     MATx[0][1]=0338     MATx[0][2]=0339     MATx[0][3]=0    #//1  0        0       0340     MATx[1][0]=0341     MATx[1][1]=cos(ax)342     MATx[1][2]=-sin(ax)343     MATx[1][3]=0    #//0  cos(ax)    -sin(ax)   0344     MATx[2][0]=0345     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]=0349     MATx[3][1]=0350     MATx[3][2]=0351     MATx[3][3]=1    #//0  0         0       1352 353     '''/*****************************绕y轴旋转********************************************/'''354     MATy[0][0]=cos(ay)355     MATy[0][1]=0356     MATy[0][2]=sin(ay)357     MATy[0][3]=0    #//cos(ay)    0    sin(ay)        0358     MATy[1][0]=0359     MATy[1][1]=1360     MATy[1][2]=0361     MATy[1][3]=0    #//    0    1    0        0362     MATy[2][0]=-sin(ay)363     MATy[2][1]=0364     MATy[2][2]=cos(ay)365     MATy[2][3]=0    #//    -sin(ay)    0        cos(ay) 0366     MATy[3][0]=0367     MATy[3][1]=0368     MATy[3][2]=0369     MATy[3][3]=1    #// 0     0    0        1370 371 372     '''/*****************************绕z轴旋转********************************************/'''373     MATz[0][0]=cos(az)374     MATz[0][1]=-sin(az)375     MATz[0][2]=0376     MATz[0][3]=0    #//cos(az)    -sin(az)    0        0377     MATz[1][0]=sin(az)378     MATz[1][1]=cos(az)379     MATz[1][2]=0380     MATz[1][3]=0    #//    sin(az)    cos(az)        0        0381     MATz[2][0]=0382     MATz[2][1]=0383     MATz[2][2]=1384     MATz[2][3]=0    #//    0      0        1        0385     MATz[3][0]=0386     MATz[3][1]=0387     MATz[3][2]=0388     MATz[3][3]=1    #// 0       0        0        1389 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     |**函数: OrtProject410     |**功能:透视投影(Perspective projection)411     |**说明:简单透视412     413     |                     边学边写414     |**作者:  执念执战415     |**时间:2015-11-30416     |*********************************************************'''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     |**函数: PerProject428     |**功能:透视投影(Perspective projection)429     |**说明:XO,YO为投影后的图形中心的屏幕坐标430     431     |                     边学边写432     |**作者:  执念执战433     |**时间:2015-11-30434     |********************************************************'''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 Screen442 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_size460     |**功能:显示3D的立方体461     |**说明:sx,sy,sz :角度值462     |        x,y: 欲显示的坐标位置463     |        X_Size,Y_Size,Z_Size:立方体的三个边长,默认为1464     |        ratio:放大比例465     466     |                     467     |**作者: wcc  执念执战468     |**时间:2019-6-3469     |********************************************************'''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.z482                                                           #//    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:position490         Cube_dis[i].x+=x491         Cube_dis[i].y+=y492         #Cube_dis[i].x+=SCREEN_X_MAX493         #Cube_dis[i].y+=SCREEN_Y_MAX494 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=False519 Last_flg2=False520 Last_x1=0521 Last_y1=0522 523 Last_x2=0524 Last_y2=0525 526 527 def Rotatecircle( ax, ay, az,x, y,Z_Size, r, color ):528     '''**********************************************************/529     |**函数: Rotatecircle530     |**功能:显示3D的圆531     |**说明:sx,sy,sz :角度值532     |        x,y: 欲显示的坐标位置533     |        Z_Size:距旋转轴的距离534     |        r:半径535     |        color:颜色536     537     |                     538     |**作者: wcc  执念执战539     |**时间:2019-6-3540     |********************************************************'''541     542     global Last_flg1543     global Last_flg2544     global Last_x1,Last_y1,Last_x2,Last_y2545     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=i564         Point0.y=r-(r-sqrt(r*r-(r-i)*(r-i)))565         Point0.z=0#Point0.z+Z_Size566         Point3.x=i567         Point3.y=r-(r+sqrt(r*r-(r-i)*(r-i)))568         Point3.z=0#Point3.z+Z_Size569 570 571         Point1=vector_matrix_MULTIPLY(Point0,gMAT)    #//矢量与矩阵相乘     572         PointDis=PerProject(Point1,0,0)                    #//映射投影573         #PointDis.x+=SCREEN_X_MAX574         #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.x582         Last_y1= PointDis.y583         Last_flg1=True584 585         Point1=vector_matrix_MULTIPLY(Point3,gMAT)    #//矢量与矩阵相乘586         PointDis=PerProject(Point1,0,0)            #//映射投影587 588         #PointDis.x+=SCREEN_X_MAX589        # 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.x595         Last_y2= PointDis.y596         Last_flg2=True597         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     |**函数: Show3DCharXxY667     |**功能:显示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-3679     |********************************************************'''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.z691                                             #//y:上下调动位置 ,具体根据实际修改692 693     694     695     for i in range(dp_y):696         for k in range(8):697             temp = 0x01 << k698             for j in range(dp_x):699                 data=dp[i*dp_x+j]700                 if data & temp == temp:701                     702                     Point0.x=j703                     Point0.y=(i*8)+k704                     Point0.z =Z_Size        #//此参数能够改变字符距离旋转轴中心的距离705                     706                     Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量与矩阵相乘707                     PointDis=PerProject(Point1,0,0)       #//映射投影708                     #PointDis.x+=SCREEN_X_MAX709                     #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     |**函数: Show3D16x16Font720     |**功能:显示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-3731     |********************************************************'''732     length = len(font)733     if length == 1: #只支持一个支付的显示734         text = font735     else:736         return737     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]) - 0xA0742     index = eval('0x' + result[2:]) - 0xA0743     offset = (94 * (area - 1)+ (index - 1))*32744     font_rect = None745     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.z760        761     762     763     i=0764     k=0765     j=0766     XO=0767     YO=0768 769     for i in range(16):770         for k in range(8):771             temp = 0x01 << k772             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)+k778                     Point0.z=Z_Size        #//此参数能够改变字符距离旋转轴中心的距离779                     780                     Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量与矩阵相乘781                     PointDis=PerProject(Point1,XO,YO)       #//映射投影782                     #PointDis.x+=SCREEN_X_MAX783                     #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)+k789                         Point0.z=Z_Size        #//此参数能够改变字符距离旋转轴中心的距离790                         791                         Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量与矩阵相乘792                         PointDis=PerProject(Point1,XO,YO)       #//映射投影793                         #PointDis.x+=SCREEN_X_MAX794                         #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     |**函数: Show3D32x32Font807     |**功能:显示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-3818     |********************************************************'''819     length = len(font)820     if length == 1:   #只支持一个支付的书写821         text = font822     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]) - 0xA0829     index = eval('0x' + result[2:]) - 0xA0830     offset = (94 * (area - 1)+ (index - 1))*32*4831     font_rect = []*32*4832     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.z848        849     850     851     i=0852     k=0853     j=0854     XO=0855     YO=0856 857     for i in range(32):858         for k in range(8):859             temp = 0x01 << k860             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)+k866                     Point0.z=Z_Size        #//此参数能够改变字符距离旋转轴中心的距离867                     868                     Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量与矩阵相乘869                     PointDis=PerProject(Point1,XO,YO)       #//映射投影870                     #PointDis.x+=SCREEN_X_MAX871                     #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)+k877                         Point0.z=Z_Size        #//此参数能够改变字符距离旋转轴中心的距离878                         879                         Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量与矩阵相乘880                         PointDis=PerProject(Point1,XO,YO)       #//映射投影881                         #PointDis.x+=SCREEN_X_MAX882                         #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_1895     |**功能:旋转立方体 + 旋转字符,字符为取模字符,支持取模,支持其他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-3907     |********************************************************'''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_2917     |**功能:旋转立方体 + 旋转字符,字符为字符集,需要库支持,需要字符集支持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-3929     |********************************************************'''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_3941     |**功能:旋转的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-3953     |********************************************************'''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算法的实现可以参考 等3维计算原理的讲解。

 本文代码和字库及图片打包见 。

本文水平有限,内容很多词语由于知识水平问题不严谨或很离谱,但主要作为记录作用,能理解就好了,希望以后的自己和路过的大神对必要的错误提出批评与指点,对可笑的错误不要嘲笑,指出来我会改正的。 

 另外,转载使用请注明出处。                                                                                                

                                                                                                                                                             -------------随梦,随心,随愿,执念执战,执战苍天!

 

 

 

 

 

    

转载于:https://www.cnblogs.com/zhinianzhizhan/p/10968302.html

你可能感兴趣的文章
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
SWIFT国际资金清算系统
查看>>
站立会议第四天
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
自定义返回模型
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>