我想更有效。当我要检查某个位置是否在“迷你边框”内时。我正在检查边界中的每个可能位置,并将其与实际位置进行比较。
例如,当我要检查某个位置是否独立于矩形时, 我正在输入左上角的位置,宽度和长度。然后,将像素位置之后的像素位置与实际位置进行比较。
PROC CHECK_IF_IN_BORDER
;THIS PROC IS CHECKING IF THE LOCATION IS INSITE AN RECTANGLE THAT ITS
;TOP LEFT CORNER IOS TOP_LEFT LOCATION OF BORDER AND ITS LENGTH
;AND WIDTH ARE SIMILAR TO WHAT YOU RECIVE FROM THE USER
;----------------GET-------------------;
;BP + 4 - TOP LEFT LOCATION OF BORDER ;
;BP + 6 - LENGTH ;
;BP + 8 - WIDTH ;
;BP + 10 - LOCATION ;
;--------------------------------------;
;------------RETURN--------------------;
; 1 - IF LOCATION IS IN BORDER ;
; 0 - IF LOCATION IS NOT IN BORDER ;
;--------------------------------------;
PUSH BP
MOV BP,SP
PUSH AX
PUSH DX
PUSH BX
MOV BX, 0
MOV AX,[BP+10]
CHECK_NEXT_LINE1:
MOV DX,0
CHECK_LINE1:
CMP AX,[BP+4]
JE IN_BORDER1
INC AX
INC DX
CMP DX,[BP+8] ;LENGTH
JNE CHECK_LINE1
;----------------
SUB AX,[BP+8] ;LENGTH
ADD AX,320
;----------------
INC BX
CMP BX, [BP+6] ;WIDTH
JNE CHECK_NEXT_LINE1
;NOT IN_BORDER:
MOV [BP+10], 0
JMP SOF_BORDERPROC1
IN_BORDER1:
MOV [BP+10], 1
SOF_BORDERPROC1:
POP BX
POP DX
POP AX
POP BP
RET 6
ENDP CHECK_IF_IN_BORDER
答案 0 :(得分:2)
您命名为 LENGTH 的实际上是 WIDTH ,因为它是指水平方向。
您命名的 WIDTH 实际上是 HEIGHT ,因为它是指垂直方向。
即使宽度比高度长得多,并且很容易谈论长度和宽度,这一点仍然适用。
还要注意,同样的困惑也导致了代码中的数字错误([bp+6]
与[bp+8]
)。
如何将数字类型位置设置为x,y类型位置
当前,您的程序使用(偏移)地址来引用像素。将此地址转换为(x,y)坐标很容易。它所要做的就是除以屏幕扫描线的长度。商({{1)}给出y坐标,余数(AX
)给出x坐标。
DX
矩形右下角的坐标为
(BottomRightX,BottomRightY)=(TopLeftX +宽度-1,TopLeftY +高度-1)
mov ax, [bp+10] ; LOCATION
xor dx, dx
mov cx, 320
div cx ; -> DX = X, AX = Y
mov si, dx ; X
mov di, ax ; Y
mov ax, [bp+4] ; TOP LEFT LOCATION OF BORDER
xor dx, dx
div cx ; -> DX = TopLeftX, AX = TopLeftY
这是我们现在拥有的:
mov bx, dx ; TopLeftX
add bx, [bp+6] ; + WIDTH
dec bx ; - 1
mov cx, ax ; TopLeftY
add cx, [bp+8] ; + HEIGHT
dec cx ; - 1
如果像素位于矩形内,则
<---------------WIDTH-------------->
(DX,AX) UpperLeft
*................................... ^
.............................o...... o is (SI,DI) TestPixel |
.................................... HEIGHT
.................................... |
...................................* v
(BX,CX) BottomRight
和DX <= SI <= BX
可以在汇编中转换为:
AX <= DI <= CX