以前写的,怕烂在电脑里,就拿出来晒晒吧~

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



算法部分:

代码:
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
上传的附件 八卦.rar