// Select points within rectangle void FieldView::SelectPointsInRect(const CC_coord& c1, const CC_coord& c2, bool toggleSelected) { CC_lasso lasso(c1); lasso.Append(CC_coord(c1.x, c2.y)); lasso.Append(c2); lasso.Append(CC_coord(c2.x, c1.y)); lasso.End(); SelectWithLasso(&lasso, toggleSelected); }
// Return a bounding box of the show of where the marchers are. If they are outside the show, we don't see them. std::pair<CC_coord, CC_coord> GetMarcherBoundingBox(const std::vector<CC_point>& pts) { CC_coord bounding_box_upper_left{10000, 10000}; CC_coord bounding_box_low_right{-10000, -10000}; for (auto& i : pts) { auto position = i.GetPos(); bounding_box_upper_left = CC_coord(std::min(bounding_box_upper_left.x, position.x), std::min(bounding_box_upper_left.y, position.y)); bounding_box_low_right = CC_coord(std::max(bounding_box_low_right.x, position.x), std::max(bounding_box_low_right.y, position.y)); } return { bounding_box_upper_left, bounding_box_low_right }; }
void CC_point_UnitTests() { // test some defaults: CC_point_values values; values.mFlags = 0; values.mSym = SYMBOL_PLAIN; values.mPos = CC_coord(); for (unsigned i = 0; i < CC_point::kNumRefPoints; ++i) values.mRef[i] = CC_coord(); values.GetFlip = false; // test defaults CC_point underTest; assert(Check_CC_point(underTest, values)); // test flip underTest.Flip(false); assert(Check_CC_point(underTest, values)); values.mFlags = 1; values.GetFlip = true; underTest.Flip(true); assert(Check_CC_point(underTest, values)); values.mFlags = 0; values.GetFlip = false; underTest.Flip(false); assert(Check_CC_point(underTest, values)); // test flip toggle values.mFlags = 1; values.GetFlip = true; underTest.FlipToggle(); assert(Check_CC_point(underTest, values)); values.mFlags = 0; values.GetFlip = false; underTest.FlipToggle(); assert(Check_CC_point(underTest, values)); }
void CC_coord_UnitTests() { static const size_t kNumRand = 10; // test some defaults: { CC_coord undertest; assert(0.0 == undertest.Magnitude()); assert(0.0 == undertest.DM_Magnitude()); assert(0.0 == undertest.Direction()); } // test equality: for (size_t i = 0; i < kNumRand; ++i) { Coord x1, y1, x2, y2; x1 = rand(); y1 = rand(); x2 = rand(); y2 = rand(); CC_coord undertest1(x1, y1); CC_coord undertest2(x2, y2); assert(x1 == undertest1.x); assert(y1 == undertest1.y); assert(x2 == undertest2.x); assert(y2 == undertest2.y); assert(CC_coord(x1,y1) == undertest1); assert(CC_coord(x2,y2) == undertest2); assert(!(CC_coord(x1,y1) != undertest1)); assert(!(CC_coord(x2,y2) != undertest2)); CC_coord newValue; Coord x3, y3; newValue = undertest1 + undertest2; x3 = undertest1.x + undertest2.x; y3 = undertest1.y + undertest2.y; assert((x3) == newValue.x); assert((y3) == newValue.y); newValue = undertest1; newValue += undertest2; assert((x3) == newValue.x); assert((y3) == newValue.y); newValue = undertest1 - undertest2; x3 = undertest1.x - undertest2.x; y3 = undertest1.y - undertest2.y; assert((x3) == newValue.x); assert((y3) == newValue.y); newValue = undertest1; newValue -= undertest2; assert((x3) == newValue.x); assert((y3) == newValue.y); newValue = -undertest1; assert((-undertest1.x) == newValue.x); assert((-undertest1.y) == newValue.y); short factor = rand(); newValue = undertest1 * factor; x3 = undertest1.x * factor; y3 = undertest1.y * factor; assert((x3) == newValue.x); assert((y3) == newValue.y); newValue = undertest1; newValue *= factor; assert((x3) == newValue.x); assert((y3) == newValue.y); // avoid div by 0 if (factor) { newValue = undertest1 / factor; x3 = undertest1.x / factor; y3 = undertest1.y / factor; assert((x3) == newValue.x); assert((y3) == newValue.y); newValue = undertest1; newValue /= factor; assert((x3) == newValue.x); assert((y3) == newValue.y); } } }
void ShowModeStandard_DrawHelper(wxDC& dc, const CalChartConfiguration& config, const ShowModeStandard& mode, HowToDraw howToDraw) { wxPoint points[5]; auto fieldsize = mode.FieldSize(); CC_coord border1 = mode.Border1(); if (howToDraw == ShowMode_kOmniView) { border1 = CC_coord(0, 0); } auto offsetx = 0;//-fieldsize.x/2; auto offsety = 0;//-fieldsize.y/2; auto borderoffsetx = 0;//-border1.x; auto borderoffsety = 0;//-border1.y; points[0] = wxPoint(0+offsetx, 0+offsety); points[1] = wxPoint(fieldsize.x+offsetx, 0+offsety); points[2] = wxPoint(fieldsize.x+offsetx, fieldsize.y+offsety); points[3] = wxPoint(0+offsetx, fieldsize.y+offsety); points[4] = points[0]; // Draw outline dc.DrawLines(5, points, border1.x+borderoffsetx, border1.y+borderoffsety); // Draw vertical lines for (Coord j = Int2Coord(8)+offsetx; j < fieldsize.x+offsetx; j += Int2Coord(8)) { // draw solid yardlines points[0] = wxPoint(j, 0+offsety); points[1] = wxPoint(j, fieldsize.y+offsety); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); } for (Coord j = Int2Coord(4)+offsetx; (howToDraw == ShowMode_kFieldView || howToDraw == ShowMode_kPrinting) && j < fieldsize.x+offsetx; j += Int2Coord(8)) { // draw mid-dotted lines for (Coord k = 0+offsety; k < fieldsize.y+offsety; k += Int2Coord(2)) { points[0] = wxPoint(j, k); points[1] = wxPoint(j, k + Int2Coord(1)); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); } } // Draw horizontal mid-dotted lines for (Coord j = Int2Coord(4)+offsety; (howToDraw == ShowMode_kFieldView || howToDraw == ShowMode_kPrinting) && j < fieldsize.y+offsety; j += Int2Coord(4)) { if ((j == Int2Coord(mode.HashW())) || j == Int2Coord(mode.HashE())) continue; for (Coord k = 0+offsetx; k < fieldsize.x+offsetx; k += Int2Coord(2)) { points[0] = wxPoint(k, j); points[1] = wxPoint(k + Int2Coord(1), j); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); } } // Draw hashes for (Coord j = Int2Coord(0)+offsetx; j < fieldsize.x+offsetx; j += Int2Coord(8)) { points[0] = wxPoint(j+Float2Coord(0.0*8), Int2Coord(mode.HashW())); points[1] = wxPoint(j+Float2Coord(0.1*8), Int2Coord(mode.HashW())); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); points[0] = wxPoint(j+Float2Coord(0.9*8), Int2Coord(mode.HashW())); points[1] = wxPoint(j+Float2Coord(1.0*8), Int2Coord(mode.HashW())); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); points[0] = wxPoint(j+Float2Coord(0.0*8), Int2Coord(mode.HashE())); points[1] = wxPoint(j+Float2Coord(0.1*8), Int2Coord(mode.HashE())); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); points[0] = wxPoint(j+Float2Coord(0.9*8), Int2Coord(mode.HashE())); points[1] = wxPoint(j+Float2Coord(1.0*8), Int2Coord(mode.HashE())); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); for (size_t midhash = 1; (howToDraw == ShowMode_kFieldView || howToDraw == ShowMode_kPrinting) && midhash < 5; ++midhash) { points[0] = wxPoint(j+Float2Coord(midhash/5.0*8), Int2Coord(mode.HashW())); points[1] = wxPoint(j+Float2Coord(midhash/5.0*8), Float2Coord(mode.HashW()-(0.2*8))); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); points[0] = wxPoint(j+Float2Coord(midhash/5.0*8), Int2Coord(mode.HashE())); points[1] = wxPoint(j+Float2Coord(midhash/5.0*8), Float2Coord(mode.HashE()+(0.2*8))); dc.DrawLines(2, points, border1.x+borderoffsetx, border1.y+borderoffsety); } } // Draw labels wxFont *yardLabelFont = wxTheFontList->FindOrCreateFont((int)Float2Coord(config.Get_YardsSize()), wxSWISS, wxNORMAL, wxNORMAL); dc.SetFont(*yardLabelFont); for (int i = 0; (howToDraw == ShowMode_kFieldView || howToDraw == ShowMode_kOmniView || howToDraw == ShowMode_kPrinting) && i < Coord2Int(fieldsize.x)/8+1; i++) { CC_coord fieldedge = mode.Offset() - mode.Border1(); wxCoord textw, texth, textd; auto text = config.Get_yard_text(i+(-Coord2Int(fieldedge.x)+(kYardTextValues-1)*4)/8); dc.GetTextExtent(text, &textw, &texth, &textd); dc.DrawText(text, offsetx + Int2Coord(i*8) - textw/2 + border1.x+borderoffsetx, border1.y+borderoffsety - offsety - texth + ((howToDraw == ShowMode_kOmniView) ? Int2Coord(8) : 0)); dc.DrawText(text, offsetx + Int2Coord(i*8) - textw/2 + border1.x+borderoffsetx, border1.y+borderoffsety + fieldsize.y-offsety - ((howToDraw == ShowMode_kOmniView) ? Int2Coord(8) : 0)); } }