想要将双目照片合成立体图实现三维重建,完全没有头绪。但是对三维理解是必须的。所以将以前在单片机上运行的 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

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

所有的代码都有基本注释,如果想要了解更详细的的3D算法的实现可以参考https://wenku.baidu.com/view/ba9e9e64783e0912a2162ab2.html 等3维计算原理的讲解。

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

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

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

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

 

python+基本3D显示的更多相关文章

  1. python matplotlib 中文显示参数设置

    python matplotlib 中文显示参数设置 方法一:每次编写代码时进行参数设置 #coding:utf-8import matplotlib.pyplot as pltplt.rcParam ...

  2. ZLG_GUI和3D显示的移植

    最近学习NRF51822,想在OLED上移植个强大的GUI ,本来想学习emWIN的,甚至想直接学习自带GUI的嵌入式操作系统RTThread,但是......哎,太懒了.....现在觉得ZLG_GU ...

  3. Python绘制3d螺旋曲线图实例代码

    Axes3D.plot(xs, ys, *args, **kwargs) 绘制2D或3D数据 参数 描述 xs, ys X轴,Y轴坐标定点 zs Z值,每一个点的值都是1 zdir 绘制2D集合时使用 ...

  4. python matplotlib 中文显示乱码设置

    python matplotlib 中文显示乱码设置 原因:是matplotlib库中没有中文字体.1 解决方案:1.进入C:\Anaconda64\Lib\site-packages\matplot ...

  5. Ubuntu下安装Python3.6并在终端输入Python就能显示Python3.6

      Ubuntu17.04自带Python2.7与Python3.5.3的版本,由于Python2与Python3有着一些差距可能需要安装更新Python3的版本,并且切换默认的Python解释器. ...

  6. Python绘制3D图形

    来自:https://www.jb51.net/article/139349.htm 3D图形在数据分析.数据建模.图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何使用python进行 ...

  7. python 画3D的高斯曲线

    用python画3D的高斯曲线,我想如果有多个峰怎么画? import numpy as npimport matplotlib.pyplot as pltimport mathimport mpl_ ...

  8. 运行python程序不显示cmd方法

    运行python程序不显示cmd方法 Pythonw xxx.py 将*.py改成*.pyw,然后执行*.pyw Python.exe和pythonw.exe不同: 执行时没有控制台窗口 所有向原有的 ...

  9. 【python之路2】CMD中执行python程序中文显示乱码

    在IDLE中执行下面代码,中文显示正常: # -*- coding:utf-8 -*- st=raw_input("请输入内容")print st 但在CMD中执行e:\hello ...

  10. python 读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

随机推荐

  1. celery学习

    1.清空队列:celery -A  项目名称 purge 2.原理参考 https://www.cnblogs.com/sui776265233/p/10004679.html 消息中间件(messa ...

  2. ESP_IDF中使用TFT_eSPI库驱动ST7789V

    前言: 想学习创建好看的菜单界面很久了,寒假在家正好有时间,手中恰好有一块ST7789的tft屏幕,正好拿来练练手. Step 1: 在github中找到TFT_eSPI库(网址:docs · mas ...

  3. GreenDao操作本地db文件(使用greendao 新版3.2.2 )

    项目需求:省市区使用本地db文件,数据库使用greendao框架.现在不想使用SQL语句,用greendao直接查询本地数据库表(至于为啥使用GreenDao,可以百度一下它的优势). https:/ ...

  4. EXCEL函数总结

    ------------------截取"号"之前的字符 =MID(A45,1,FIND("号",A45,1)-1)

  5. 小程序modal弹窗

    [注意]css放的位置可能影响效果 参考a-level competitionFilterCover 1.容器:position: absolute; top: 100vh; animation: m ...

  6. body传参和query传参

    get请求只能传query参数,query参数都是拼接在请求地址上的.post可以传body和query两种形式的参数. get请求在url中传送的参数是有长度限制的,而post没有限制.get比po ...

  7. pyintaller 打包后报No module named 'XXX'

    在pycharm中运行一切正常,但是使用pyinstaller打包之后,双击exe就提示缺乏某某module 百度一番之后,尝试了说hidden-import之类的,以及说只留一个主程序在最外层啥的, ...

  8. C++ primer笔记 -数组和指针

    如果数组没有显示的提供元素的初始值,则数组元素会像普通变量一样的初始化: 1.在函数体外的内置类型的数组,其元素均初始化为0 2.在函数体内的内置类型的数组,其元素无初始化 3.如果为类类型,则不管位 ...

  9. XJTUOJ #1193. 表象[弹幕偏执症]

    题目 https://oj.xjtuicpc.com/problem/1193 恋恋天下第一!(然而本菜鸡总是被阿空锤死而根本开不了normal)TAT 思路 挺吓人的一道题,看起来很像是要匹配加字符 ...

  10. mariadb数据库用户管理(创建、赋权、)

    数据库查看当前用户 select user(): MariaDB [(none)]> select user(); +----------------+ | user() | +-------- ...