void TaskPointRenderer::DrawTaskLine(const GeoPoint &start, const GeoPoint &end) { canvas.Select(LegActive() ? task_look.leg_active_pen : task_look.leg_inactive_pen); canvas.SetBackgroundTransparent(); map_canvas.DrawLine(start, end); canvas.SetBackgroundOpaque(); // draw small arrow along task direction BulkPixelPoint Arrow[3] = { {6,6}, {-6,6}, {0,0} }; const auto p_start = m_proj.GeoToScreen(start); const auto p_end = m_proj.GeoToScreen(end); const Angle ang = Angle::FromXY(p_start.y - p_end.y, p_end.x - p_start.x).AsBearing(); const auto p_p = ScreenClosestPoint(p_start, p_end, m_proj.GetScreenOrigin(), Layout::Scale(25)); PolygonRotateShift(Arrow, 2, p_p, ang); Arrow[2] = Arrow[1]; Arrow[1] = p_p; canvas.Select(LegActive() ? task_look.arrow_active_pen : task_look.arrow_inactive_pen); canvas.DrawPolyline(Arrow, 3); }
void RenderTaskPoint::DrawTaskLine(const GeoPoint &start, const GeoPoint &end) { canvas.Select(LegActive() ? task_look.leg_active_pen : task_look.leg_inactive_pen); canvas.SetBackgroundTransparent(); map_canvas.line(start, end); canvas.SetBackgroundOpaque(); // draw small arrow along task direction RasterPoint p_p; RasterPoint Arrow[3] = { {6,6}, {-6,6}, {0,0} }; const RasterPoint p_start = m_proj.GeoToScreen(start); const RasterPoint p_end = m_proj.GeoToScreen(end); const Angle ang = Angle::Radians(atan2(fixed(p_end.x - p_start.x), fixed(p_start.y - p_end.y))).AsBearing(); ScreenClosestPoint(p_start, p_end, m_proj.GetScreenOrigin(), &p_p, Layout::Scale(25)); PolygonRotateShift(Arrow, 2, p_p.x, p_p.y, ang); Arrow[2] = Arrow[1]; Arrow[1] = p_p; canvas.Select(task_look.arrow_pen); canvas.DrawPolyline(Arrow, 3); }