以前写的,怕烂在电脑里,就拿出来晒晒吧~
因为数字不好,里面直线没画好,谁有兴趣可以把直线画规矩点
算法部分:
代码:
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