;butterfly.asm
;蝴蝶曲线的极坐标方程如下:
;x=sin(t)(e^cos(t)-2cos(4t)-sin^5(t/12))
;y=cos(t)(e^cos(t)-2cos(4t)-sin^5(t/12))
;想看网页版的蝴蝶吗?请观赏我的主页!
;不足之处,敬请指导。
;QQ:112426112
;Email:leguanyuan at 126 dot com
;Homepage:http://correy.webs.com
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib user32.lib
includelib kernel32.lib
include gdi32.inc
includelib gdi32.lib
.code
hInstance dd ?
hWinMain dd ?
stMsg MSG <>
szClassName db "correy",0
szCaptionMain db "made by correy",0
pwndclassex dd 48,3,offset liuchunli,0,0,0,0,0,6,0,offset szClassName,0
cxClient DD ?
cyClient DD ?
x DD ?
y DD ?
x_offset DD ?
y_offset DD ?
colour DD ?
temp DD ?
oldcw word ?
newcw word ?
scaleX real4 0.0
scaleY real4 0.0
theta real4 0.0
incr real4 0.01
four real4 4.0
rep12 real4 0.08333333
scale real4 75.0
change_base real4 2.30258
liuchunli proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL hdc:HDC, ps:PAINTSTRUCT
.IF uMsg==WM_SIZE;改变窗口尺寸有效果,改变change_base参数更有效果。
finit
mov eax,lParam
and eax,0ffffh
mov cxClient,eax
shr eax,2;1
mov x_offset,eax ;;;;;;;;;;;;
invoke GetSystemMetrics,SM_CXSCREEN
mov temp,eax
shr temp,7
fild cxClient
fidiv temp
fstp scaleX
mov ebx,lParam
shr ebx,16
mov cyClient,ebx
shr ebx,1
mov y_offset,ebx;;;;;;;;;;;;;
invoke GetSystemMetrics,SM_CYSCREEN
mov temp,eax
shr temp,7;6
fild cyClient
fidiv temp
fstp scaleY
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
finit
mov si,15700
.WHILE si > 0
fld theta
fmul rep12
fsin
fld st
fmul st,st(1)
fmul st,st(1)
fmul st,st(1)
fmul
fld theta
fmul four
fcos
fld st
fadd
fsub
fld theta
fcos
fldl2t
fmulp st(1),st(0)
fld st(0)
fstcw oldcw
fwait
mov ax,oldcw
and ax,0f3ffh
or ax,0400h
mov newcw,ax
fldcw newcw
frndint
fldcw oldcw
fld st(0)
fxch st(2)
fsubrp st(1),st(0)
fld1
fchs
fxch st(1)
fscale
fstp st(1)
f2xm1
fld1
faddp st(1),st(0)
fmul st(0),st(0)
fscale
fstp st(1)
fdiv change_base
fadd
fld theta
fcos
fmul st,st(1)
fmul scaleX
fiadd x_offset
fistp x
fld theta
fsin
fmul
fmul scaleY
fiadd y_offset
fistp y
invoke SetPixel,hdc,x,y,colour
fld theta
fadd incr
fstp theta
inc si
add colour,999
.ENDW
invoke EndPaint,hWnd,ADDR ps
.ELSEIF uMsg==WM_DESTROY
invoke PostQuitMessage,0
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
liuchunli endp
start:invoke GetModuleHandle,0
mov hInstance,eax
mov pwndclassex+20,eax
invoke LoadIcon,hInstance,1;其实这四行也可以去掉。
mov pwndclassex+24,eax
invoke LoadCursor,0,32512
mov pwndclassex+28,eax
invoke RegisterClassEx,addr pwndclassex
invoke CreateWindowEx,200h,offset szClassName,offset szCaptionMain,00cf0000h,80000000h,80000000h,1028,768,0,0,hInstance,0;0cf0000h ca0000h
mov hWinMain,eax
invoke ShowWindow,hWinMain,1;不想显示这一两行也可以不要。
invoke UpdateWindow,hWinMain
again:invoke GetMessage,addr stMsg,0,0,0
cmp eax,0
je exit
invoke TranslateMessage,addr stMsg;这一行也可以去掉,特别是不处理字符信息。
invoke DispatchMessage,addr stMsg
jmp again
exit:invoke ExitProcess,0
end start
;made at 2010.03.30
;其实这个程序我十年前就应该写出。
;本人在社会的最底层混了10多年,最开始(1997年)是在建筑队做小工,在建筑行业一直干到2010年。
;本人简介:
;大学没有上
;高中没有考上
;职高没有上完
;初中毕业证没有领
;小学毕业证没有发
;国家的户口本记载:文盲或半文盲。
;也像研究生论文那样留下通讯地址:
;河南开封杞县圉镇徐疙瘩
;邮政编码:475204
;也象有些书上写的那样:
;感谢我的母校:圉镇初中,“科学,严谨,钻研,刻苦”。(自己总结哟!)
; 民赵小学,“好好学习,天天向上”。
;感谢我的老婆:杜岷娟,在我29岁之际认识了她,并全心全意的跟随我支持我。好歹这辈子没有打光棍。
;还要感谢一个人,是个牛人,更是恩人,因为商业机密,不便透露。
;更要说明一个人,她让我奋斗终生,此人更不可说。
;最后说一点,父母不支持我,母亲常说:“天天爬电脑前,当吃当喝,不能挣一分钱,还浪费电,走!跟我下地干活去!要么把粪拉地里!”
; 快30岁了亦如此,其悲如我上个世纪读《项脊轩记》!
;父亲从不与我说话,连吃饭都分开,很少与村内人说话,他老人家在农村太寂寞了,你若与我发信,你就寄给他好了,我定能收到(我四处漂泊,但每年都回家),他的名字叫:寇建业。
;注释:本人1998-1999年这两年热爱数学:钻研微分方程,无穷级数,球面三角等。
- 标 题:butterfly.asm
- 作 者:correy
- 时 间:2011-04-01 07:45:44
- 链 接:http://bbs.pediy.com/showthread.php?t=131671