2013-12-24 3 views
7

특정 위도와 경도 좌표가 주어지면 해당 점이있는 인접 지역을 출력하는 프로젝트를 진행 중입니다. 위도와 경도 좌표로 한 도시 내의 여러 이웃들의 경계를 확장하십시오. 파일에서 이웃 데이터를 읽고 파일에서 테스트 포인트를 읽어야합니다. 나는 라켓 프로그래밍 언어를 사용하고 있습니다.라켓을 사용하여 점이 다각형 내부에 있는지 확인하는 방법

지금까지 파일을 읽고 각 이웃에 대한 점수 목록을 만들 수 있었고 지금은 붙어 있습니다. 각 이웃에 대해 다각형을 만들고 그 점이 그 다각형 안에 있는지 확인하는 방법을 원했습니다. 그러나, 나는 라켓을 사용하여 그것을하는 방법을 알아낼 수 없습니다.

포인트가 다각형 안에 있거나 해결 방법을 찾는 더 좋은 방법은 해결 방법을 찾는 사람이 있습니까?

+1

볼록 또는 오목 폴리곤입니까? 아니면 단순한 사각형입니까? –

+0

그들은 모두 오목한 다각형입니다. 언급 할 필요조차 없다고 생각해서 죄송합니다. – AdamMc331

답변

9

숙제/과제를 해결하고 싶지 않으므로 지금은 코드를 게시하지 않겠습니다. 그러나, 나는 약간의 힌트를 게시 할 것이다. 아래 그림에서

봐 :

Some vectors

우리는 어떻게 COBD이 밖에 가장자리 OA 사이에 있음을 알 수 있습니까? 간단합니다 : 우리는 어떤 각도를 비교합니다 : OCOA 사이의 각도가 OBOA 사이의 각도보다 작 으면 C는 OA보다 분명히 OB에 더 가깝습니다.

이제 벡터를 알고있는 각도를 어떻게 구할 수 있습니까? 우리는 단조로운 코사인을 사용할 수 있습니다. 증가하는 인수로 감소합니다. 따라서, OCOA 사이의 각의 코사인은 OBOA 사이의 각의 코사인보다 크며, 다시 ODOA 사이의 코사인보다 커집니다.

다음 단계는 코사인을 계산하는 방법을 파악하는 것입니다. 벡터 내적은 도움이됩니다. 값은 피연산자 길이의 곱보다 큰 각도 시간의 코사인입니다. 즉 :

cos(OC; OA) = dotproduct(OC; OA)/(length(OA) * length(OC)) 

2D의 dotproduct은 간단하다 : 당신이 위의 모든 결합

dotproduct(OC; OA) = (C.x - O.x) * (A.x - O.x) + (C.x - O.x) * (A.x - O.x) 

요점은 C 또는 D을 같은 상황에 있는지 여부를 확인하는 간단한 테스트를해야한다 : 이전 가장자리보다 한 가장자리에 더 가깝거나 없습니다.

이제 다각형의 모든 가장자리에 대해이 작업을 반복해야합니다. 테스트가 술어 인 경우 fold으로이 작업을 수행 할 수 있습니다.

참고 : 다각형이 볼록 인 경우에만 작동합니다. 오목한 다각형의 경우 더 많은 테스트를 추가해야합니다.

둘째 주는 : D 또는 C 또는 둘 모두가 OA 라인 아래에있는 경우 그림에서 어떤 일이 일어날 것인가?이것을 생각하고 위의 fold 메소드에 대한 몇 가지 변경 사항을 의미하는지 확인하십시오.

마지막주의 사항 : 몇 주 후에 과제가 끝났다고 가정하고 몇 주 후에 전체 코드를 게시하겠습니다. 또한, 그 시점에서 나는 위의 질문에 답할 것입니다.

+0

정말 고맙습니다. 나는 휴일 다음에 이것에 면밀한 관찰을 가지고 갈 것이다 그러나 나는 시험을 이해하고 계획이있다. 참고로, 여기에 내가 작업 할 모양의 유형을 보여주는 nieghborhood 맵 이미지가 있습니다. http://imgur.com/eZRa1fD – AdamMc331

+0

이 작업을 수행하려면 폴리곤을 볼록한 것들로 분할해야합니다. 삼각형 메쉬를 사용할 수 있습니다. –

관련 문제