void MainFrame::OnAddElementsClick(wxCommandEvent& event) { Workspace* workspace = static_cast<Workspace*>(m_auiNotebook->GetCurrentPage()); if(workspace) { if(workspace->GetWorkspaceMode() != Workspace::MODE_INSERT) { auto elementList = workspace->GetElementList(); wxString statusBarText = ""; bool newElement = false; switch(event.GetId()) { case ID_ADDMENU_BUS: { Bus* newBus = new Bus(wxPoint2DDouble(0, 0), wxString::Format(_("Bus %d"), workspace->GetElementNumber(ID_BUS))); workspace->IncrementElementNumber(ID_BUS); elementList.push_back(newBus); statusBarText = _("Insert Bus: Click to insert, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_LINE: { Line* newLine = new Line(wxString::Format(_("Line %d"), workspace->GetElementNumber(ID_LINE))); elementList.push_back(newLine); workspace->IncrementElementNumber(ID_LINE); statusBarText = _("Insert Line: Click on two buses, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_TRANSFORMER: { Transformer* newTransformer = new Transformer( wxString::Format(_("Transformer %d"), workspace->GetElementNumber(ID_TRANSFORMER))); workspace->IncrementElementNumber(ID_TRANSFORMER); elementList.push_back(newTransformer); statusBarText = _("Insert Transformer: Click on two buses, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_GENERATOR: { SyncGenerator* newGenerator = new SyncGenerator( wxString::Format(_("Generator %d"), workspace->GetElementNumber(ID_SYNCGENERATOR))); workspace->IncrementElementNumber(ID_SYNCGENERATOR); elementList.push_back(newGenerator); statusBarText = _("Insert Generator: Click on a buses, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_LOAD: { Load* newLoad = new Load(wxString::Format(_("Load %d"), workspace->GetElementNumber(ID_LOAD))); workspace->IncrementElementNumber(ID_LOAD); elementList.push_back(newLoad); statusBarText = _("Insert Load: Click on a buses, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_CAPACITOR: { Capacitor* newCapacitor = new Capacitor(wxString::Format(_("Capacitor %d"), workspace->GetElementNumber(ID_CAPACITOR))); workspace->IncrementElementNumber(ID_CAPACITOR); elementList.push_back(newCapacitor); statusBarText = _("Insert Capacitor: Click on a buses, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_INDUCTOR: { Inductor* newInductor = new Inductor(wxString::Format(_("Inductor %d"), workspace->GetElementNumber(ID_INDUCTOR))); workspace->IncrementElementNumber(ID_INDUCTOR); elementList.push_back(newInductor); statusBarText = _("Insert Inductor: Click on a buses, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_INDMOTOR: { IndMotor* newIndMotor = new IndMotor( wxString::Format(_("Induction motor %d"), workspace->GetElementNumber(ID_INDMOTOR))); workspace->IncrementElementNumber(ID_INDMOTOR); elementList.push_back(newIndMotor); statusBarText = _("Insert Induction Motor: Click on a buses, ESC to cancel."); newElement = true; } break; case ID_ADDMENU_SYNCCOMP: { SyncMotor* newSyncCondenser = new SyncMotor( wxString::Format(_("Synchronous condenser %d"), workspace->GetElementNumber(ID_SYNCMOTOR))); workspace->IncrementElementNumber(ID_SYNCMOTOR); elementList.push_back(newSyncCondenser); statusBarText = _("Insert Synchronous Condenser: Click on a buses, ESC to cancel."); newElement = true; } break; } if(newElement) { workspace->SetElementList(elementList); workspace->SetWorkspaceMode(Workspace::MODE_INSERT); workspace->SetStatusBarText(statusBarText); workspace->Redraw(); } } } }
wxPoint2DDouble wxBoundingBox::GetMin() const { assert (m_validbbox == TRUE); return wxPoint2DDouble(m_minx, m_miny); }
wxPoint2DDouble ViewPort::GetDoublePixFromLL( double lat, double lon ) { double easting = 0; double northing = 0; double xlon = lon; /* Make sure lon and lon0 are same phase */ if( xlon * clon < 0. ) { if( xlon < 0. ) xlon += 360.; else xlon -= 360.; } if( fabs( xlon - clon ) > 180. ) { if( xlon > clon ) xlon -= 360.; else xlon += 360.; } // update cache of trig functions used for projections if(clat != lat0_cache) { lat0_cache = clat; switch( m_projection_type ) { case PROJECTION_MERCATOR: cache0 = toSMcache_y30(clat); break; case PROJECTION_POLAR: cache0 = toPOLARcache_e(clat); break; case PROJECTION_ORTHOGRAPHIC: case PROJECTION_STEREOGRAPHIC: case PROJECTION_GNOMONIC: cache_phi0(clat, &cache0, &cache1); break; } } switch( m_projection_type ) { case PROJECTION_MERCATOR: #if 0 toSM( lat, xlon, clat, clon, &easting, &northing ); #else toSMcache( lat, xlon, cache0, clon, &easting, &northing ); #endif break; case PROJECTION_TRANSVERSE_MERCATOR: // We calculate northings as referenced to the equator // And eastings as though the projection point is midscreen. double tmeasting, tmnorthing; double tmceasting, tmcnorthing; toTM( clat, clon, 0., clon, &tmceasting, &tmcnorthing ); toTM( lat, xlon, 0., clon, &tmeasting, &tmnorthing ); northing = tmnorthing - tmcnorthing; easting = tmeasting - tmceasting; break; case PROJECTION_POLYCONIC: // We calculate northings as referenced to the equator // And eastings as though the projection point is midscreen. double pceasting, pcnorthing; toPOLY( clat, clon, 0., clon, &pceasting, &pcnorthing ); double peasting, pnorthing; toPOLY( lat, xlon, 0., clon, &peasting, &pnorthing ); easting = peasting; northing = pnorthing - pcnorthing; break; case PROJECTION_ORTHOGRAPHIC: toORTHO( lat, xlon, cache0, cache1, clon, &easting, &northing ); break; case PROJECTION_POLAR: toPOLAR( lat, xlon, cache0, clat, clon, &easting, &northing ); break; case PROJECTION_STEREOGRAPHIC: toSTEREO( lat, xlon, cache0, cache1, clon, &easting, &northing ); break; case PROJECTION_GNOMONIC: toGNO( lat, xlon, cache0, cache1, clon, &easting, &northing ); break; case PROJECTION_EQUIRECTANGULAR: toEQUIRECT( lat, xlon, clat, clon, &easting, &northing ); break; default: printf("unhandled projection\n"); } if( !wxFinite(easting) || !wxFinite(northing) ) return wxPoint2DDouble( easting, northing ); double epix = easting * view_scale_ppm; double npix = northing * view_scale_ppm; double dxr = epix; double dyr = npix; // Apply VP Rotation double angle = rotation; if( angle ) { dxr = epix * cos( angle ) + npix * sin( angle ); dyr = npix * cos( angle ) - epix * sin( angle ); } return wxPoint2DDouble(( pix_width / 2.0 ) + dxr, ( pix_height / 2.0 ) - dyr); }
void CCodeView::LineTo(std::unique_ptr<wxGraphicsContext>& ctx, int x, int y) { std::vector<wxPoint2DDouble> points{wxPoint2DDouble(m_lx, m_ly), wxPoint2DDouble(x, y)}; ctx->DrawLines(points.size(), points.data()); m_lx = x; m_ly = y; }
RateLimiter::RateLimiter(int id) : ControlElement(id) { m_width = m_height = 36.0; Node* nodeIn = new Node(m_position + wxPoint2DDouble(-18, 0), Node::NODE_IN, m_borderSize); nodeIn->StartMove(m_position); Node* nodeOut = new Node(m_position + wxPoint2DDouble(18, 0), Node::NODE_OUT, m_borderSize); nodeOut->SetAngle(180.0); nodeOut->StartMove(m_position); m_nodeList.push_back(nodeIn); m_nodeList.push_back(nodeOut); }
void Constant::UpdatePoints() { if(m_nodeList.size() != 0) { if(m_angle == 0.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-m_width / 2, 0)); } else if(m_angle == 90.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -m_height / 2)); } else if(m_angle == 180.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(m_width / 2, 0)); } else if(m_angle == 270.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, m_height / 2)); } } }
wxPoint2DDouble wxChartArc::GetTooltipPosition() const { wxDouble centreAngle = m_startAngle + (m_endAngle - m_startAngle) / 2; wxDouble rangeFromCentre = m_innerRadius + (m_outerRadius - m_innerRadius) / 2; wxDouble x = m_x + cos(centreAngle) * rangeFromCentre; wxDouble y = m_y + sin(centreAngle) * rangeFromCentre; return wxPoint2DDouble(x, y); }
wxPoint2DDouble RoutePoint::GetDragHandlePoint(ChartCanvas *canvas) { if(!m_bDrawDragHandle) return wxPoint2DDouble(m_lon, m_lat); else{ return computeDragHandlePoint(canvas); } }
// applies that matrix to the point // | m_11 m_12 0 | // | src.m_x src._my 1 | x | m_21 m_22 0 | // | m_tx m_ty 1 | wxPoint2DDouble wxAffineMatrix2D::DoTransformPoint(const wxPoint2DDouble& src) const { if ( IsIdentity() ) return src; return wxPoint2DDouble(src.m_x * m_11 + src.m_y * m_21 + m_tx, src.m_x * m_12 + src.m_y * m_22 + m_ty); }
Constant::Constant(int id) : ControlElement(id) { SetValue(m_value); m_angle = 180.0; Node* nodeOut = new Node(m_position + wxPoint2DDouble(m_width / 2, 0), Node::NODE_OUT, m_borderSize); nodeOut->SetAngle(180.0); nodeOut->StartMove(m_position); m_nodeList.push_back(nodeOut); }
// applies the matrix except for translations // | m_11 m_12 0 | // | src.m_x src._my 0 | x | m_21 m_22 0 | // | m_tx m_ty 1 | wxPoint2DDouble wxAffineMatrix2D::DoTransformDistance(const wxPoint2DDouble& src) const { if ( IsIdentity() ) return src; return wxPoint2DDouble(src.m_x * m_11 + src.m_y * m_21, src.m_x * m_12 + src.m_y * m_22); }
void AffineTransformTestCase::Concat() { wxAffineMatrix2D m1; m1.Set(wxMatrix2D(0.9, 0.4, -0.4, 0.9), wxPoint2DDouble(0.0, 0.0)); wxAffineMatrix2D m2; m2.Set(wxMatrix2D(1.0, 0.0, 0.0, 1.0), wxPoint2DDouble(3.0, 5.0)); m1.Concat(m2); wxMatrix2D m; wxPoint2DDouble p; m1.Get(&m, &p); const double delta = 0.01; CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.9, m.m_11, delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.4, m.m_12, delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( -0.4, m.m_21, delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.9, m.m_22, delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.7, p.m_x, delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL( 5.7, p.m_y, delta ); }
void RateLimiter::Draw(wxPoint2DDouble translation, double scale) const { glLineWidth(1.0); if(m_selected) { glColor4dv(m_selectionColour.GetRGBA()); double borderSize = (m_borderSize * 2.0 + 1.0) / scale; DrawRectangle(m_position, m_width + borderSize, m_height + borderSize); } glColor4d(1.0, 1.0, 1.0, 1.0); DrawRectangle(m_position, m_width, m_height); glColor4d(0.0, 0.0, 0.0, 1.0); DrawRectangle(m_position, m_width, m_height, GL_LINE_LOOP); // Plot symbol. std::vector<wxPoint2DDouble> axis; axis.push_back(m_position + wxPoint2DDouble(-13, 0)); axis.push_back(m_position + wxPoint2DDouble(13, 0)); axis.push_back(m_position + wxPoint2DDouble(0, -13)); axis.push_back(m_position + wxPoint2DDouble(0, 13)); DrawLine(axis, GL_LINES); glLineWidth(2.0); std::vector<wxPoint2DDouble> limSymbol; limSymbol.push_back(m_position + wxPoint2DDouble(10, -10)); limSymbol.push_back(m_position + wxPoint2DDouble(-10, 10)); glColor4d(0.0, 0.3, 1.0, 1.0); DrawLine(limSymbol); glColor4d(0.0, 0.0, 0.0, 1.0); DrawNodes(); }
wxPoint2DDouble RoutePoint::computeDragHandlePoint(ChartCanvas *canvas) { wxPoint r; canvas->GetCanvasPointPix( m_lat, m_lon, &r ); double lat, lon; canvas->GetCanvasPixPoint(r.x + m_drag_icon_offset, r.y + m_drag_icon_offset, lat, lon); // Keep the members updated m_dragHandleLat = lat; m_dragHandleLon = lon; return wxPoint2DDouble(lon, lat); }
void RateLimiter::UpdatePoints() { if(m_angle == 0.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, 0)); m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, 0)); } else if(m_angle == 90.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -18)); m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, 18)); } else if(m_angle == 180.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 0)); m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 0)); } else if(m_angle == 270.0) { m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, 18)); m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -18)); } }
void Shunt::DrawGround(wxPoint2DDouble position) const { std::vector<wxPoint2DDouble> groundPts; groundPts.push_back(position); groundPts.push_back(position + wxPoint2DDouble(0, 10)); groundPts.push_back(position + wxPoint2DDouble(-10, 10)); groundPts.push_back(position + wxPoint2DDouble(10, 10)); groundPts.push_back(position + wxPoint2DDouble(-6, 15)); groundPts.push_back(position + wxPoint2DDouble(6, 15)); groundPts.push_back(position + wxPoint2DDouble(-3, 20)); groundPts.push_back(position + wxPoint2DDouble(3, 20)); DrawLine(groundPts, GL_LINES); }
wxStackedColumnChart::wxStackedColumnChart(wxChartsCategoricalData::ptr &data, const wxSize &size) : m_grid( wxPoint2DDouble(m_options.GetPadding().GetLeft(), m_options.GetPadding().GetRight()), size, wxChartCategoricalAxis::make_shared("x", data->GetCategories(), m_options.GetGridOptions().GetXAxisOptions()), wxChartNumericalAxis::make_shared("y", GetCumulativeMinValue(data->GetDatasets()), GetCumulativeMaxValue(data->GetDatasets()), m_options.GetGridOptions().GetYAxisOptions()), m_options.GetGridOptions() ) { const wxVector<wxChartsDoubleDataset::ptr>& datasets = data->GetDatasets(); for (size_t i = 0; i < datasets.size(); ++i) { const wxChartsDoubleDataset& dataset = *datasets[i]; Dataset::ptr newDataset(new Dataset()); int border = wxLEFT | wxRIGHT; if (i == (datasets.size() - 1)) { border |= wxTOP; } const wxVector<wxDouble>& datasetData = dataset.GetData(); for (size_t j = 0; j < datasetData.size(); ++j) { std::stringstream tooltip; tooltip << datasetData[j]; wxChartTooltipProvider::ptr tooltipProvider( new wxChartTooltipProviderStatic(data->GetCategories()[j], tooltip.str(), dataset.GetFillColor()) ); newDataset->AppendColumn(Column::ptr(new Column( datasetData[j], tooltipProvider, 25, 50, dataset.GetFillColor(), dataset.GetStrokeColor(), border ))); } m_datasets.push_back(newDataset); } }
void AffineTransformTestCase::InvertMatrix() { wxAffineMatrix2D matrix1; matrix1.Set(wxMatrix2D(2, 1, 1, 1), wxPoint2DDouble(1, 1)); wxAffineMatrix2D matrix2(matrix1); matrix2.Invert(); wxMatrix2D m; wxPoint2DDouble p; matrix2.Get(&m, &p); CPPUNIT_ASSERT_EQUAL( 1, (int)m.m_11 ); CPPUNIT_ASSERT_EQUAL( -1, (int)m.m_12 ); CPPUNIT_ASSERT_EQUAL( -1, (int)m.m_21 ); CPPUNIT_ASSERT_EQUAL( 2, (int)m.m_22 ); CPPUNIT_ASSERT_EQUAL( 0, (int)p.m_x ); CPPUNIT_ASSERT_EQUAL( -1, (int)p.m_y ); matrix2.Concat(matrix1); CPPUNIT_ASSERT( matrix2.IsIdentity() ); }
void MainFrame::OnMoveClick(wxRibbonButtonBarEvent& event) { Workspace* workspace = static_cast<Workspace*>(m_auiNotebook->GetCurrentPage()); if(workspace) { auto elementList = workspace->GetAllElements(); // Calculate the average position of selected elements. wxPoint2DDouble averagePos(0, 0); int numSelElements = 0; for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) { Element* element = *it; if(element->IsSelected()) { averagePos += element->GetPosition(); numSelElements++; } } averagePos = wxPoint2DDouble(averagePos.m_x / double(numSelElements), averagePos.m_y / double(numSelElements)); // Set the move position to the average of selected elements. for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) { Element* element = *it; if(element->IsSelected()) { element->StartMove(averagePos); } } workspace->SetWorkspaceMode(Workspace::MODE_MOVE_ELEMENT); } }
wxPoint2DDouble wxBoundingBox::GetMax() const { assert (m_validbbox == TRUE); return wxPoint2DDouble(m_maxx, m_maxy); }
void Exponential::Draw(wxPoint2DDouble translation, double scale) const { glLineWidth(1.0); if(m_selected) { glColor4dv(m_selectionColour.GetRGBA()); double borderSize = (m_borderSize * 2.0 + 1.0) / scale; DrawRectangle(m_position, m_width + borderSize, m_height + borderSize); } glColor4d(1.0, 1.0, 1.0, 1.0); DrawRectangle(m_position, m_width, m_height); glColor4d(0.0, 0.0, 0.0, 1.0); DrawRectangle(m_position, m_width, m_height, GL_LINE_LOOP); // Plot symbol. std::vector<wxPoint2DDouble> axis; axis.push_back(m_position + wxPoint2DDouble(-13, 13)); axis.push_back(m_position + wxPoint2DDouble(13, 13)); axis.push_back(m_position + wxPoint2DDouble(-13, -13)); axis.push_back(m_position + wxPoint2DDouble(-13, 13)); DrawLine(axis, GL_LINES); glLineWidth(2.0); std::vector<wxPoint2DDouble> expSymbol; expSymbol.push_back(m_position + wxPoint2DDouble(-13, 13)); expSymbol.push_back(m_position + wxPoint2DDouble(-6, 13)); expSymbol.push_back(m_position + wxPoint2DDouble(2, 12)); expSymbol.push_back(m_position + wxPoint2DDouble(4, 11)); expSymbol.push_back(m_position + wxPoint2DDouble(6, 10)); expSymbol.push_back(m_position + wxPoint2DDouble(8, 7)); expSymbol.push_back(m_position + wxPoint2DDouble(11, -1)); expSymbol.push_back(m_position + wxPoint2DDouble(12, -7)); expSymbol.push_back(m_position + wxPoint2DDouble(13, -13)); glColor4d(0.0, 0.3, 1.0, 1.0); DrawLine(expSymbol); glColor4d(0.0, 0.0, 0.0, 1.0); DrawNodes(); }
wxPoint2DDouble wxGraphicsPath::GetCurrentPoint() const { wxDouble x,y; GetCurrentPoint(&x,&y); return wxPoint2DDouble(x,y); }
wxPoint2DDouble ViewPort::GetDoublePixFromLL( double lat, double lon ) { double easting, northing; double xlon = lon; /* Make sure lon and lon0 are same phase */ if( xlon * clon < 0. ) { if( xlon < 0. ) xlon += 360.; else xlon -= 360.; } if( fabs( xlon - clon ) > 180. ) { if( xlon > clon ) xlon -= 360.; else xlon += 360.; } if( PROJECTION_TRANSVERSE_MERCATOR == m_projection_type ) { // We calculate northings as referenced to the equator // And eastings as though the projection point is midscreen. double tmeasting, tmnorthing; double tmceasting, tmcnorthing; toTM( clat, clon, 0., clon, &tmceasting, &tmcnorthing ); toTM( lat, xlon, 0., clon, &tmeasting, &tmnorthing ); northing = tmnorthing - tmcnorthing; easting = tmeasting - tmceasting; } else if( PROJECTION_POLYCONIC == m_projection_type ) { // We calculate northings as referenced to the equator // And eastings as though the projection point is midscreen. double pceasting, pcnorthing; toPOLY( clat, clon, 0., clon, &pceasting, &pcnorthing ); double peasting, pnorthing; toPOLY( lat, xlon, 0., clon, &peasting, &pnorthing ); easting = peasting; northing = pnorthing - pcnorthing; } else { #if 0 toSM( lat, xlon, clat, clon, &easting, &northing ); #else if(clat != toSM_lat0_cache) { toSM_lat0_cache = clat; toSM_y30_cache = toSMcache_y30(clat); } toSMcache( lat, xlon, toSM_y30_cache, clon, &easting, &northing ); #endif } if( !wxFinite(easting) || !wxFinite(northing) ) return wxPoint( 0, 0 ); double epix = easting * view_scale_ppm; double npix = northing * view_scale_ppm; double dxr = epix; double dyr = npix; // Apply VP Rotation double angle = rotation; if(!g_bskew_comp) angle += skew; if( angle ) { dxr = epix * cos( angle ) + npix * sin( angle ); dyr = npix * cos( angle ) - epix * sin( angle ); } return wxPoint2DDouble(( pix_width / 2 ) + dxr, ( pix_height / 2 ) - dyr); }
// Set the size and shape of the tip window and returns the offset of its // content area from the top (horizontal offset is always 0 currently). int SetTipShapeAndSize(wxTipKind tipKind, const wxSize& contentSize) { #if wxUSE_GRAPHICS_CONTEXT wxSize size = contentSize; // The size is the vertical size and the offset is the distance from // edge for asymmetric tips, currently hard-coded to be the same as the // size. const int tipSize = GetTipHeight(); const int tipOffset = tipSize; // The horizontal position of the tip. int x = -1; // The vertical coordinates of the tip base and apex. int yBase = -1, yApex = -1; // The offset of the content part of the window. int dy = -1; // Define symbolic names for the rectangle corners and mid-way points // that we use below in an attempt to make the code more clear. Notice // that these values must be consecutive as we iterate over them. enum RectPoint { RectPoint_TopLeft, RectPoint_Top, RectPoint_TopRight, RectPoint_Right, RectPoint_BotRight, RectPoint_Bot, RectPoint_BotLeft, RectPoint_Left, RectPoint_Max }; // The starting point for AddArcToPoint() calls below, we iterate over // all RectPoints from it. RectPoint pointStart = RectPoint_Max; // Hard-coded radius of the round main rectangle corners. const double RADIUS = 5; // Create a path defining the shape of the tooltip window. wxGraphicsPath path = wxGraphicsRenderer::GetDefaultRenderer()->CreatePath(); if ( tipKind == wxTipKind_Auto ) tipKind = GetBestTipKind(); // Points defining the tip shape (in clockwise order as we must end at // tipPoints[0] after drawing the rectangle outline in this order). wxPoint2DDouble tipPoints[3]; switch ( tipKind ) { case wxTipKind_Auto: wxFAIL_MSG( "Impossible kind value" ); break; case wxTipKind_TopLeft: x = tipOffset; yApex = 0; yBase = tipSize; dy = tipSize; tipPoints[0] = wxPoint2DDouble(x, yBase); tipPoints[1] = wxPoint2DDouble(x, yApex); tipPoints[2] = wxPoint2DDouble(x + tipSize, yBase); pointStart = RectPoint_TopRight; break; case wxTipKind_TopRight: x = size.x - tipOffset; yApex = 0; yBase = tipSize; dy = tipSize; tipPoints[0] = wxPoint2DDouble(x - tipSize, yBase); tipPoints[1] = wxPoint2DDouble(x, yApex); tipPoints[2] = wxPoint2DDouble(x, yBase); pointStart = RectPoint_TopRight; break; case wxTipKind_BottomLeft: x = tipOffset; yApex = size.y + tipSize; yBase = size.y; dy = 0; tipPoints[0] = wxPoint2DDouble(x + tipSize, yBase); tipPoints[1] = wxPoint2DDouble(x, yApex); tipPoints[2] = wxPoint2DDouble(x, yBase); pointStart = RectPoint_BotLeft; break; case wxTipKind_BottomRight: x = size.x - tipOffset; yApex = size.y + tipSize; yBase = size.y; dy = 0; tipPoints[0] = wxPoint2DDouble(x, yBase); tipPoints[1] = wxPoint2DDouble(x, yApex); tipPoints[2] = wxPoint2DDouble(x - tipSize, yBase); pointStart = RectPoint_BotLeft; break; case wxTipKind_Top: x = size.x/2; yApex = 0; yBase = tipSize; dy = tipSize; { // A half-side of an equilateral triangle is its altitude // divided by sqrt(3) ~= 1.73. const double halfside = tipSize/1.73; tipPoints[0] = wxPoint2DDouble(x - halfside, yBase); tipPoints[1] = wxPoint2DDouble(x, yApex); tipPoints[2] = wxPoint2DDouble(x + halfside, yBase); } pointStart = RectPoint_TopRight; break; case wxTipKind_Bottom: x = size.x/2; yApex = size.y + tipSize; yBase = size.y; dy = 0; { const double halfside = tipSize/1.73; tipPoints[0] = wxPoint2DDouble(x + halfside, yBase); tipPoints[1] = wxPoint2DDouble(x, yApex); tipPoints[2] = wxPoint2DDouble(x - halfside, yBase); } pointStart = RectPoint_BotLeft; break; case wxTipKind_None: x = size.x/2; dy = 0; path.AddRoundedRectangle(0, 0, size.x, size.y, RADIUS); break; } wxASSERT_MSG( dy != -1, wxS("Unknown tip kind?") ); size.y += tipSize; SetSize(size); if ( tipKind != wxTipKind_None ) { path.MoveToPoint(tipPoints[0]); path.AddLineToPoint(tipPoints[1]); path.AddLineToPoint(tipPoints[2]); const double xLeft = 0.; const double xMid = size.x/2.; const double xRight = size.x; const double yTop = dy; const double yMid = (dy + size.y)/2.; const double yBot = dy + contentSize.y; wxPoint2DDouble rectPoints[RectPoint_Max]; rectPoints[RectPoint_TopLeft] = wxPoint2DDouble(xLeft, yTop); rectPoints[RectPoint_Top] = wxPoint2DDouble(xMid, yTop); rectPoints[RectPoint_TopRight] = wxPoint2DDouble(xRight, yTop); rectPoints[RectPoint_Right] = wxPoint2DDouble(xRight, yMid); rectPoints[RectPoint_BotRight] = wxPoint2DDouble(xRight, yBot); rectPoints[RectPoint_Bot] = wxPoint2DDouble(xMid, yBot); rectPoints[RectPoint_BotLeft] = wxPoint2DDouble(xLeft, yBot); rectPoints[RectPoint_Left] = wxPoint2DDouble(xLeft, yMid); // Iterate over all rectangle rectPoints for the first 3 corners. unsigned n = pointStart; for ( unsigned corner = 0; corner < 3; corner++ ) { const wxPoint2DDouble& pt1 = rectPoints[n]; n = (n + 1) % RectPoint_Max; const wxPoint2DDouble& pt2 = rectPoints[n]; path.AddArcToPoint(pt1.m_x, pt1.m_y, pt2.m_x, pt2.m_y, RADIUS); n = (n + 1) % RectPoint_Max; } // Last one wraps to the first point of the tip. const wxPoint2DDouble& pt1 = rectPoints[n]; const wxPoint2DDouble& pt2 = tipPoints[0]; path.AddArcToPoint(pt1.m_x, pt1.m_y, pt2.m_x, pt2.m_y, RADIUS); path.CloseSubpath(); } SetShape(path); #else // !wxUSE_GRAPHICS_CONTEXT int x = contentSize.x/2, yApex = 0, dy = 0; SetSize(contentSize); #endif // wxUSE_GRAPHICS_CONTEXT/!wxUSE_GRAPHICS_CONTEXT m_anchorPos.x = x; m_anchorPos.y = yApex; return dy; }
wxPoint2DDouble wxPlotMarker::GetPlotPosition() const { wxCHECK_MSG(Ok(), wxPoint2DDouble(), wxT("Invalid plot marker")); return M_PMARKERDATA->m_rect.GetLeftTop(); }