void ScreenBase::GetTouchRect(m2::PointD const & pixPoint, double const pxWidth, double const pxHeight, m2::AnyRectD & glbRect) const { double const width = pxWidth * m_Scale; double const height = pxHeight * m_Scale; glbRect = m2::AnyRectD(PtoG(pixPoint), m_Angle, m2::RectD(-width, -height, width, height)); }
void ScreenBase::UpdateDependentParameters() { m_PixelRect = CalculatePixelRect(m_Scale); m_PtoG = math::Shift( /// 5. shifting on (E0, N0) math::Rotate( /// 4. rotating on the screen angle math::Scale( /// 3. scaling to translate pixel sizes to global math::Scale( /// 2. swapping the Y axis??? why??? supposed to be a rotation on -pi / 2 here. math::Shift( /// 1. shifting for the pixel center to become (0, 0) math::Identity<double, 3>(), - m_PixelRect.Center() ), 1, -1 ), m_Scale, m_Scale ), m_Angle.cos(), m_Angle.sin() ), m_Org ); m_GtoP = math::Inverse(m_PtoG); m2::PointD const pxC = m_PixelRect.Center(); double const szX = PtoG(m2::PointD(m_PixelRect.maxX(), pxC.y)).Length(PtoG(m2::PointD(pxC))); double const szY = PtoG(m2::PointD(pxC.x, m_PixelRect.minY())).Length(PtoG(m2::PointD(pxC))); m_GlobalRect = m2::AnyRectD(m_Org, m_Angle, m2::RectD(-szX, -szY, szX, szY)); m_ClipRect = m_GlobalRect.GetGlobalRect(); double const kEps = 1e-5; double angle = CalculatePerspectiveAngle(m_Scale); m_isPerspective = angle > 0.0; if (fabs(angle - m_3dAngleX) > kEps) { m_3dMaxAngleX = angle; m_3dScale = CalculateScale3d(angle); SetRotationAngle(angle); } }
void ScreenBase::SetGtoPMatrix(MatrixT const & m) { m_GtoP = m; m_PtoG = math::Inverse(m_GtoP); /// Extracting transformation params, assuming that the matrix /// somehow represent a valid screen transformation /// into m_PixelRectangle double dx, dy, a, s; ExtractGtoPParams(m, a, s, dx, dy); m_Angle = ang::AngleD(-a); m_Scale = 1 / s; m_Org = PtoG(m_PixelRect.Center()); UpdateDependentParameters(); }
/// Get address information for point on map. inline void GetAddressInfoForPixelPoint(m2::PointD const & pxPoint, search::AddressInfo & info) const { GetAddressInfoForGlobalPoint(PtoG(pxPoint), info); }
void ScreenBase::GetTouchRect(m2::PointD const & pixPoint, double pixRadius, m2::AnyRectD & glbRect) const { double const r = pixRadius * m_Scale; glbRect = m2::AnyRectD(PtoG(pixPoint), m_Angle, m2::RectD(-r, -r, r, r)); }
void ScreenBase::PtoG(m2::RectD const & pxRect, m2::RectD & glbRect) const { glbRect = m2::RectD(PtoG(pxRect.LeftTop()), PtoG(pxRect.RightBottom())); }
void ScreenBase::Move(double dx, double dy) { m_Org = PtoG(GtoP(m_Org) - m2::PointD(dx, dy)); UpdateDependentParameters(); }
void ScreenBase::MatchGandP3d(m2::PointD const & g, m2::PointD const &p3d) { m2::PointD g_current = PtoG(P3dtoP(p3d)); SetOrg(m_Org - g_current + g); }
void ScreenBase::MatchGandP(m2::PointD const & g, m2::PointD const & p) { m2::PointD g_current = PtoG(p); SetOrg(m_Org - g_current + g); }