2009-12-17 7 views
10

나는 선분의 ​​끝점과 내가 만들고자하는 수직 끝 캡의 거리/크기를 알고 있지만, 수직선의 끝점을 계산할 필요가있다. 나는 45-45-90 삼각형과 점들이 찍힌 제품을 사용하여 벽에 머리를 두드 리고 있었지만 나는 그것을 함께 만들 수없는 것처럼 보였다.수직선 선분의 끝점 계산 방법은 무엇입니까?

나는 파란색으로 점을 알고 빨간색으로 점까지 거리를 알기 때문에 점을 빨간색으로 찾아야합니다.

중복으로 표시하기 전에 나는 this question에 게시 된 답변을 시도했지만 끝이 항상 수직이었습니다.

http://rauros.net/files/caps.png http://rauros.net/files/caps.png

+0

수직선을 만나기를 원하는 알려진 선의 지점에 따라 달라집니다. 예제 다이어그램은 알려진 선의 중간 지점에있는 것처럼 보입니다. – ZombieSheep

+0

예, 빨간색 선의 중간 점에서 교차해야합니다. – basszero

+0

관련 항목 : [대각선에서 직각 오프셋 계산] (http://stackoverflow.com/q/17195055/183120). – legends2k

답변

16

B1이 2 개 빨간색 점 사이의 파란색 점이며, B2는 다음이 작업을 수행하는 방법 다른 블루 포인트 인 경우입니다 :

  • 찾기 B1 - B2
  • 표준화이 벡터
  • 이어서 (이는 R1 임) B1으로
  • 스와이 벡터를 추가 90 °
  • 의해 적색 점
  • 회전 사이의 거리의 절반에 의해이 벡터를 스케일링 이 벡터를 B1에서 빼기 (이것은 R2 임)

위의 모든 것들은 매우 간단합니다.

하지만 이것은 도움이 될 수 있습니다 - 매트릭스는 90도 회전 :

[ 0 -1 ] 
[ 1 0 ] 
+0

평범한 영어 벡터 설명이 정확하게 필요한 부분입니다. 그 조각들을 내 머리 속에 넣어 라. 감사! 부끄러운 줄 알았는데 많은 upvotes – basszero

3

당신은 블루 라인의 기울기를 알고,의는 m를 호출 할 수 있습니다. 그리고 파란색 선에 수직 인 선은 경사도가 -1/m입니다.

어떤 trig가 필요한 sine \theta = d/delta_x을 찾으려면 \ theta는 x 축의 파란색 선의 각도이고 d는 파란색 점의 빨간색 점 중 하나까지의 거리입니다. 그런 다음 선이 수직이되도록하려는 파란색 점의 x 좌표에 delta_x을 더하거나 뺍니다. 이제 point-slope 공식을 사용하여 y 좌표를 계산할 수 있습니다.

+0

그러나 포인트 슬로프 형식을 선분으로 바꾸려면 거리와 관련된 방정식 시스템을 풀어야합니다. – basszero

+0

예, 단계를 놓쳤습니다. 먼저 트릭이 들어오는 포인트 - 슬로프 수식의 x 좌표를 찾아야합니다. – nlucaroni

8

이 하나의 주위에 쉬운 방법은 기울기 m의 관점에서 생각하는 것이 아니라 x와 y에 오히려 변화하는 dx, dy (미적분 표기법)라고 부릅니다. 이유는 한 가지입니다. 수직선의 기울기를 처리하는 것이 무한하며, 어떤 경우 trig 함수를 사용할 필요가 없기 때문에이 코드는 더 빠르고 간단합니다.

dx = x2 - x1; 
dy = y2 - y1; 

여기서 포인트 2는 원하는 라인의 교차점이라고 가정합니다.

좋습니다. 따라서 수직선은 첫 번째의 음의 역수를 갖는 기울기를가집니다. 그 두 가지 방법이 있습니다

dx2 = -dy 
dy2 = dx 

또는

dx2 = dy 
dy2 = -dx 

이 두 방향에 대응 한 우회전, 다른 왼쪽.

그러나 dx와 dy는 원래 선분의 길이에 맞게 조정됩니다. 직각이 다른 길이입니다. 다른 측면에 대해 다시

double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy); 
double dx2 = -dy * scale; 
double dy2 = dx * scale 

다음 동일한 :이며, 한쪽 또는 다른 이동

double length(double x1, double y1, double x2, double y2) { 
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); 
} 

, 당신이 원하는 것을 수행 여기

은 두 점 사이의 길이입니다 . 방금 ​​sqrt를 사용했기 때문에 예제가 다소 C++이라는 것을 알았지 만, 그 차이점은 사소한 것입니다. 제곱근을 결합하여 코드를 더 효율적으로 작성할 수 있습니다.