From b64489be9edbf62a73e6b126bbadaf2c3d7fed9a Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Fri, 6 Jan 2023 20:34:14 +0100 Subject: [PATCH] Add code to draw arrows on the board --- src/game_tab/left_panel/board/BoardCanvas.cpp | 37 +++++++++++++++++++ src/game_tab/left_panel/board/BoardCanvas.hpp | 3 ++ 2 files changed, 40 insertions(+) diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 7bebe45..119c270 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -1,5 +1,11 @@ #include "BoardCanvas.hpp" +#define TRANS(PT) { \ +wxPoint2DDouble tmp((PT).x,(PT).y); \ +tmp=rot_m.TransformPoint(tmp); \ +tmp=trans_m.TransformPoint(tmp); \ +(PT).x=tmp.m_x;(PT).y=tmp.m_y;} + wxDEFINE_EVENT(PLAY_MOVE_EVENT, wxCommandEvent); BoardCanvas::BoardCanvas(wxFrame *parent) @@ -462,3 +468,34 @@ void BoardCanvas::SetClockTime(short hours, short min, short sec, gs.white_time = std::make_tuple(hours, min, sec); } } + +void BoardCanvas::DrawArrow(wxDC &dc, int xsrc, int ysrc, int xdst, int ydst){ + // Compute arrow length and angle + wxPoint vect(xdst-xsrc,ydst-ysrc); + double length=sqrt(pow(vect.x,2)+pow(vect.y,2)); + double angle=acos(vect.x/length); + + // Compute metrics + std::uint8_t thickness=50; + std::uint8_t tip_height=sqrt(3)/2*thickness; + std::uint32_t tail_length=length-tip_height; + + // Setup transform matrix + wxAffineMatrix2D rot_m,trans_m; + rot_m.Rotate(angle); + trans_m.Translate(xsrc,ysrc); + + // Init polygons + wxPoint tip[]={wxPoint(tail_length,-thickness/2),wxPoint(tail_length,thickness/2),wxPoint(tail_length+tip_height,0)}; + wxPoint tail[]={wxPoint(0,-thickness/4),wxPoint(tail_length,-thickness/4),wxPoint(tail_length,thickness/4),wxPoint(0,thickness/4)}; + + // Transform points + TRANS(tip[0]);TRANS(tip[1]);TRANS(tip[2]); + TRANS(tail[0]);TRANS(tail[1]);TRANS(tail[2]);TRANS(tail[3]); + + // Draw + dc.SetPen(wxNullPen); + dc.SetBrush(wxColour(255,0,0)); + dc.DrawPolygon(3,tip); + dc.DrawPolygon(4,tail); +} diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp index f53bb8f..ddab72b 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.hpp +++ b/src/game_tab/left_panel/board/BoardCanvas.hpp @@ -91,6 +91,9 @@ class BoardCanvas : public wxPanel { AnimState adata; GameState gs; + /// @brief Draw an arrow from a source point to a destination point on DC + void DrawArrow(wxDC &dc, int xsrc, int ysrc, int xdst, int ydst); + public: BoardCanvas(wxFrame *parent); BoardCanvas(wxFrame *parent,std::uint32_t square_width, bool frozen);