콘텐츠로 이동

좌표 변환

전자해도 응용에서 가장 자주 쓰는 작업 중 하나가 좌표 변환이다. henc 는 4 가지 좌표계를 다루며 각각 사이의 변환 함수를 제공한다.

좌표계단위사용처
Window (Win)픽셀 (정수)마우스 이벤트, 위젯 절대 좌표
OpenGL (Gl)정규화 좌표 (-1 ~ 1)셰이더·임의 OpenGL 드로잉
Map도(°) - 위경도셀·해도 객체 좌표
Mercator미터거리 계산·항적
// 마우스 메시지 핸들러 (Win32 OnLButtonDown 또는 Qt mousePressEvent)
void onLeftClick(int viewHandle, int mouseX, int mouseY) {
double lon = 0, lat = 0;
// Win → Map (위경도)
hencWinPosToMapPos(viewHandle, mouseX, mouseY, &lon, &lat);
printf("clicked at: %.6f°E, %.6f°N\n", lon, lat);
}

위경도 → 화면 픽셀 (마커 그리기)

섹션 제목: “위경도 → 화면 픽셀 (마커 그리기)”
// 사용자 정의 PNG 마커를 위경도 좌표에 그리고 싶을 때 화면 좌표가 필요한 경우
void drawCustomMarker(int view, double lon, double lat) {
int sx = 0, sy = 0;
hencMapPosToWinPos(view, lon, lat, &sx, &sy);
// 뷰포트 밖이면 그리지 않음 - 화면 크기로 보드 클리핑
int vw, vh;
hencGetPixelSize(view, &vw, &vh);
if (sx < 0 || sy < 0 || sx >= vw || sy >= vh) return;
// 응용 코드에서 sx, sy 위치에 OpenGL 또는 GDI로 마커 렌더링
}
// 두 점 사이의 거리를 미터 단위로 - 메르카토르 좌표 차이로 근사
double distanceInMeters(double lon1, double lat1, double lon2, double lat2) {
double mx1, my1, mx2, my2;
hencWgs84ToMercator(lon1, lat1, &mx1, &my1);
hencWgs84ToMercator(lon2, lat2, &mx2, &my2);
double dx = mx2 - mx1;
double dy = my2 - my1;
return sqrt(dx * dx + dy * dy);
}
// 미터 단위로 떨어진 위치 계산 (예: 마우스 위치에서 동쪽으로 500m 떨어진 점)
void offsetMeters(double lon, double lat, double dxMeters, double dyMeters,
double* outLon, double* outLat) {
double mx, my;
hencWgs84ToMercator(lon, lat, &mx, &my);
hencMercatorToWgs84(mx + dxMeters, my + dyMeters, outLon, outLat);
}

OpenGL 좌표가 필요한 경우 (셰이더·임의 드로잉)

섹션 제목: “OpenGL 좌표가 필요한 경우 (셰이더·임의 드로잉)”
// 마우스 위치를 OpenGL 정규화 좌표로 - 사용자 정의 셰이더에 전달
void mouseToGl(int view, int mx, int my, double* gx, double* gy) {
hencWinPosToGlPos(view, mx, my, gx, gy);
}
// 또는 위경도를 직접 OpenGL 좌표로
void mapToGl(int view, double lon, double lat, double* gx, double* gy) {
hencMapPosToGlPos(view, lon, lat, gx, gy);
}