2013-04-28 3 views
4

광선 - 삼각형 충돌을 검사하기 위해 광선이 삼각형 평면과 충돌하는지 먼저 확인할 수 있습니다. 그렇다면 교차점이 모든 삼각형면에 대해 같은면에 있는지 확인합니다. true이면 점이 삼각형 안에 있음을 의미합니다. 이 절차는 직사각형 및 다른 볼록한 그림과 유사합니다. "원형 목록"에서 인접 요소 쌍의 게으른 생성

는 사각형 (주문한 시계 반대 방향)에 속하는 정점의 목록입니다

vertexes = [ll, lr, ur, ul] 

을 나는 모든 측면과 함께 목록을 생성 할;

vertexPairs = [(ll, lr), (lr, ur), (ur, ul), (ul, ll)] 

(마지막 정점, UL, 첫 번째와도 쌍, LL 참고)

가 어떻게 유유히 등의 생성 수 있습니다 즉, 정점의 모든 인접한입니다 일반적인 꼭지점 목록이 있다고 가정 할 때 일반적인 convex geometric figure의 목록?


아이디어 함수 isInside 쌍에 각각 공급하고, 그 반환 값이 모두 동일한 지 확인한다. 이것은 내가 뭘하는지입니다 :

1. vertexes = [<list of vertexes>] 
2. vertexPairs = ??? 
3. results = map (\(v1, v2) -> isInside point v1 v2) vertexPairs 
4. allequal = all (== head results) (tail results) 

하스켈은 에, 호출 모든 끝 (라인 4) isInside에 대한 호출이 첫 번째 호출의 반환 값과 다른 값을 반환하는 경우, 게으른이기 때문에 . 마찬가지로, 나는 vertexPairs 목록을 게으른 방법으로 생성하는 방법을 원했습니다.

vertexPairs = zip (vertexes) (tail vertexes ++ [head vertexes]) 
  1. 이 게으른 :이 질문을 작성되면서


    , 나는 쌍을 생성하는 가능한 솔루션 생각? 그것이 또는 유사한 기능을 사용하지 않기 때문에 나는 말할 것입니다,하지만 나는 아직도 하스켈에 비교적 새입니다.

  2. 연결 및 단일 요소 목록 덕분에보기에도 약간 못 생겼습니다. 더 좋은 방법이 있습니까?
  3. 관련 질문으로 3 번 줄의 자유 점 표기법은 무엇입니까?

답변

3

예 이처럼 목록을 생성하는 방법은 게으릅니다. 일반적으로 하스켈의 목록 함수는 게으르다.

초기 목록에 오류가있는 내용 (예 : undefined)을 포함 시켜서 게으르다는 것을 테스트 할 수 있습니다. (그것을 인쇄 할 수있는 전체 목록을 평가해야하므로) 예를 들어,

vertexes = [(0,0), (10,0), undefined, undefined] 

경우 다음 vertexPairs 당신에게 오류를 줄 것이다. 그러나 게으른 경우 head vertexPairs은 올바른 쌍을 제공해야합니다.

나는 실제로 코드가 다소 좋게 보인다. tail vertexes ++ [head vertex]은 자신이하는 일을 매우 분명하게합니다. 네, 여기서 ++을 사용하는 것은 약간 이상하게 보입니다.하지만 의미가 있습니다. 목록 끝에 추가하는 것은 비용이 많이 드는 작업이므로 눈에 should니다. 나는 그 코드를 작성하는 더 좋은 방법을 생각할 수 없다. 작은 스타일의 힌트로서, 당신은 vertexes 주위에 괄호를 제거 할 수 있습니다 :

vertexPairs = zip vertexes (tail vertexes ++ [head vertexes]) 

을 3.를 들어, 개념적, 각 쌍 isInside point을 적용 할. 지금은 Point -> Point -> Bool과 같은 유형이 있습니다. 처음 두 인수를 튜플 ((Point, Point) -> Bool)으로 취하는 함수를 원합니다. 이 함수는 uncurry이라고하며, 반대 변환 (여러 매개 변수 중 하나에 튜플을 기대하는 함수를 변환 함)을 currying이라고합니다. 그래서 당신은 이런 3.를 작성할 수 : 당신이 약간 더 예뻐 방법으로 그것을 기록 할 경우

results = map (uncurry (isInside point)) vertexPairs 
+0

매우 명확한 답변, 감사합니다. 나는 내 솔루션이 그다지 나쁘지 않았다는 것이 좋은 것 같아요 :) – CanisLupus

4

비록 티콘은 대부분의 질문에 대한 답변하고있다, 당신이 할 수있는이 때문에 작동

vertexPairs v = zip v (tail $ cycle v)

zip 인수가 "부족한"경우 목록 생성이 중지됩니다.

+0

흠, 나는 생각하지 않았습니다 :) 감사합니다! – CanisLupus

+2

하하, 나는 거의 논평하려고했으나 '올리 안타의 대답이 나왔다. 나는 비슷한 제안을했지만 경솔한 point-free 버전 인 vertexPairs = zip <*> 꼬리를 가지고있다. 사이클 '재미있게 될 수 있습니다. – applicative