두 개의 2D 벡터가 주어지면 두 번째 벡터가 첫 번째 또는 왼쪽의 오른쪽에 있는지 여부를 어떻게 알 수 있습니까?하나의 2D 벡터가 다른 벡터의 오른쪽 또는 왼쪽에 있는지 확인
예를 들어, 이들 도면에서 B 당신은 내적을 이용하여이를 달성 할 수있는
A B . .----> A
^ ¬ |\ |
|/ | \ |
|/ V \ V
. B A B
두 개의 2D 벡터가 주어지면 두 번째 벡터가 첫 번째 또는 왼쪽의 오른쪽에 있는지 여부를 어떻게 알 수 있습니까?하나의 2D 벡터가 다른 벡터의 오른쪽 또는 왼쪽에 있는지 확인
예를 들어, 이들 도면에서 B 당신은 내적을 이용하여이를 달성 할 수있는
A B . .----> A
^ ¬ |\ |
|/ | \ |
|/ V \ V
. B A B
의 오른쪽에있다. dot(a, b) == a.x*b.x + a.y*b.y
는 벡터가 수직 여부를 찾을 수 있습니다 :
var dot = a.x*b.x + a.y*b.y
if(dot > 0)
console.log("<90 degrees")
else if(dot < 0)
console.log(">90 degrees")
else
console.log("90 degrees")
다른 방법을 넣습니다. dot > 0
은 a
이 "앞에오다"인 경우 b
을 알려줍니다.
는 b
이 a
의 오른쪽에있는 가정합니다. b
을 시계 반대 방향으로 90도 회전하면 a
앞에 표시됩니다.
a
의 왼쪽에 b
이 있다고 가정하십시오. b
을 시계 반대 방향으로 90도 회전하면 a
뒤에 표시됩니다.
그러므로 dot(a, rot90CCW(b))
부호는 b가 rot90CCW(b) == {x: -b.y, y: b.x}
의 오른쪽 또는 왼쪽에 있는지 알려줍니다.
Simplyifying : @Eric에서 주석의 설명에서
var dot = a.x*-b.y + a.y*b.x;
if(dot > 0)
console.log("b on the right of a")
else if(dot < 0)
console.log("b on the left of a")
else
console.log("b parallel/antiparallel to a")
, ? "그것의 측면은 B에 놀라운 발전 점, 만약"
이 공식에서 대답은 간단합니다. "A"는 예에서와 같이 x 좌표가 0 일 때를 가리 킵니다. 이 가정에서 "B"는 x 좌표가 양수이고 오른쪽이 음수 일 때 왼쪽에 있고 0 일 때도 아닙니다.
일반 위치에서 "A"로 확장하면 다음과 같이 새로운 좌표계가 도입됩니다. "A가 앞으로 가리키는 좌표계에서 ...". 가장 단순한 새로운 좌표계는 기본 벡터가 A
및 (1,0)
인 좌표계입니다. (A가 (1,0)
의 배수이면 기본 상황을 단지 90도 회전합니다.) 좌표 변환은 L : P = (P_x, P_y) --> P' = (P'_x, P'_y) = (A_y * P_x - A_x * P_y, P_y)
입니다. 이러한 종류의 선형 변환을 왜곡 변환이라고합니다. 테스트는 좌표 P'_x
의 부호입니다. L이 A를 새로운 좌표계에서 벡터 (0,1)로 가져 갔는지 확인하십시오. 이 방법은 다른 대답과 동일한 산술을 사용합니다.
더 자세한 기하학적 내용이 밝혀 질 수 있도록이 글을 썼습니다.
@Eric 그러나 벡터 크기가 크게 다를 경우 내적 제품에 근본적인 문제가 있습니다.
var dot = a.x * -b.y + a.y * b.x;
만약 (2, -2)와 b (-500, -500) 명확 B는 왼쪽에,하지만 난 것을 지적해야한다가 0보다 큰
에 오는 내적을하고 주어진 'A'와 'B'를 사용하여 예제를 취하고 대신에 '-A'와 '-B'를 보면, 각각 반대 방향을 가리키고 -B는 -A의 왼쪽에 있습니다.그러나 점 제품은 동일합니다. 즉, 코드가 반대의 대답을 제공합니다. 문제를 어떻게 정의했는지에 대한 대답은 내적 제품의 부호 이상입니다. – eh9
@ eh9; 아니, B를 둘 다 거꾸로하면 오른쪽에 있어야합니다. 나는 "A가 앞으로 가리킬 경우, 어느 쪽이 B인지"라는 질문을 던집니다. – Eric