2012-01-25 2 views
1

여기서 수학 오류가 발생하는 것 같습니다 ... 좌표 공간에서 (x, y) 점을 다른 좌표 공간으로 변환해야합니다 - 극지감이 아닙니다 데카르트 식 또는 어떤 종류의 것 ... 한 묶음에서 다른 묶음으로. 즉, 왼쪽 아래 (-100, -100)와 오른쪽 상단 (100,100)의 사각형에 해당하는 특정 (x, y)에 대해, 그 점이 왼쪽 하단에있는 사각형에서 어디에 위치하는지 알아야합니다 , 0) 및 오른쪽 위 (500, 500). 나는이 느낌좌표를 한 공간에서 다른 공간으로 변환

은 간단한 계산이다하지만 난

그것은 자바로 작성된 작은 컴퓨터 그래픽 프로그램입니다 ... 바로 그것을 점점 시간의 지옥을 보내고 있습니다. 본질적으로 변경되는 클립 윈도우가 있으며 클립 윈도우는 전체 뷰 윈도우를 채울 필요가 있습니다. 클립 및 뷰의 초기 값은 위의 직사각형에 의해 순서대로 지정됩니다. 그러나 클립은 예를 들어 왼쪽 아래 (-80, -65) 및 오른쪽 위 (75, 65)의 사각형으로 바뀔 수 있습니다. 그런 다음 해당 사각형 내에있는 지점을보기 창 (왼쪽 아래 (0,0), 오른쪽 상단 (500, 500)) 내에있는 지점으로 변환해야합니다.

다음은 내가 가지고있는 것입니다. 지금 :

public int normalizeX(float x) { 
    float clipWidth = clipRight - clipLeft; 
    int viewWidth = viewRight - viewLeft; 
    x += 100; //Get x into range [0, 200] instead of [-100, 100] 
    //First convert x to value within clip width, then "scale" to viewport width 
    return (int)(((clipWidth*x)/200) * (viewWidth/clipWidth)); 
} 

public int normalizeY(float y) { 
    float clipHeight = clipTop - clipBottom; 
    int viewHeight = viewTop - viewBottom; 
    y += 100; //Get y into range [0, 200] instead of [-100, 100] 
    //First convert y to value within clip height, then "scale" to viewport height 
    return (int)(((clipHeight*y)/200) * (viewHeight/clipHeight)); 
} 

어떤 도움을 주셔서 감사합니다!

+0

하드 코딩 된 [[0, 200]'및 [-100,100]은 어디에서 왔습니까? –

+0

Jean에게 알려 주셔서 감사합니다. James, 그 값은 (-100, -100), (100, 100)의 범위에서 정의 된 모든 모양 (관계없이 또는 클립 또는보기 창)에 기인합니다. – user1028885

답변

4

가정 기존의 경계 (당신의 예에서, 각각 -80, 75) xLoOldxHiOld하고 새로운 경계는, 당신은 당신의 xOld을 정상화 할 수 있습니다 (귀하의 예제에서 각각 0과 500) xLoNewxHiNew입니다 다음과 같이 새 좌표계에 연결하십시오.

xNew = (xOld-xLoOld)/(xHiOld-xLoOld) * (xHiNew-xLoNew) + xLoNew 

y와 같은 것입니다.

+0

마지막 비트가'+ xLoNew'가 아니어야합니까? –

+0

물론입니다. 오타가 수정되었습니다. –

+0

아, 그렇습니다. 나는 누군가 그것을 말하려고했으나 누군가 저를 때렸습니다 :-p thanks! – user1028885

2

이와 비슷한 것이 도움이 될 수 있습니다.

public static float scale(
      float x, 
      float old_min, float old_max, 
      float new_min, float new_max) 
    { 
     float old_range = old_max - old_min; 
     float new_range = new_max - new_min; 
     return new_min + (x - old_min) * new_range/old_range; 
    } 

두 좌표 모두에서 좌표를 조정해야합니다. 나는 등, int로 캐스팅으로 다른 계산을 남겨 두었다

나는 또한에 의해 코드를 단순화하는 등 Region 또는 Rectangle 적합한 유형을 만드는 것이 좋습니다 적어도,이 함수에 인수의 수를 줄일 수있다.

+0

감사! 지역 직사각형 문제는 문제가되지 않습니다. 이전과 새로운 경계는 setter 메소드로 변경되는 전역 변수에서 유지됩니다. 도와 주셔서 감사합니다! – user1028885

0

이 작업을 수행하는 매끈하고 일반적인 방법은 아핀 변환을 사용하는 것입니다. 원래 필드의 "stretchiness"를 두 번째 필드로 특성화하는 2 x 2 매트릭스 (A라고 함)와 오프셋을 특성화하는 2 x 1 매트릭스 (b라고 함)가 있습니다.

그러면 x를 (2 x 1) 입력으로, y를 (2 x 1) 출력으로 사용하면 y = Ax + b 일뿐입니다.

이 기술을 사용하면 회전과 같이 훨씬 더 많은 작업을 수행 할 수 있지만 응용 프로그램에서는 중요하지 않을 수 있습니다.

http://en.wikipedia.org/wiki/Affine_transformation

2

단순 지옥으로 : 당신은 -100 500-0에 100 매핑 변환을 할 수 있습니다.또는 범위 [0, 500]의 범위 [-100, 100]에 매핑되는 맹목적 입력 :

[-100, 100] ----> [0, 500] 

첫번째 단계의 범위 [-100, 100]의 변환이다 [0, 200]

x ----> x + 100 

다음 단계에서 미세 [0, 500]

x ----> x * 500/200 = 2.5 * x 

상기 범위 [0, 200]로 변환하는, 변환하여

01,235 판독

마찬가지로 Y에 대한 16,

x ----> 2.5 * (x + 100) 
이 그것을 명확하게, 그리고 좀 더 복잡한 경우에 로직을 재사용 할 수있을 것

y ----> 2.5 * (y + 100). 

희망.

+0

예, 감사합니다. 내가 왜 그렇게 고투하고 있는지 잘 모르겠다. 내가 수학 미성년자로 당황하게 만든다 : -X 뇌가 방구했다. – user1028885

+0

@ user1028885 : 천만에. 나는 수학을 가지고 있고, 하루 종일 직장에서 수학을하며 이런 일을하기 위해 종이와 연필이 필요합니다. 물건을 망칠 수 있습니다. –

+1

전형적인 수학자! 너희들은 숫자에 끔찍하다. 진실로 당신 물리학 자요. (추신 : 그것은 사실입니다 !;-) –

관련 문제