점이 직사각형 내부에 있는지 확인


82

점이 사각형 안에 있는지 확인하고 싶습니다. 직사각형은 어떤 방식 으로든 방향이 지정 될 수 있으며 축 정렬이 필요하지 않습니다.

제가 생각할 수있는 한 가지 방법은 직사각형과 점 좌표를 회전하여 직사각형 축을 정렬 한 다음 단순히 점의 좌표가 직사각형의 좌표 내에 있는지 여부를 테스트하는 것입니다.

위의 방법에는 회전이 필요하므로 부동 소수점 연산이 필요합니다. 이를 수행하는 다른 효율적인 방법이 있습니까?


점이 회전 된 사각형의 직교 경계 상자에 있는지 확인하기 위해 빠른 검사를 수행 할 수 있으며 그렇지 않으면 빠른 실패입니다. (예, 대답의 절반에 불과합니다 (음, 모서리 점으로 형성 할 수있는 세 개의 직교 상자가 있습니다 ... 그리고 늦었습니다 (개념적 기하학이 가장 먼저 이동합니다)).
msw

하지만 먼저 오른쪽으로 회전해야합니까?
avd

1
사각형이 어떻게 정의되는지 알려주기 전까지는 대답에 실질적인 가치가 없습니다. 정수 좌표로 작업 할 때 모양을 나타내는 데 사용되는 방법은 알고리즘을 선택할 때 매우 중요합니다.
AnT 2010 년

답변:


80

직사각형은 어떻게 표현됩니까? 3 점? 4 점? 포인트, 측면 및 각도? 두 점과 측면? 다른 것? 그 사실을 모르면 질문에 답하려는 시도는 순전히 학문적 가치 만 가질 것입니다.

어쨌든 모든 볼록 다각형 (직사각형 포함)에 대해 테스트는 매우 간단합니다. 각 가장자리가 시계 반대 방향으로 향한다고 가정하고 다각형의 각 가장자리를 확인하고 점이 가장자리의 왼쪽 ( 왼쪽 에 있는지 테스트) -손 절반 평면). 모든 모서리가 테스트를 통과하면 점이 안쪽에 있습니다. 하나라도 실패하면 지점이 외부에 있습니다.

점이 (xp, yp)모서리의 왼쪽에 있는지 테스트 (x1, y1) - (x2, y2)하려면 다음을 계산하면됩니다.

D = (x2 - x1) * (yp - y1) - (xp - x1) * (y2 - y1)

인 경우 D > 0점은 왼쪽에 있습니다. 인 경우 D < 0점은 오른쪽에 있습니다. 인 경우 D = 0점이 선 위에 있습니다.


이 답변의 이전 버전은 겉보기에 다른 버전의 왼쪽 테스트를 설명했습니다 (아래 참조). 그러나 동일한 값을 계산한다는 것을 쉽게 알 수 있습니다.

... 점이 (xp, yp)모서리의 왼쪽에 있는지 여부를 테스트 하려면 모서리를 (x1, y1) - (x2, y2)포함하는 선에 대한 선 방정식을 작성해야합니다. 방정식은 다음과 같습니다

A * x + B * y + C = 0

어디

A = -(y2 - y1)
B = x2 - x1
C = -(A * x1 + B * y1)

이제 여러분이해야 할 일은

D = A * xp + B * yp + C

인 경우 D > 0점은 왼쪽에 있습니다. 인 경우 D < 0점은 오른쪽에 있습니다. 인 경우 D = 0점이 선 위에 있습니다.

그러나이 테스트는 다시 모든 볼록 다각형에 대해 작동하므로 직사각형에 비해 너무 일반적 일 수 있습니다. 사각형은 사각형, 예를 들어 ... 간단한 시험을 허용 (또는 다른 평행 사변형의)의 값을 수 AB테스트를 단순화하기 위해 이용 될 수있다 (즉, 병렬) 가장자리 반대에 대해 동일한 크기 만 다른 부호를 가지고 .


그것은 수학자 좌표 세트에만 해당됩니다. PC 화면과 GPS의 경우 축 방향이 다르며 올바른 방정식 세트가 있는지 확신 할 수 없습니다. 또는 그렇지 않은지 확신 할 수 있습니다. 내 대답이 더 낫습니다 :-).
Gangnus 2014

AndreyT @Gangnus, 빠른 정밀도, 방정식의 부호가 P와 관련하여 볼록한 모양의 모든 점에 대해 동일한 지 확인하면됩니다. 이렇게하면 좌표계 나 볼록한 모양이 어느 방향인지 걱정할 필요가 없습니다. 정의))
제이슨 로저스에게

2
속도를 높일 수있는 몇 가지 확장 기능이 있습니다. 1. 직사각형의 반대쪽 두 변이 평행하기 때문에 A, B 계수는 동일 할 수 있습니다. 다른 두 측면이 직각이 2 때문에, 이들 계수 A'및은 B'으로 주어질 수 A'=BB'=-A. 3. A xp + B yp두 모서리에 대해 계산 하는 포인트가 없으므로 단일 테스트로 결합하십시오. 그런 다음 직사각형에 있는지 테스트하면 (v_min < A xp + B yp < v_max) && ( w_min < B xp - A yp < w_max ).
Michael Anderson

@MichaelAnderson 그리고 무엇 v_min입니까?
Anonymous

v_min최소 값이고 A x + B y(코너에서 평가 될 때 최소값 임) 사각형 내부의 모든 값이. v_max해당 최대 값입니다. w_?값은 동일하지만,에 Bx - A y.
마이클 앤더슨

41

직사각형이 AB와 BC가 수직 인 세 점 A, B, C로 표시된다고 가정하면 AB 및 BC에서 쿼리 점 M의 투영 만 확인하면됩니다.

0 <= dot(AB,AM) <= dot(AB,AB) &&
0 <= dot(BC,BM) <= dot(BC,BC)

AB좌표 (Bx-Ax, By-Ay)가있는 벡터 AB dot(U,V)이며 벡터 U 및 V :의 내적 Ux*Vx+Uy*Vy입니다.

업데이트 . 이를 설명하기 위해 A (5,0) B (0,2) C (1,5) 및 D (6,3)를 예로 들어 보겠습니다. 점 좌표에서 AB = (-5,2), BC = (1,3), dot (AB, AB) = 29, dot (BC, BC) = 10을 얻습니다.

쿼리 포인트 M (4,2)의 경우 AM = (-1,2), BM = (4,0), dot (AB, AM) = 9, dot (BC, BM) = 4가 있습니다. M은 직사각형 안에 있습니다.

쿼리 포인트 P (6,1)의 경우 AP = (1,1), BP = (6, -1), dot (AB, AP) =-3, dot (BC, BP) = 3입니다. 측면 AB의 투영이 세그먼트 AB 내부가 아니기 때문에 P는 직사각형 내부가 아닙니다.


1
0,2-10,2-10,10-2,10은 직사각형이 아닙니다.
Eric Bainville 2013

2
포인트를 플로팅하고 첫 번째 의견의 정확성을 확인하십시오.
Eric Bainville 2013

3
이것이 최고의 답변입니다!
Tahlil

1
이 답변이 간결하고 여기에있는 다른 좋은 답변만큼 작거나 적은 작업 수를 유지하면서도 매우 직관적이고 시각화 할 수 있다는 장점이 있다는 점이 좋습니다.
Anonymous

22

나는 Eric Bainville의 대답을 빌 렸습니다.

0 <= dot(AB,AM) <= dot(AB,AB) && 0 <= dot(BC,BM) <= dot(BC,BC)

자바 스크립트에서 다음과 같이 보입니다.

function pointInRectangle(m, r) {
    var AB = vector(r.A, r.B);
    var AM = vector(r.A, m);
    var BC = vector(r.B, r.C);
    var BM = vector(r.B, m);
    var dotABAM = dot(AB, AM);
    var dotABAB = dot(AB, AB);
    var dotBCBM = dot(BC, BM);
    var dotBCBC = dot(BC, BC);
    return 0 <= dotABAM && dotABAM <= dotABAB && 0 <= dotBCBM && dotBCBM <= dotBCBC;
}

function vector(p1, p2) {
    return {
            x: (p2.x - p1.x),
            y: (p2.y - p1.y)
    };
}

function dot(u, v) {
    return u.x * v.x + u.y * v.y; 
}

예 :

var r = {
    A: {x: 50, y: 0},
    B: {x: 0, y: 20},
    C: {x: 10, y: 50},
    D: {x: 60, y: 30}
};

var m = {x: 40, y: 20};

그때:

pointInRectangle(m, r); // returns true.

다음은 시각적 테스트로 출력을 그리는 코드 펜입니다. :) http://codepen.io/mattburns/pen/jrrprN

여기에 이미지 설명 입력


안녕하세요 @matt burns 귀하의 방법을 사용하여 테스트 프로젝트에 넣었습니다. jsfiddle.net/caymanbruce/06wjp2sk/6 하지만 작동하게 만들 수 없습니다. 회전하지 않고 원래 사각형 내의 점을 여전히 테스트하는 이유를 알 수 없습니다. mouseover내 프로젝트에서 이벤트를 사용 하므로 마우스가 사각형 내부에 있어야하는 지점 위에있을 때마다 마우스 주위에 검은 색 원 점이 표시되고 사각형 외부에는 아무것도 표시되지 않습니다. 작동하려면 도움이 필요하지만 너무 혼란 스럽습니다.
newguy

mouseover이어야합니다 mousemove. 오타입니다.
newguy


원칙적으로 귀하의 방법은 정확하지만 귀하의 직사각형은 귀하의 예에서 직사각형이 아닙니다. 나는 원래의 공식과 이름 지정 체계를 고수하고 입력이 실제로 진정한 직사각형 인 여기 에서 개선 된 버전을 만들었습니다 .
JohannesB

15
# Pseudo code
# Corners in ax,ay,bx,by,dx,dy
# Point in x, y

bax = bx - ax
bay = by - ay
dax = dx - ax
day = dy - ay

if ((x - ax) * bax + (y - ay) * bay < 0.0) return false
if ((x - bx) * bax + (y - by) * bay > 0.0) return false
if ((x - ax) * dax + (y - ay) * day < 0.0) return false
if ((x - dx) * dax + (y - dy) * day > 0.0) return false

return true

이것을 다음과 같이 읽으십시오. "점을 직사각형의 세 꼭지점에 연결하면 해당 세그먼트와 측면 사이의 각도가 예각이어야합니다."
P Shved

3
이와 같은 접근 방식의 문제점은 이론적으로는 작동하지만 구문에서는 문제가 발생할 수 있다는 것입니다. OP는 직사각형이 어떻게 표현되는지 말하지 않았습니다. 이 대답은 세 점 a, b및으로 표시된다고 가정합니다 d. 세 점이 이론상 임의의 직사각형을 나타내는 유효한 방법이지만 실제로 는 일반적인 경우에 interger 좌표에서 정확하게 수행하는 것은 불가능합니다 . 일반적으로 직사각형에 매우 가깝지만 여전히 직사각형이 아닌 평행 사변형으로 끝납니다.
AnT 2010 년

3
즉, 그 모양의 각도는 정확히 90 도가 아닙니다. 이러한 상황에서 각도 기반 테스트를 할 때 매우주의해야합니다. 다시 말하지만 OP가 부정확하게 표현 된 "사각형"에 대해 "내부"를 정의하는 방법에 따라 다릅니다. 그리고 다시 직사각형이 어떻게 표현되는지에 대해 설명합니다.
AnT 2010 년

두 댓글 모두에 +1하세요. @avd만이 이것이 충분한 지 알려줄 수 있습니다.
Jonas Elfström 2010 년

나를 위해 완벽하게 작동합니다 ... 삼각법과 기하학을 자주 사용하므로 일반적인 문제를 해결하기 위해 공식을 만들 필요가 없습니다. 감사.
sq2

12

나는 이것이 오래된 스레드라는 것을 알고 있지만 순전히 수학적 관점에서 이것을 보는 데 관심이있는 사람에게는 수학 스택 교환에 대한 훌륭한 스레드가 있습니다.

/math/190111/how-to-check-if-a-point-is-inside-a-rectangle

편집 :이 스레드에서 영감을 받아 요점이 어디에 있는지 빠르게 결정하기위한 간단한 벡터 방법을 모았습니다.

시계 방향으로 p1 = (x1, y1), p2 = (x2, y2), p3 = (x3, y3) 및 p4 = (x4, y4)에 점이있는 직사각형이 있다고 가정합니다. 점 p = (x, y)가 사각형 안에 있으면 내적 (p-p1). (p2-p1)은 0과 | p2-p1 | ^ 2 및 (p-p1) 사이에 있습니다. (p4-p1)은 0과 | p4-p1 | ^ 2 사이에 있습니다. 이것은 p1을 원점으로하여 직사각형의 길이와 너비를 따라 벡터 p-p1을 투영하는 것과 같습니다.

동등한 코드를 표시하면 더 의미가있을 수 있습니다.

p21 = (x2 - x1, y2 - y1)
p41 = (x4 - x1, y4 - y1)

p21magnitude_squared = p21[0]^2 + p21[1]^2
p41magnitude_squared = p41[0]^2 + p41[1]^2

for x, y in list_of_points_to_test:

    p = (x - x1, y - y1)

    if 0 <= p[0] * p21[0] + p[1] * p21[1] <= p21magnitude_squared:
        if 0 <= p[0] * p41[0] + p[1] * p41[1]) <= p41magnitude_squared:
            return "Inside"
        else:
            return "Outside"
    else:
        return "Outside"

그리고 그게 다야. 평행 사변형에서도 작동합니다.


지금까지의 논의를 요약 할 수 있습니까? 그렇지 않다면 이것은 아마도 대답이 아니라 주석이었을 것입니다. 더 많은 담당자 가 있으면 댓글을 게시 할 수 있습니다 .
Nathan Tuggy 2015 년

7
bool pointInRectangle(Point A, Point B, Point C, Point D, Point m ) {
    Point AB = vect2d(A, B);  float C1 = -1 * (AB.y*A.x + AB.x*A.y); float  D1 = (AB.y*m.x + AB.x*m.y) + C1;
    Point AD = vect2d(A, D);  float C2 = -1 * (AD.y*A.x + AD.x*A.y); float D2 = (AD.y*m.x + AD.x*m.y) + C2;
    Point BC = vect2d(B, C);  float C3 = -1 * (BC.y*B.x + BC.x*B.y); float D3 = (BC.y*m.x + BC.x*m.y) + C3;
    Point CD = vect2d(C, D);  float C4 = -1 * (CD.y*C.x + CD.x*C.y); float D4 = (CD.y*m.x + CD.x*m.y) + C4;
    return     0 >= D1 && 0 >= D4 && 0 <= D2 && 0 >= D3;}





Point vect2d(Point p1, Point p2) {
    Point temp;
    temp.x = (p2.x - p1.x);
    temp.y = -1 * (p2.y - p1.y);
    return temp;}

다각형 내부의 점

방금 C ++를 사용하여 AnT의 답변을 구현했습니다. 이 코드를 사용하여 픽셀의 좌표 (X, Y)가 모양 안에 있는지 여부를 확인했습니다.


여기서하는 일에 대한 설명이 정말 도움이 될 것입니다.
Brad

그냥 고맙다고 말하고 싶었어요. Unity 셰이더에 필요한 작업을 변환하여 4 점 대신 3 점으로 줄였습니다. 잘 작동했습니다! 건배.
Dustin Jensen

그것은 나를 위해 일했습니다. 여기 Unity DOTS를 위해 만든 C # 구현이 있습니다. gist.github.com/rgoupil/04b59be8ddb56c992f25e1489c61b310
JamesDev

6

직사각형의 문제를 해결할 수 없다면 문제를 더 쉬운 문제로 나누십시오. 사각형을 2 개의 삼각형으로 나누고 여기에 설명 된 것처럼 점이 그 안에 있는지 확인합니다.

기본적으로 한 점에서 두 쌍의 선마다 가장자리를 순환합니다. 그런 다음 외적을 사용하여 점이 외적을 사용하여 두 선 사이에 있는지 확인합니다. 세 점 모두에 대해 확인 된 경우 점은 삼각형 내부에 있습니다. 이 방법의 좋은 점은 각도를 확인할 때 발생하는 부동 소수점 오류를 생성하지 않는다는 것입니다.


맞습니다 만 매우 비효율적 인 알고리즘입니다.
Gangnus

4

점이 직사각형 안에있는 경우. 비행기에서. 수학자 또는 측지학 (GPS) 좌표 용

  • 사각형은 꼭지점 A, B, C, D로 설정합니다. 점은 P입니다. 좌표는 사각형 : x, y입니다.
  • 직사각형의 측면을 연장 할 수 있습니다. 그래서 우리는 4 개의 직선 l AB , l BC , l CD , l DA , 또는 짧음의 경우 l 1 , l 2 , l 3 , l 4 .
  • 모든 l i에 대한 방정식을 만드십시오 . 등식은 다음과 같습니다.

    f i (P) = 0.

P는 점입니다. l i 에 속하는 점의 경우 방정식이 참입니다.

  • 방정식의 좌변에 함수가 필요합니다. 그들은 f 1 , f 2 , f 3 , f 4 입니다.
  • l i 의 한쪽에있는 모든 점에 대해 함수 f i 가 0보다 크고 다른 쪽 f i의 점이 0보다 작습니다.
  • 따라서 P가 직사각형에 있는지 확인하는 경우 p가 네 선 모두의 올바른면에 있어야합니다. 그래서 우리는 네 가지 기능의 징후를 확인해야합니다.
  • 그러나 사각형이 속한 선의 어느 쪽이 올바른 쪽입니까? 선에 속하지 않는 사각형의 꼭지점이있는 쪽입니다. 확인을 위해 우리는 속하지 않은 두 정점 중 하나를 선택할 수 있습니다.
  • 그래서 우리는 이것을 확인해야합니다 :

    f AB (P) f AB (C)> = 0

    f BC (P) f BC (D)> = 0

    f CD (P) f CD (A)> = 0

    f DA (P) f DA (B)> = 0

점이 테두리에 있으면 사각형에도 속하기 때문에 불평형은 엄격하지 않습니다. 경계에 점이 필요하지 않은 경우 엄격한 점에 대한 방정식을 변경할 수 있습니다. 그러나 부동 소수점 연산에서 작업하는 동안 선택은 관련이 없습니다.

  • 직사각형에있는 점의 경우 네 가지 방정식이 모두 참입니다. 모든 볼록 다각형에서도 작동하며 선 / 방정식의 수만 다를 것입니다.
  • 남은 것은 두 점을 통과하는 선에 대한 방정식을 얻는 것입니다. 잘 알려진 선형 방정식입니다. 선 AB와 점 P에 대해 작성해 보겠습니다.

    f AB (P) ≡ (x A -x B ) (y P -y B )-(y A -y B ) (x P -x B )

수표는 간단해질 수 있습니다. 직사각형을 시계 방향으로 따라갑니다 -A, B, C, D, A. 그러면 모든 올바른면이 선의 오른쪽에 있습니다. 따라서 우리는 다른 정점이있는 쪽과 비교할 필요가 없습니다. 그리고 우리는 더 짧은 방정식 세트를 확인해야합니다.

f AB (P)> = 0

f BC (P)> = 0

f CD (P)> = 0

f DA (P)> = 0

그러나 이것은 정규 수학자 (학교 수학의) 좌표 집합에 대해 옳습니다. 여기서 X는 오른쪽에 Y는 위쪽에 있습니다. 그리고 GPS에서 사용되는 측지 좌표의 경우 X는 상단, Y는 오른쪽에 있으므로 방정식을 바꿔야합니다.

f AB (P) <= 0

f BC (P) <= 0

f CD (P) <= 0

f DA (P) <= 0

축의 방향이 확실하지 않은 경우이 단순화 된 검사에주의하십시오. 올바른 방정식을 선택한 경우 알려진 배치가있는 한 점을 확인하십시오.


"X가 맨 위에 있고 Y가 오른쪽에있는 경우, 방정식을 바꿔야합니다."그것은 "시계 방향"을 어떻게 결정 하느냐에 달려 있습니다. 좌표를 수학적 좌표로 간주하면 시계 방향이 자동으로 시계 반대 방향이되며 첫 번째 동일한 부등식 집합을 사용할 수 있습니다. 즉, 좌표를 모든 측면에서 수학적 좌표라고 생각하면 이러한 혼란없이 잘 진행될 수 있습니다. 좌표를 반전하거나 교환해도이 술어에는 영향을 미치지 않습니다.
Palo

@Palo Mathematics 자체로는 오리엔테이션이 없습니다. 예. 그러나 알고리즘에는 몇 가지 포인트가 있으며 테스트 할 수 있기 위해서는 어느 시점에서든 (실제에서) 이해할 수 있고 합리적인 결과를 얻는 것이 훨씬 낫습니다. 두 번째 문장의 끝까지 그것이 없으면 공간 상상력을 사용하여 방정식을 올바르게 풀고 있는지 거의 확인할 수 없습니다.
Gangnus

0

내가 생각한 가장 쉬운 방법은 사각형의 축에 점을 투영하는 것입니다. 설명하겠습니다.

직사각형의 중심에서 위쪽 또는 아래쪽 가장자리와 왼쪽 또는 오른쪽 가장자리까지 벡터를 얻을 수 있다면. 또한 직사각형의 중심에서 포인트까지 벡터가 있습니다. 해당 포인트를 너비 및 높이 벡터에 투영 할 수 있습니다.

P = 점 벡터, H = 높이 벡터, W = 폭 벡터

벡터를 크기로 나누어 단위 벡터 W ', H'얻기

proj_P, H = P-(P.H ') H'proj_P, W = P-(P.W ') W'

내가 잘못 생각하지 않는 한, 내가 생각하지 않는 한 ... (내가 틀렸다면 수정하십시오) 그러나 높이 벡터에 대한 점의 투영 크기가 높이 벡터의 크기보다 작다면 (즉, 직사각형 높이의 절반) 너비 벡터에 대한 점의 투영 크기는 직사각형 내부에 점이 있습니다.

범용 좌표계가있는 경우 벡터 빼기를 사용하여 높이 / 너비 / 점 벡터를 계산해야 할 수 있습니다. 벡터 투영은 놀랍습니다! 기억.


0

연속 매트 대답. 우리는 사용할 필요가 /math/190111/how-to-check-if-a-point-is-inside-a-rectangle/190373#190373 작동하도록 솔루션을

아래는 작동하지 않습니다
0 <= dot (AB, AM) <= dot (AB, AB) && 0 <= dot (BC, BM) <= dot (BC, BC)

아래 작품
0 <= dot (AB, AM) <= dot (AB, AB) && 0 <= dot (AM, AC) <= dot (AC, AC)

아래에 javascript 콘솔 // Javascript 솔루션을 붙여 넣어 확인하십시오.

            var screenWidth = 320;
            var screenHeight = 568;
            var appHeaderWidth = 320;
            var AppHeaderHeight = 65;
            var regionWidth = 200;
            var regionHeight = 200;

            this.topLeftBoundary = {
                A: {x: 0, y: AppHeaderHeight},
                B: {x: regionWidth, y: AppHeaderHeight},
                C: {x: 0, y: regionHeight + AppHeaderHeight},
                D: {x: regionWidth, y: regionHeight + AppHeaderHeight}
            }

            this.topRightBoundary = {
                A: {x: screenWidth, y: AppHeaderHeight},
                B: {x: screenWidth - regionWidth, y: AppHeaderHeight},
                C: {x: screenWidth, y: regionHeight + AppHeaderHeight},
                D: {x: screenWidth - regionWidth, y: regionHeight + AppHeaderHeight}
            }

            this.bottomRightBoundary = {
                A: {x: screenWidth, y: screenHeight},
                B: {x: screenWidth - regionWidth, y: screenHeight},
                C: {x: screenWidth, y: screenHeight - regionHeight},
                D: {x: screenWidth - regionWidth, y: screenHeight - regionHeight}
            }

            this.bottomLeftBoundary = {
                A: {x: 0, y: screenHeight},
                B: {x: regionWidth, y: screenHeight},
                C: {x: 0, y: screenHeight - regionHeight},
                D: {x: regionWidth, y: screenHeight - regionHeight}
            }
            console.log(this.topLeftBoundary);
            console.log(this.topRightBoundary);
            console.log(this.bottomRightBoundary);
            console.log(this.bottomLeftBoundary);

            checkIfTapFallsInBoundary = function (region, point) {
                console.log("region " + JSON.stringify(region));
                console.log("point" + JSON.stringify(point));

                var r = region;
                var m = point;

                function vector(p1, p2) {
                    return {
                        x: (p2.x - p1.x),
                        y: (p2.y - p1.y)
                    };
                }

                function dot(u, v) {
                    console.log("DOT " + (u.x * v.x + u.y * v.y));
                    return u.x * v.x + u.y * v.y;
                }

                function pointInRectangle(m, r) {
                    var AB = vector(r.A, r.B);
                    var AM = vector(r.A, m);
                    var AC = vector(r.A, r.C);
                    var BC = vector(r.B, r.C);
                    var BM = vector(r.B, m);

                    console.log("AB " + JSON.stringify(AB));
                    console.log("AM " + JSON.stringify(AM));
                    console.log("AM " + JSON.stringify(AC));
                    console.log("BC " + JSON.stringify(BC));
                    console.log("BM " + JSON.stringify(BM));

                    var dotABAM = dot(AB, AM);
                    var dotABAB = dot(AB, AB);
                    var dotBCBM = dot(BC, BM);
                    var dotBCBC = dot(BC, BC);
                    var dotAMAC = dot(AM, AC);
                    var dotACAC = dot(AC, AC);

                    console.log("ABAM " + JSON.stringify(dotABAM));
                    console.log("ABAB " + JSON.stringify(dotABAB));
                    console.log("BCBM " + JSON.stringify(dotBCBM));
                    console.log("BCBC " + JSON.stringify(dotBCBC));
                    console.log("AMAC " + JSON.stringify(dotAMAC));
                    console.log("ACAC" + JSON.stringify(dotACAC));

                    var check = ((0 <= dotABAM && dotABAM <= dotABAB) && (0 <= dotBCBM && dotBCBM <= dotBCBC));
                    console.log(" first check" + check);
                    var check = ((0 <= dotABAM && dotABAM <= dotABAB) && (0 <= dotAMAC && dotAMAC <= dotACAC));
                    console.log("second check" + check);
                    return check;
                }

                return pointInRectangle(m, r);
            }

        //var point = {x: 136, y: 342};

            checkIfTapFallsInBoundary(topLeftBoundary, {x: 136, y: 342});
            checkIfTapFallsInBoundary(topRightBoundary, {x: 136, y: 274});
            checkIfTapFallsInBoundary(bottomRightBoundary, {x: 141, y: 475});
            checkIfTapFallsInBoundary(bottomRightBoundary, {x: 131, y: 272});
            checkIfTapFallsInBoundary(bottomLeftBoundary, {x: 131, y: 272});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.