mathplot.cpp: optimize a plot function to have a better look for dashed lines,
and less lines to plot when they can be merged.
This commit is contained in:
parent
fd4fb61acc
commit
d1e2b57d96
|
@ -688,8 +688,12 @@ void mpFXY::Plot( wxDC& dc, mpWindow& w )
|
||||||
int dupx0 = 0; // count of currently merged vertical lines
|
int dupx0 = 0; // count of currently merged vertical lines
|
||||||
wxPoint line_start; // starting point of the current line to draw
|
wxPoint line_start; // starting point of the current line to draw
|
||||||
|
|
||||||
// Note: we do not use dc.DrawLines(), because at least on Windows
|
// A buffer to store coordinates of lines to draw
|
||||||
// dc.DrawLine() is faster, and dc.DrawLines() can hang for a lot
|
std::vector<wxPoint>pointList;
|
||||||
|
pointList.reserve( endPx - startPx + 1 );
|
||||||
|
|
||||||
|
// Note: we can use dc.DrawLines() only for a reasonable number or points (<10000),
|
||||||
|
// because at least on Windows dc.DrawLines() can hang for a lot of points.
|
||||||
// (> 10000 points) (can happens when a lot of points is calculated)
|
// (> 10000 points) (can happens when a lot of points is calculated)
|
||||||
// To avoid long draw time (and perhaps hanging) one plot only not redundant lines.
|
// To avoid long draw time (and perhaps hanging) one plot only not redundant lines.
|
||||||
// To avoid artifacts when skipping points to the same x coordinate, for each
|
// To avoid artifacts when skipping points to the same x coordinate, for each
|
||||||
|
@ -716,8 +720,7 @@ void mpFXY::Plot( wxDC& dc, mpWindow& w )
|
||||||
ymin0 = ymax0 = y1;
|
ymin0 = ymax0 = y1;
|
||||||
dupx0 = 0;
|
dupx0 = 0;
|
||||||
|
|
||||||
if( count )
|
pointList.emplace_back( wxPoint( x1, y1 ) );
|
||||||
dc.DrawLine( line_start, wxPoint( x1, y1 ) );
|
|
||||||
|
|
||||||
line_start.x = x1;
|
line_start.x = x1;
|
||||||
line_start.y = y1;
|
line_start.y = y1;
|
||||||
|
@ -732,6 +735,30 @@ void mpFXY::Plot( wxDC& dc, mpWindow& w )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( pointList.size() > 1 )
|
||||||
|
{
|
||||||
|
// For a better look (when using dashed lines) and more optimization,
|
||||||
|
// try to merge horizontal segments, in order to plot longer lines
|
||||||
|
// we are merging horizontal segments because this is easy,
|
||||||
|
// and horizontal segments are a frequent cases
|
||||||
|
std::vector<wxPoint> drawPoints;
|
||||||
|
drawPoints.reserve( endPx - startPx + 1 );
|
||||||
|
|
||||||
|
drawPoints.push_back( pointList[0] ); // push the first point in list
|
||||||
|
|
||||||
|
for( size_t ii = 1; ii < pointList.size()-1; ii++ )
|
||||||
|
{
|
||||||
|
if( pointList[ii-1].y == pointList[ii].y )
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
drawPoints.push_back( pointList[ii] );
|
||||||
|
}
|
||||||
|
|
||||||
|
drawPoints.push_back( pointList.back() ); // push the last point in list
|
||||||
|
|
||||||
|
dc.DrawLines( drawPoints.size(), &drawPoints[0] );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m_name.IsEmpty() && m_showName )
|
if( !m_name.IsEmpty() && m_showName )
|
||||||
|
|
Loading…
Reference in New Issue