如何将数字类型位置转换为 x,y 类型位置?

How to make a number type location to x,y type location?

我想在检查某个位置是否在“迷你边界”内时提高效率。我正在检查边界中的每个可能位置并将其与实际位置进行比较。

例如,当我想检查一个位置是否是一个独立的矩形时, 我提供了它的左上角位置、宽度和长度。然后,逐个像素位置与实际位置进行比较。

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

首先要准确

你命名的LENGTH实际上是WIDTH因为它指的是水平方向
你命名的WIDTH实际上是HEIGHT因为它指的是垂直方向

即使宽度比高度长得多,而且谈论长度和宽度变得很诱人,这仍然是正确的。

另请注意,同样的混淆在您的代码中引入了数字错误([bp+6][bp+8])。

然后解决问题

How to make a number type location to x,y type location

目前您的程序使用(偏移)地址来引用像素。很容易将此地址转换为 (x,y) 坐标。它所需要的只是除以屏幕扫描线的长度。商 (AX) 为您提供 y 坐标,余数 (DX) 为您提供 x 坐标。

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

矩形右下角的坐标是

(BottomRightX, BottomRightY) = (TopLeftX + 宽度 - 1, TopLeftY + 高度 - 1)

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 <= BXAX <= DI <= CX

在汇编中翻译成:

    mov     word [bp+10], 0   ; LOCATION IS NOT IN BORDER
    cmp     dx, si
    ja      Outside
    cmp     si, bx
    ja      Outside
    cmp     ax, di
    ja      Outside
    cmp     di, cx
    ja      Outside
    inc     word [bp+10]      ; LOCATION IS IN BORDER
Outside:
    ; all the pops that you need ...
    ret     6