Как сделать местоположение типа числа к x, y типу местоположения - PullRequest
2 голосов
/ 30 апреля 2019

Я хочу быть более эффективным. Когда я хочу проверить, находится ли местоположение внутри «мини-границы». Я проверял каждое возможное местоположение на границе и сравнивал его с фактическим местоположением.

Например, когда я хотел проверить, является ли местоположение инди-прямоугольником, Я вводил верхнее левое местоположение, ширину и длину. Затем, сравнивая местоположение пикселя после местоположения пикселя с фактическим местоположением.

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

1 Ответ

2 голосов
/ 01 мая 2019

Сначала давайте будем точными

То, что вы назвали ДЛИНА на самом деле ШИРИНА , поскольку оно относится к горизонтальному направлению.
То, что вы назвали WIDTH , на самом деле HEIGHT , потому что оно относится к вертикальному направлению.

Это остается верным, даже если ширина намного больше, чем высота, и когда становится заманчивым говорить о длине и ширине.

Также обратите внимание, что эта же путаница привела к числовой ошибке в вашем коде ([bp+6] против [bp+8]).

Тогда решите проблему

Как сделать местоположение типа числа в x, y типе местоположения

В настоящее время ваша программа использует (смещение) адрес для ссылки на пиксель. Этот адрес легко преобразовать в координаты (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 <= BX и AX <= 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
...