선분의 법선 벡터는 어떻게 계산합니까?


177

(x1, y1)에서 (x2, y2)로가는 선 세그먼트가 있다고 가정하십시오. 선에 수직 인 법선 벡터는 어떻게 계산합니까?

3D 평면에서이 작업을 수행하는 데 대한 많은 정보를 찾을 수 있지만 2D 항목은 없습니다.

수학 (쉬운 예제, 다이어그램 또는 알고리즘에 대한 링크는 환영합니다)에 쉽게 가십시오. 저는 수학자보다 프로그래머입니다.)


2
그리고이 배후의 "수학"에 대해 알고 싶다면 stackoverflow.com/a/7470098/189767 에서 내 대답을 찾을 수 있습니다 . 기본적으로 동일하지만 더 정교합니다.
Andreas

2
이 질문은 프로그래밍이 아니라 수학에 관한 것입니다.
Charlie

1
이 질문은 프로그래밍이 아니라 수학에 관한 것이므로 주제를 벗어난 주제로 마무리하려고합니다.
Pang

답변:


237

dx = x2-x1 및 dy = y2-y1을 정의하면 법선은 (-dy, dx) 및 (dy, -dx)입니다.

나누기가 필요하지 않으므로 0으로 나눌 위험이 없습니다.


14
매우 미묘하고 normal.x = -dy 및 normal.y = dx를 깨닫는 데 시간이 걸렸습니다. x 값을 y 값에 할당하는 오타처럼 보였기 때문에 다른 방법을 사용했습니다.
Piku

@OrenTrutner 나는 아직도 이것을 이해하지 못한다; (x', y') = (-y, x)그리고 (x', y') = (y, -x)바로 것 같다,하지만 왜 하나 사용하는 것이 dxdy여기. 또한, 경사에 기초하여 m1 * m2 = -1직각 라인에 대해, dy' = dx' * (-dx/dy)그리고 dx' = dy' * (-dy/dx)방정식에서 어떻게 오는가 normal.x = x' = -dy?
legends2k

1
델타가 어떻게 역할을하는지 자세히 설명해 주시겠습니까? 여기에 뭔가 빠진 것 같습니다.
legends2k

7
@ legends2k : 델타는 탄젠트 벡터입니다. 법선은 접선에 수직 인 방향입니다. 90도 회전을 위해 2D 행렬을 보면 x / y 값을 뒤집고 무시하는 것이 분명해집니다. en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon

@geon : 아아! 아핀 기하에, 두 지점 사이의 차이가 벡터 여기 tanget :) 동안을 얻었다 I 슬로프 델타 혼동 된
legends2k

95

그것을 생각하는 또 다른 방법은 주어진 방향에 대한 단위 벡터를 계산 한 다음 반 시계 방향으로 90도 회전하여 법선 벡터를 얻는 것입니다.

일반적인 2D 변환의 행렬 표현은 다음과 같습니다.

x' = x cos(t) - y sin(t)
y' = x sin(t) + y cos(t)

여기서 (x, y)는 원래 벡터의 구성 요소이고 (x ', y')는 변환 된 구성 요소입니다.

t = 90도이면 cos (90) = 0 및 sin (90) = 1입니다.이를 곱하고 곱하면 다음과 같은 결과가 나타납니다.

x' = -y
y' = +x

이전에 제공된 것과 동일한 결과이지만 그 출처에 대해 조금 더 설명합니다.


2
고마워, 어떻게 파생되는지 내 머리를 깨고 있었다.
legends2k

1
회전 공식을 미리 알고 있었지만이 대답으로 내 머리를 클릭 한 것은 각도가 일정하고 (+/- 90) x와 y의 간단한 부정과 반전으로 단순화합니다.
legends2k

@duffymo 결과의 길이는 1입니까?
Martin Meeser

벡터가 변환 전에 정규화되면 그 후에도 그대로 유지됩니다. 회전 변환을 수행하기 전후에 정규화해야합니다.
duffymo

11

이 질문은 오래 전에 게시되었지만 다른 답변 방법을 찾았습니다. 그래서 여기서 공유하기로 결정했습니다.
먼저, 두 벡터가 수직 인 경우 내적은 0과 같습니다.
법선 벡터를 (x',y')연결하는 선에 직교 (x1,y1)하고 (x2,y2). 이 줄은 방향이 (x2-x1,y2-y1), 또는 (dx,dy).
그래서,

(x',y').(dx,dy) = 0
x'.dx + y'.dy = 0

위의 방정식을 만족하는 많은 쌍 (x ', y')입니다. 그러나 항상 만족하는 가장 좋은 쌍은 (dy,-dx)또는(-dy,dx)


7
m1 = (y2 - y1) / (x2 - x1)

수직 두 줄인 경우 :

m1*m2 = -1

그때

m2 = -1 / m1 //if (m1 == 0, then your line should have an equation like x = b)

y = m2*x + b //b is offset of new perpendicular line.. 

당신이 정의 한 지점에서 그것을 전달하려는 경우 b는 무언가입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.