두 개의 서로 다른 2D 좌표계를 어떻게 변환합니까?


10

좌표를 한 좌표계에서 다른 좌표계로 변환하려고하여 이미지에 그릴 수 있습니다.

기본적으로 목적지 좌표계는 다음과 같습니다.

X range: 0 to 1066
Y range: 0 to 1600

(1066 x 1600 크기로 그림을 그리는 표준 이미지)

이미지에 그리려고하는 위치는 실제로 동일한 크기이지만 좌표 시스템은 다릅니다. 모든 좌표 범위는 1066x1600입니다.

그러나 좌표 예는 다음과 같습니다.

(111.33f, 1408.41f)
(-212.87f, 1225.16f)

이 좌표계의 범위는 다음과 같습니다.

X range: -533.333 to 533.333
Y range: 533.333 to 2133.333

나는 이것이 매우 간단한 수학처럼 느껴지지만 어떤 이유로 든 얻지 못합니다.

제공된 좌표를 첫 번째 좌표계로 변환하려면 어떻게해야합니까?


3
두 좌표계에 동일한 기본 벡터가있는 경우 단순히 배율을 사용할 수 있습니다. 동일한 기본 벡터가없는 경우 기본 변경 이 필요합니다.
thalador

답변:


7

첫 번째 값을 정규화 할 수 있습니다. 그러면 [0,1] 범위의 값이 제공됩니다. 이를 X 백분율로 생각할 수 있는데, 값이 최소값과 최대 값 사이에 매핑되는 백분율입니다. 그런 다음 대상 시스템을 통해 X 백분율이 어떤 값인지 확인하여 대상 좌표계에서 해당 백분율이 속하는 위치를 찾을 수 있습니다. Java 코드를 예제 언어로 사용하겠습니다. 개념은 다른 언어로 번역 할 수있을만큼 명확합니다.

따라서 정규화하십시오.

public static float normalize(float value, float min, float max) {
    return Math.abs((value - min) / (max - min));
}

귀하의 예를 사용하여 입력하십시오 :

xPercent = normalize(x,0,1066);

그런 다음 대상 시스템의 위치를 ​​찾으십시오. 같은 것

destX = xPercent*(Math.abs(max-min)) + min;

또는 당신의 가치를 사용하려면 :

destX = xPercent*(Math.abs(533.33--533.33)) + -533.33;

예를 들어 x 값이 1000 인 경우이를 대상 좌표계에 매핑합니다 467.29.

또는 좌표계가 항상 같으면 그 사이의 비율을 미리 계산할 수 있습니다.

그래서:

xRatio = (Math.abs(srcMax-srcMin))/(Math.abs(destMax-destMin));

destX = x*xRatio+destMin;

왜 Java (C #)입니까? 그는 자바 코드를 요청하지 않았다 :)
kravemir

6
예를 들어 보겠습니다. 그대로 사용하지 않아도되며 개념이 명확합니다.
MichaelHouse

그러나 내가 이렇게하면 : destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; 나는 항상 음수 값을 얻습니다. 결과 좌표계는 0-1066입니다. 모든 좌표를 바꿔야합니까?
기수

그것들을 바꾸었고 여전히 다른 게시물과 마찬가지로 dump.tanaris4.com/sota.png를 받고 있습니다 . 아마도 다른 문제 (C # 및 드로잉 관련)가있을 수 있습니다. 고마워요!
Geesu

어떤 이유로 나는 xPercent = 1.0f-xPercent
Geesu

4

간단한 수학입니다.

res = ( src - src_min ) / ( src_max - src_min ) * ( res_max - res_min ) + res_min

src-소스 좌표계

입술-결과 조정 시스템

편집-수학 설명

( src - src_min ) / ( src_max - src_min )동일한 길이의 소스 좌표계를 사용하여 0에서 시작하여 좌표계로 변환합니다 (0.0, src_max - src_min ). 그런 다음 값을 조정하여 시스템을 조정합니다 (0.0, 1.0).

* ( res_max - res_min ) 이것은 결과 조정 시스템의 길이와 함께 0에서 시작하는 시스템을 조정하기 위해 값을 조정합니다. (0.0, dst_max - dst_min)

+ res_min 값을 결과 좌표계로 변환 (dst_min, dst_max)


나도 이것을 생각했지만 제대로 표시되지 않습니다 : dump.tanaris4.com/sota.png 최종 좌표는 흰색 원이 맨 아래에 위치해야합니다
Geesu

1
이것은 그들에게 수학을 전혀 설명하지 않습니다. :)
MichaelHouse

@ Byte56 저에게는 산술 연산 만 사용하는 경우 특히 무언가를 이해하기에 충분한 공식이지만, 필요한 사람들을 위해 설명을 추가했습니다. :)
kravemir

1
@Geesu 그렇다면 아마도 다른 나쁜 일을하고있을 것입니다 (렌더링 행렬?).
kravemir

2
업데이트 해 주셔서 감사합니다. 나는 일반적으로 그 이유를 설명하려고 시도하는 것이 낫다고 생각합니다. 그렇지 않으면이 질문 비슷한 문제 를 해결하는 방법 대신이 질문에 대한 답변을 제공합니다 . 그것은 "남자에게 물고기를주고, 물고기에게 남자를 가르쳐"유형의 것입니다.
MichaelHouse

3

2D 좌표 변환의 기본 방정식 (대수에서 회전없이)은 다음과 같습니다.

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

SourceCoordinate (S1, S2)의 두 점에 해당하는 TargetCoordinate (T1, T2)의 두 점이 주어지고 다음 TranslateFactor과 같이 ScalingFactor해결됩니다.

T1 = TranslateFactor + ScalingFactor*S1
T2 = TranslateFactor + ScalingFactor*S2

결과 :

TranslateFactor = (T2*S1 - T1*S2) / (S1 - S2)
ScalingFactor   = (T2 - T1) / (S2 - S1)

귀하의 경우 x 좌표

S1 = 0    -> T1 = -533.333
S2 = 1066 -> T2 = 53.333

따라서,

TranslateFactor = -533.333
ScalingFactor   = 1.000625
=> TargetCoordinate = (-533.333) + (1.000625)*SourceCoordinate

y 좌표는 동일한 절차를 따릅니다


S1과 S2는 동일한 x / y 좌표를 가질 수 없으므로 0으로 나누기가됩니다.
zwcloud

0

몇 가지 가정 :

  • 편의성과 능력을 위해 매트릭스 결과에 관심이 있습니다. 과
  • 동종 좌표에 익숙합니다.

그런 다음 질문은 다음과 같이 마이그레이션됩니다. 기본 변경에 대한 동종 변환 매트릭스는 무엇입니까?

이에 대한 답을 얻으려면 먼저 세 가지 자회사 질문에 대한 답변이 필요합니다.

  1. 내 원산지는 어디로 갔습니까?
  2. 내 X 축은 어떻게 되었습니까? (M11, M12)를 점의 좌표라고합시다
  3. 내 Y 축은 어떻게 되었습니까?

이 세 가지 질문에 대한 답변을 다음과 같이 정의하십시오.

  1. (M31, M32)는 원래 좌표계에서 새 원점의 좌표입니다.
  2. (M11, M12)는 원래 좌표계에서 새 단위 x- 벡터의 좌표입니다.
  3. (M21, M22)는 원래 좌표계에서 새 단위 y- 벡터의 좌표입니다.

그런 다음 균질 변환 행렬은 다음과 같습니다.

( M11, M12,  0 )
( M21, M22,  0 )
( M31, M32,  1 )

여기서 나의 관례는 점들이 행 컴퓨터로 표현된다는 것인데, 이것은 일반적인 컴퓨터 그래픽 규약입니다. 수학자와 물리학 자들은 종종 oppsoite를 사용합니다.


좌표계는 M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y와 같은 행렬로 설명 할 수 있습니다. 좌표계 행렬 A와 좌표계 행렬 B가 주어지면 P * A * Inverse (B), 여기서 P는 A의 좌표로 점을 표현한
것이므로
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.