2012-09-04 2 views
0

수학 무게가있는 프로그래밍 질문이 있습니다. 나는 모양 (폴리 라인)이있는지도를 익사시킵니다. 그 모양의 화면 좌표를 가져 와서지도 좌표로 변환하고 뒤집을 수 있습니다. 나는 마우스 위치를 잡아서지도 주위를 돌아 다니고있다. 마우스를 움직일 때지도에서 익사 된 다른 모양에 근접해 있는지 어떻게 알 수 있습니까? 나는 마우스 커서 주위에 점의 반지름을 만들고, 그 다음 계속적으로 사용할 수있는 물결 모양을 반복적으로 만들 생각이었다. (배열에서 좌표를로드 할 수 있다고 상상해 본다. 그러나 그것은 매우 느릴 것이라고 생각합니다. 요점은 내가 근접 (예 : 15px)에있을 때 뮤즈 위치를 가까운 모양으로 스냅하는 것입니다. 어떤 제안?폴리 라인에 가까울 때 마우스 커서 감지

답변

1

이제 완벽하게 만들고 싶다면 커서의 각 선분까지의 거리를 계산할 수 있습니다. 각 선분

는 형식 세그먼트 DE위한

계산 광고 화학식 (점 D 및 E에 의해 정의 된)

도끼 + + C = 0

A = Dy를 바이 - 어이

B = 전 - DX를

가 C = (점 D에서 플러그) = -1 * (A *의 Dx + B *의 Dy)

이제 공식에 커서 위치에 연결 :

A * cursor.x + B * cursor.y + C = 선분에 대한 귀하의 거리 한 가지 *

-이 거리가 바운드 형식이다 선. 이제 두 세그먼트 포인트 사이에 있는지 확인하려고합니다. 따라서 커서의 각도 (D, E 삼각형)가 모두 < (90도)인지 확인하십시오. 이를 수행 할 수있는 여러 가지 방법으로 빠른 제품 수식을 살펴보십시오.

이제는 값이 90보다 작 으면 선과의 거리를 사용하고, 그렇지 않으면 최소 거리를 사용하여 세그먼트 중 어느 한 점 (D & E)을 사용하십시오. 이제 라인 기능에 대한 완벽한 스냅 기능이 제공됩니다.

0

당신은 모양의 모든 점/선분이있는 경우 (이 당신이해야 폴리 라인 포함), 여기에 가능한 빠르고 간단한 루틴 : 모양의 각 모양 그림 센터

각 구성 점을 평균하여 (즉 - 5 각형에 대해 5 점을 모두 더한다. x를 5로 나눈다. 모든 점에 대해 똑같이한다.) 이 평균 shape.x 및 shape.y를 호출하십시오. 거리 공식을 사용하여 마우스의 근접성을 계산하십시오. (Mouse.x - Shape.x)^2 + (Mouse.y - Shape.y)^2 ... 가장 가까운 모양에만 관심이 있기 때문에 그 제곱근을 취할 필요가 없습니다.

각 모양에 대한 최소 거리 "제곱"을 추적하십시오. 최소값은 가장 가까운 모양의 중심입니다.

최대 범위의 비헤이비어로 스냅하고 싶다면 거리의 제곱이 < 픽셀 거리 제곱인지 확인하십시오.

매우 효과적이기를 원한다면, 모양 센터는 지속적으로 재구성 될 필요가 없으며 한 번 계산됩니다. 언급 한대로 화면 공간과 다른 좌표간에 변환하는 경우 다른 점과 동일하게 축척되고 변환됩니다.

관련 문제