컴퓨터이야기/알고리즘
지도와 컴퓨터화면!
백구씨쥔장
2008. 2. 25. 00:38

php로 구현하면....
$M = $a*((1 - $eccSquared/4 - 3*$eccSquared*$eccSquared/64 - 5*$eccSquared*$eccSquared*$eccSquared/256)*$LatRad
- (3*$eccSquared/8 + 3*$eccSquared*$eccSquared/32 + 45*$eccSquared*$eccSquared*$eccSquared/1024)*sin(2*$LatRad)
+ (15*$eccSquared*$eccSquared/256 + 45*$eccSquared*$eccSquared*$eccSquared/1024)*sin(4*$LatRad)
- (35*$eccSquared*$eccSquared*$eccSquared/3072)*sin(6*$LatRad));
php에 float형 말고 double형도 있나?


Y축 방향이 같을 경우.
1) 지도
- 원점: (mox, moy) ,
- extent: (mxMin, myMin) , (mxMax, myMax)
2) 화면
- 원점: (sox, soy)
- extent: (sxMin, syMin), (sxMax, syMax)
<지도 좌표를 구하는 식>
mx = (sx - sox) * (mxMax - mxMin)/(sxMax - sxMin) + mox
my = (sy - soy) * (myMax - myMin)/(syMax - syMin) + moy
<화면의 좌표를 구하는 식>
sx = (mx - mox) * (sxMax - sxMin)/(mxMax - mxMin) + sox
sy = (my - moy) * (syMax - syMin)/(myMax - myMin) + soy
[Y축 방향이 다를 경우]
종횡비 맞추기
x축 축척 = (mxMax - mxMin)/(sxMax - sxMin)
y축 축척 = (myMax - myMin)/(syMax - syMin)
//축척 보정전.
double mox, moy;
double mxMin = 1000, myMin=1000, mxMax=5000, myMax=5000;
double sox, soy;
double sxMin =0 , syMin =0, sxMax=600, syMax = 420;
void worldToDevice(const GeoPoint &_MapPoint, double &mx, double &my)
{
double m_lfnowXRatio = (mxMax-mxMin)/(sxMax-sxMin);
dobule m_lfnowYRatio = (myMax-myMin)/(syMax-syMin);
mox = (mxMax+mxMin)/2;
moy = (myMax+mxMin)/2;
sox = (sxMax+sxMin)/2;
soy = (syMax+syMin)/2;
mx = (_MapPoint.x-mox)/m_lfnowRatio+sox;
my = (moy-_MapPoint.y)/m_lfnowRatio+soy;
}
void DeviceToWorld(const CPoint &_point, double &sx, double &sy)
{
double m_lfnowXRatio = (mxMax-mxMin)/(sxMax-sxMin);
double m_lfnowYRatio = (myMax-myMin)/(syMax-syMin);
mox = (mxMax+mxMin)/2;
moy = (myMax+mxMin)/2;
sox = (sxMax+sxMin) /2;
soy = (syMax+syMin)/2;
sx = mox + (_point.x - sox) * m_lfnowXRatio;
sy = moy - (_point.y - soy) * m_lfnowYRatio;
}
// 축척 보정한 경우
double mox, moy;
double mxMin = 1000, myMin=1000, mxMax=5000, myMax=5000;
double sox, soy;
double sxMin =0 , syMin =0, sxMax=600, syMax = 420;
void worldToDevice(const GeoPoint &_MapPoint, double &mx, double &my)
{
double m_lfnowXRatio = (mxMax-mxMin)/(sxMax-sxMin);
dobule m_lfnowYRatio = (myMax-myMin)/(syMax-syMin);
if(m_lfnowXRatio > m_lfnowYRatio ) m_lfnowYRatio = m_lfnowXRatio ;
else m_lfnowXRatio = m_lfnowXYRatio ;
mox = (mxMax+mxMin)/2;
moy = (myMax+mxMin)/2;
sox = (sxMax+sxMin)/2;
soy = (syMax+syMin)/2;
mx = (_MapPoint.x-mox)/m_lfnowRatio+sox;
my = (moy-_MapPoint.y)/m_lfnowRatio+soy;
}
void DeviceToWorld(const CPoint &_point, double &sx, double &sy)
{
double m_lfnowXRatio = (mxMax-mxMin)/(sxMax-sxMin);
double m_lfnowYRatio = (myMax-myMin)/(syMax-syMin);
if(m_lfnowXRatio > m_lfnowYRatio ) m_lfnowYRatio = m_lfnowXRatio ;
else m_lfnowXRatio = m_lfnowXYRatio ;
mox = (mxMax+mxMin)/2;
moy = (myMax+mxMin)/2;
sox = (sxMax+sxMin) /2;
soy = (syMax+syMin)/2;
sx = mox + (_point.x - sox) * m_lfnowXRatio;
sy = moy - (_point.y - soy) * m_lfnowYRatio;
}