2010-05-17 3 views
2

두 점으로 정의 된 선이 가로보다 90도 이상인지 알아 내려고했습니다. 여기에 내가 사용하는 코드가있다두 줄로 구성된 선이 horzontal에서 45도 이상 벗어났습니다

bool moreThan90 = false; 
double angle = Math.Atan((double)(EndingLocation.Y - Location.Y)/(double)(EndingLocation.X - Location.X)); 
if (angle >= Math.PI/2.0 || angle <= -Math.PI/2.0) 
    moreThan90 = true; 

올바르게 수행했거나 .Net에서이 기능을 더 잘 찾을 수 있습니까?

편집 - 실제로 나는 내 질문을 엉망으로 만들었습니다. 나는 가로 질러서 90도 벗어나라고 말하지 않았습니다. 그러나 대답은 제가 알아낼 수있는 지점에 이르렀습니다. (정말로 저는 Atan2를 지적해야했습니다).

+1

'x 및 y 점으로 정의 된 선이 90도 이상의 각도로 가로선과 교차합니까?' 만약 그렇다면 라인이 수직 또는 수평이 아니라면 대답은 '예'입니다 (이 사실을 확신시키기 위해 몇 가지 예를 그린다). 이렇게하면 질문을 수정하는 데 도움이됩니다. –

+0

저는 수학이 정확하다는 것을 알고 있습니다. 더 efferent 한 함수가 더 잘 구축되어 있는지 궁금합니다. (필자가 필요하지 않으면 부동 소수점 연산을하는 것이 싫어). –

+0

@Scott Chamerlain이 내 대답을 살펴 봅니다. 매번 X 축에 수평을 사용하는 경우 아무런 문제없이 수행 할 수 있습니다. – msarchet

답변

7

수평에서 90도 이상이 Location.x보다 작은 x 값에 그것의 EndLocation.x있을 것이다 라인을.

그래서 당신은 모든 ATAN의 말도 필요하지 않습니다,이 충분해야한다 :

if (EndingLocation.X < Location.X) 
    moreThan90 = true; 

편집 :

는 영업 이익이 위의 단순화 더 이상 의미없는, 45도 없습니다 (90)를 의미하는 것 같다 보유. 당신은 단지 바로

를 가리키는 라인을 원하는 경우에만 2 차 검사가 필요

if (Math.Abs(EndingLocation.X - Location.X) > Math.Abs(EndingLocation.Y - Location.Y) && 
    EndingLocation.X < Location.X) 
    moreThan45 = true; 

참고 :이 내용은이 ATAN2 사용 (Slaks는 지적) 그러나 황갈색 사용하지 않는 정신에 더 좋을 수도 있습니다

+0

잘못되었습니다. 이것은'Atan' – SLaks

+0

@SLaks보다 더 관대하지만 올바른 것입니다. X 축으로 수평을 사용한다고 가정하면 @Scott Chamberlain은 그가하지 않아도 부동 소수점 분할을하지 않을 것이라고 말했다. – msarchet

+0

downvoting하기 전에, 당신이 생각하거나 다이어그램을 그리는 것이 좋습니다. 나는 맞다 – pheelicks

3

이 같은 Math.Atan2를 호출해야합니다 :

double angle = Math.Atan2(EndingLocation.Y - Location.Y, 
          EndingLocation.X - Location.X); 

if (Math.Abs(angle) >= Math.PI/2.0) 
    moreThan90 = true; 
3

저는 두 벡터 사이의 각도를 찾기위한 라이브러리 방법이 있다고 상상하지 못할 것입니다. 정확하게 (수학이 맞다) 그리고 msdn과 google 주위를 잠깐 살펴보면 아무 것도 알려주지 않았습니다. Math.Atan 메서드를 호출하는 SLaks 버전을 사용합니다.

각도가 90도 이상인지 확인하기 위해 평면으로 '수평'을 사용하기 때문에 흥미로운 점에 유의해야합니다. 양수 X 축에서 측정하는 경우 endingLocation.x < Location.X의 경우 각도가 항상 90도 이상입니다.

편집 : 원래 질문이 45도 확인으로 변경되었습니다.

아래 섹션에서는 OP가 작성한 주석별로 부동 소수점 나누기를 수행하지 않고이를 수행하는 방법에 대해 설명합니다.

45도 각도인지 확인하려면 실제로 포인트를 ATan (으)로 전화하지 않고도 몇 가지 사항을 알고 있습니다. 참고> 45도 각도가 1 그래서

Math.Abs((EndLocation.y - location.y)/(EndLocation.X - Location.X)) > 1

경우

제 45도 각도의 기울기는 45도 각도의 순열 원에서 4 번 발생하지만 같이 인 . 우리는 몇 가지 사항을 확인해야합니다.

EndLocation.X < Location.X이면 각도는 45도 이상입니다. 이것은 Y 축 (90-270)의 모든 각도를 나타냅니다.각도가 45도 이상인지 확인하려면 기울기의 절대 값이 1보다 큰지 알아야합니다. 이는 다음에 대해 항상 적용됩니다.

Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X).

각도가 부동 소수점 계산을 수행 할 필요없이보다 큰 45도 경우에 우리는 확인할 수 있습니다

If (EndLocation.X < Location.X) OrElse (Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X) Then AngleGreaterThan45 = True.

같은 문은 다음과 같은 경우 뭔가 그래서.

관련 문제