?? q cir earth.asm
字號:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data?
hInstance dd ?
hWinMain dd ?
Table1 dd 326 dup(?)
Table2 dd 326 dup(?)
Rtable dd 326 dup(?)
Table3 dd 326*256 dup(?)
hFile dd ?
hFileMap dd ?
lpFile dd ?
lpMem dd ?
lpMem1 dd ?
lpMem2 dd ?
lpMem3 dd ?
lpOffset dd ?
mouX dd ?
mouY dd ?
moveJh dd ?
Xscreen dd ?
Yscreen dd ?
frame dd ?
hdc dd ?
thjh dd ?
buff db 20 dup(?)
winRect RECT <?>
.const
szClassName db 'My 3D',0
BitMapAddr db 'BitMap.bmp',0
over db 'OVER',0
OpenError db '文件打開失敗(請您確定在當前目錄下有BitMap.bmp的位圖)',0dh,0ah
db '運行時請務必在此程序所在目錄中放一文件名為BitMap.bmp的地圖位圖',0
.code
_arcsin proc bord,hypotenuse,lpResult;此模塊用來求arcsin值(qword ptr lpResult = arcsin(bord÷hypotenuse(bord≤hypotenuse) ) )
local a:qword; ___________
local b:qword;arcsin(x/y)=arctan(x/(√ y^2-x^2 ))
push ebx
mov dword ptr[b+4],0
mov eax,bord
mul eax
mov ebx,eax
mov ecx,edx
mov eax,hypotenuse
mul eax
sub eax,ebx
sbb edx,ecx
mov dword ptr a,eax
mov dword ptr[a+4],edx
push bord
pop dword ptr b
finit
fild b
fild a
fsqrt
fpatan
fst a
mov ebx,lpResult
mov eax,ebx
push dword ptr a
push dword ptr[a+4]
pop dword ptr[ebx+4]
pop dword ptr[ebx]
pop ebx
ret
_arcsin endp
_arccos proc bord,hypotenuse,lpResult;此模塊用來求arccos值(qword ptr lpResult = arccos(bord÷hypotenuse(bord≤hypotenuse)))
local a:qword; __________
local b:qword;arccos(x/y)=arctan(√ y^2-x^2 /x ))
push ebx
mov dword ptr[b+4],0
mov eax,bord
mul eax
mov ebx,eax
mov ecx,edx
mov eax,hypotenuse
mul eax
sub eax,ebx
sbb edx,ecx
mov dword ptr a,eax
mov dword ptr[a+4],edx
push bord
pop dword ptr b
finit
fild a
fsqrt
fild b
fpatan
fst a
mov ebx,lpResult
mov eax,ebx
push dword ptr a
push dword ptr[a+4]
pop dword ptr[ebx+4]
pop dword ptr[ebx]
pop ebx
ret
_arccos endp
_prop proc DesAddr,SourAddr,DesWidth,DesHeigth;此模塊用來對打開的位圖進行縮放
LOCAL @propx;(DesAddr:目的位圖首地址,SourAddr:源位圖首地址,
LOCAL @propy;DesWidth:目的位圖寬度,DesHeigth:目的位圖高度)
LOCAL @Null1
LOCAL @Null2
LOCAL @LS
LOCAL @SourWidth
pushad
mov edi,DesAddr
mov esi,SourAddr
mov ecx,dword ptr[esi+10]
cld
rep movsb
mov edi,DesAddr
mov esi,SourAddr
push DesWidth
pop dword ptr[edi+18]
push DesHeigth
pop dword ptr[edi+22]
finit
fild dword ptr[esi+18]
fild dword ptr[edi+18]
fdiv
fst @propx
fild dword ptr[esi+22]
fild dword ptr[edi+22]
fdiv
fst @propy
mov eax,dword ptr[esi+18]
mov ebx,3
mul ebx
and eax,3h
mov ebx,4
sub ebx,eax
cmp ebx,4
jne @f
mov ebx,0
@@:
mov @Null1,ebx
mov eax,dword ptr[edi+18]
mov ebx,3
mul ebx
and eax,3h
mov ebx,4
sub ebx,eax
cmp ebx,4
jne @f
mov ebx,0
@@:
mov @Null2,ebx
mov eax,dword ptr[esi+18]
mov ebx,3
mul ebx
add eax,@Null1
mov @SourWidth,eax
mov eax,DesWidth
mul ebx
add eax,@Null2
mov ebx,DesHeigth
mul ebx
add eax,dword ptr[edi+10]
mov dword ptr[edi+2],eax
add esi,dword ptr[esi+10]
mov SourAddr,esi
add edi,dword ptr[edi+10]
mov ecx,0
Hlp:
push ecx
mov @LS,ecx
finit
fild @LS
fld @propy
fmul
fist @LS
mov eax,@LS
mov ebx,@SourWidth
mul ebx
mov esi,SourAddr
add esi,eax
mov ecx,0
mov ebx,3
@@:
mov @LS,ecx
finit
fild @LS
fld @propx
fmul
fist @LS
mov eax,@LS
mul ebx
add eax,esi
mov eax,dword ptr[eax]
mov dword ptr[edi],eax
add edi,3
inc ecx
cmp ecx,DesWidth
jne @b
add edi,@Null2
pop ecx
inc ecx
cmp ecx,DesHeigth
jne Hlp
popad
ret
_prop endp
_initTable proc;此模塊用來對程序中要重復計算的數據寫入表中,運行時直接查找卻可,降低CPU占用率
local @arc:qword
local @ls
local @ls1
local @ls2
local @R
;-----------------------------------------------------------------
;↓提取水平掃描線下方(256線變為163線),163=(256/π)*2
;-----------------------------------------------------------------
mov @ls,163
mov ebx,163
lea edi,Table1
@@:
invoke _arccos,ebx,163,addr @arc
finit
fld @arc
fimul @ls
fist @ls1
mov eax,@ls1
mov ecx,512*3
mul ecx
mov dword ptr[edi],eax
add edi,4
dec ebx
jnz @b
;------------------------------------------------------------------
;↓提取水平掃描線上方(256線變為163線)
;------------------------------------------------------------------
@@:
invoke _arcsin,ebx,163,addr @arc
finit
fld @arc
fimul @ls
fist @ls1
mov eax,@ls1
mov ecx,512*3
mul ecx
add eax,512*256*3
mov dword ptr[edi],eax
add edi,4
inc ebx
cmp ebx,163
jne @b
;------------------------------------------------------------------
;↓提取垂直線左163線
;------------------------------------------------------------------
lea edi,Table2
mov ebx,163
@@:
invoke _arccos,ebx,163,addr @arc
finit
fld @arc
fimul @ls
fist @ls1
mov eax,@ls1
mov ecx,3
mul ecx
mov dword ptr[edi],eax
add edi,4
dec ebx
jnz @b
;-----------------------------------------------------------
;↓提取垂直線右163線
;-----------------------------------------------------------
@@:
invoke _arcsin,ebx,163,addr @arc
finit
fld @arc
fimul @ls
fist @ls1
mov eax,@ls1
mov ecx,3
mul ecx
add eax,256*3
mov dword ptr[edi],eax
add edi,4
inc ebx
cmp ebx,163
jne @b
;-----------------------------------------------------------
;↓設置下163線每條水平線的寬度(此寬度為實際的1/2)
;-----------------------------------------------------------
lea edi,Rtable
mov ecx,163
@@:
mov eax,ecx
mul ecx
mov ebx,163*163
sub ebx,eax
mov @R,ebx
finit
fild @R
fsqrt
fist @R
mov eax,@R
mov dword ptr[edi],eax
add edi,4
dec ecx
jnz @b
;-----------------------------------------------------------
;↓設置上163線每條水平線的寬度(此寬度為實際的1/2)
;-----------------------------------------------------------
@@:
mov eax,ecx
mul ecx
mov ebx,163*163
sub ebx,eax
mov @R,ebx
finit
fild @R
fsqrt
fist @R
mov eax,@R
mov dword ptr[edi],eax
add edi,4
inc ecx
cmp ecx,163
jne @b
;-----------------------------------------------------------
;↓提取左垂直線163線轉每條球體水平線的寬度
;-----------------------------------------------------------
lea esi,Rtable
lea edi,Table3
mov ecx,163
@@:
push ecx
cmp dword ptr[esi],0
jz lop
finit
fild @ls
fidiv dword ptr[esi]
fst @R
mov eax,dword ptr[esi]
shl eax,1
mov @ls2,eax
mov ecx,0
lop1:
mov @ls1,ecx
finit
fld @R
fimul @ls1
fist @ls1
mov eax,@ls1
mov ebx,3
mul ebx
mov dword ptr[edi],eax
add edi,4
inc ecx
cmp ecx,@ls2
jne lop1
lop:
add esi,4
pop ecx
dec ecx
jnz @b
;-----------------------------------------------------------
;↓提取右垂直線163線轉每條球體水平線的寬度
;-----------------------------------------------------------
lea esi,Rtable
add esi,163*4
mov ecx,163
@@:
push ecx
cmp dword ptr[esi],0
jz lop2
finit
fild @ls
fidiv dword ptr[esi]
fst @R
mov eax,dword ptr[esi]
shl eax,1
mov @ls2,eax
mov ecx,0
lop3:
mov @ls1,ecx
finit
fld @R
fimul @ls1
fist @ls1
mov eax,@ls1
mov ebx,3
mul ebx
mov dword ptr[edi],eax
add edi,4
inc ecx
cmp ecx,@ls2
jne lop3
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -