문제

그렇지 않으면 단단한 가장자리로 알려진이 마우스는 마우스가 교차 할 수없는 선입니다. 게임 등에 유용합니다.

현재 마우스 커서가 화면에 다각형에 그려진 경우 리턴하는 기능이 있습니다. 그렇지 않은 경우, 나는 내 커서를 다각형에있는 마지막 저장된 지점으로 옮깁니다.

    if (!PointInPolygon(local, polyGon))
    {
        Cursor.Position = safePoint;
    }
    else
    {
        safePoint = Cursor.Position;
    }

나는 몇 가지 이유로 이것을 좋아하지 않습니다.

  • 업데이트 시간이 느리거나 어떤 이유로므로 때로는 상자에서 벗어날 수 있습니다. 그런 다음 해당 위치를 다각형 외부의 SafePoint로 저장합니다. 그런 다음 내 마우스 가이 위치에 갇혀 있습니다.

  • 경사면 가장자리는 마우스를 경사 방향으로 찌그러 뜨려야합니다. 마우스를 오른쪽으로 밀면 "/"모양의 벽은 오른쪽 상단의 커서로 끝나야합니다. 그러나이 접근법의 특성으로 인해 라인을 넘어 가면 커서가 이전의 위치로 커서를 재설정 할 것입니다. 오른쪽을 계속 밀면 커서를 계속 재설정 할 수 있으며 "경사면 위로"밀지 않습니다.

이 문제를 해결하기위한 다른 접근법이 있습니까? 나는 주로 마지막 문제에 대해 걱정하고 있습니다.이 경사 횡단 동작은 내 프로그램의 주요 목표이며 작동해야합니다. 이 기본 방법을 사용하더라도 해당 특정 행동을 최적화하기위한 아이디어가 있습니까?


편집하다:

리드는 대신 현재 바운드가 아닌 지점에 가장 가까운 지점으로 돌아갑니다. 사변형의 4 코너 포인트를 감안할 때, 모양에서 가장 가까운 지점을 어떻게 찾을 수 있습니까?

도움이 되었습니까?

해결책 3

  1. 두 엔드 포인트를 사용하여 에지 선 방정식을 찾으십시오.
  2. -(1/경사)는 수직선의 경사를 제공합니다.
  3. 가장자리를 가로 지르는 알려진 지점 (실제 마우스의 위치)을 사용하여 수직 선의 선 방정식을 해결하십시오.
  4. 에지 선과 수직선의 교차로를 해결하십시오.
  5. 그 위치에 가짜 커서를 넣으십시오.

다른 팁

"SafePoint"를 추적하는 대신 다음을 수행합니다.

다각형의 외부를 찾으면 마지막으로 알려진 안전 지점으로 되돌아가는 대신 마우스를 현재 마우스 위치로 다각형의 가장 가까운 지점으로 올려 놓으십시오. 커서는 다각형의 가장자리에 경사면을 따라 가기 때문에 느낌도 도움이 될 것입니다.

또한 통화 사이에 상태를 저장할 필요가 없습니다 (SafePoint).

포인트를 제한하는 방법 내부 a 볼록한 다각형 (비 컨버트가 조금 더 어렵습니다) 2-D (시계 방향 권선 순서라고 가정) :

각 가장자리에 대해 (PI, PJ) 다각형의 ...

일반 벡터를 찾으십시오 N 가장자리의 (단위 벡터를 가리키는 pi 에게 PJ, 90도 회전)

변위를 찾으십시오 가장자리에서 지점까지 ~을 따라 N ( d = (p -pi) dot n )

만약에 긍정적 (또는 반 시계 방향 와인딩 순서에 대한 부정적), 그러면 p = p -n*d

엔드 루프 :)

가장 가까운 지점 :

if(mouse.x > maxX) 
    mouse.x = maxX;
else if(mouse.x < minX)
    mouse.x = minX;

// same for Y.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top