首页
论坛
专栏
课程

[原创][易经]六十四卦圆图

2010-9-26 12:49 7967

[原创][易经]六十四卦圆图

2010-9-26 12:49
7967
以前写的,怕烂在电脑里,就拿出来晒晒吧~

因为数字不好,里面直线没画好,谁有兴趣可以把直线画规矩点



算法部分:
WenW64Gua proc Hwnd,IXI
local hdc,ps:PAINTSTRUCT,Penhandle,hMemDC,rect:RECT,bitmap,Brush
local yx,yy,x[4]:DWORD ,y[4]:DWORD ,r,g,hd:REAL8,fc
local Wx,Nx,yg,i,s,ii,XX,iii;外爻,内爻,卦
						invoke GetDC,Hwnd
				      mov    hdc,eax 
				      invoke CreateCompatibleDC,hdc ;创建内存DC
				      mov    hMemDC,eax 
				      invoke GetClientRect,Hwnd,addr rect 
				      mov eax,rect.bottom
						sub eax,rect.top ;高
						mov ecx,rect.right
						sub ecx,rect.left ;宽
						push eax
						push ecx
						push hdc
						mov yy,400;圆心y
						mov yx,400;圆心x
						mov r,300 ;半径
						mov g,6 ;高度初始化
						mov fc,64*2
						
						;弧度 = 3.1415926535 ÷ (64 × 2)
						finit ;初始化FPU
						fild fc ;128 把圆分成128*2分
						FLDPI ;将pi装入
						FDIV st,st(1) ; PI/128
						FST hd  ;结果保存到弧度
						mov yg,0;卦初始化值
				      call CreateCompatibleBitmap;创建位图
				      mov bitmap,eax
						invoke SelectObject,hMemDC,bitmap
				      invoke CreatePen,PS_SOLID,2,0  
				      mov Penhandle,eax
				      invoke SelectObject,hMemDC,eax
				      invoke SetBkMode,hMemDC,TRANSPARENT
				      invoke CreateSolidBrush,00808080H;设置位图背景色
				      mov Brush,eax
				      invoke SelectObject,hMemDC,eax
				      invoke FloodFill,hMemDC,NULL,NULL,255;;设置位图背景色
				      
				      ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
						mov i, 4 ;初始计次值
						mov s,0
						j1:
						cmp s,64
						je j2
						inc s
						mov eax,yg
						push eax
						and eax,7
						mov Wx,eax
						pop eax
						shr eax,3
						mov Nx,eax
						mov ii,0
						j3:
						cmp ii,6 ;循环6次
						je j4
						invoke DeleteObject,Penhandle ;删除原来的画笔
						mov eax,offset Xsb
						.if ii <=2
							mov ecx,Wx
							.else
							mov ecx,Nx
						.endif
							invoke CreatePen,PS_SOLID,2,[eax+ecx*4]
							mov Penhandle,eax
				         invoke SelectObject,hMemDC,eax
						mov eax,yg
						mov ecx,ii
						shr eax,cl
						and eax,1
						mov XX,eax;爻
					   mov iii,0
					   j5:
					   cmp iii,4
					   je j6
						;            X [iii] = 圆心X + (半径 + G × (6 - ii)) × 求正弦 ((i + IXI - iii) × 弧度)
						;            Y [iii] = 圆心Y + (半径 + G × (6 - ii)) × 求余弦 ((i + IXI - iii) × 弧度)
						
						push 0 ;计次
						j7:
						cmp BYTE ptr[esp],2
						je j8
						mov eax,i
						add eax,IXI
						sub eax,iii
						dec eax
						push eax ;(i + IXI - iii)
						finit
						fild WORD ptr [esp]
						pop eax
						fld hd
						fmul st,st(1) 
						.if BYTE ptr [esp]==0
							fsin ;求正弦 ((i + IXI - iii) × 弧度
							.else
							fcos;求余弦 ((i + IXI - iii) × 弧度)
						.endif	
						mov eax,6
						sub eax,ii
						mov ecx,g ;高
						imul eax,ecx;G × (6 - ii)
						add eax,r ;半径 + G × (6 - ii)
						push eax
						fild WORD ptr [esp]
						pop eax
						fmul st,st(1) ;(半径 + G × (6 - ii)) × 求正弦 ((i + IXI - iii) × 弧度)
						mov eax,iii
						.if BYTE ptr [esp]==0
							FISTP DWORD ptr x[eax*4]
							mov ecx,yx
							add x[eax*4],ecx ; +圆心X
							.else
							FISTP DWORD ptr y[eax*4]
							mov ecx,yy
							add y[eax*4],ecx ; +圆心Y
						.endif
						inc BYTE ptr [esp] ;两次,第一次计算X [iii],第二次计算y [iii]
						jmp j7
						j8:
						pop eax
					   inc iii 
					   jmp j5
					   j6:
					   mov eax,XX
					   .if eax==1; ' 画阳爻
					   invoke MoveToEx,hMemDC,x[3*4],y[3*4],NULL
						invoke LineTo,hMemDC,x[0],y[0]
					   	.else;画阴爻
					   invoke MoveToEx,hMemDC,x[3*4],y[3*4],NULL
						invoke LineTo,hMemDC,x[2*4],y[2*4]
						invoke MoveToEx,hMemDC,x[4],y[4],NULL
						invoke LineTo,hMemDC,x[0],y[0]
					   .endif
						inc ii ;累加
						jmp j3
						j4:
						add i,4
						 .if yg==31
						 	mov yg,63
						 	.elseif yg <31
						 		inc yg
						 	.else
						 		dec yg		
						 .endif
						jmp j1
						j2:
						;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
				      invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY 
				      invoke DeleteObject,bitmap
						invoke DeleteDC,hMemDC
						invoke ReleaseDC,Hwnd,hdc
						invoke DeleteObject,Penhandle
						invoke DeleteObject,Brush
ret
WenW64Gua endp


2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (12)
aliuwr 2010-9-26 12:54
2
0
呵呵,有点意思,支持个
丢丢侠 2010-9-26 12:58
3
0
好,厉害,数学帝
找水的鱼 2010-9-26 15:15
4
0
这哥们数学好好....
riusksk 41 2010-9-26 15:22
5
0
正中再画个八卦上去,就功德圆满了!
lapcca 2010-9-26 15:50
6
0
数学博大精深呀~~~
烁皓 2010-9-26 15:59
7
0
强大啊,拿去算命,呵呵
仙果 19 2010-9-26 16:57
8
0
看不懂啊,真的
BeMaverick 2010-10-1 23:34
9
0
同5楼的 中间在画上太极正时针转就更完美了~
superdj 2010-10-1 23:57
10
0
下了,感觉不错啊
zhingma 2010-10-2 10:14
11
0
易经。唉。。。。分阴阳爻 没有外爻,内爻之分!!
Mx¢Xgt 7 2010-10-17 16:43
12
0
写错了..应该是内卦和外卦
xingjunjie 2010-10-17 17:05
13
0
膜拜LZ的数学能里
游客
登录 | 注册 方可回帖
返回