ScatterDraw: Added OnPaint

git-svn-id: svn://ultimatepp.org/upp/trunk@10839 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
koldo 2017-02-10 22:04:57 +00:00
parent 98bc3b5840
commit 447bbf4fb1
4 changed files with 82 additions and 49 deletions

View file

@ -3,16 +3,16 @@
void DrawLine(Draw &w, double x0, double y0, double x1, double y1, double width, const Color &color);
void DrawLine(Painter &w, double x0, double y0, double x1, double y1, double width, const Color &color);
void DrawLineOpa(Draw& w, int x0, int y0, int x1, int y1, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void DrawLineOpa(Painter& w, int x0, int y0, int x1, int y1, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void DrawCircleOpa(Draw& w, int x, int y, int r, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void DrawCircleOpa(Painter& w, int x, int y, int r, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void DrawLineOpa(Draw& w, double x0, double y0, double x1, double y1, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void DrawLineOpa(Painter& w, double x0, double y0, double x1, double y1, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void DrawCircleOpa(Draw& w, double x, double y, double r, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void DrawCircleOpa(Painter& w, double x, double y, double r, int scale, double opacity, double thick, const Color &_color, String pattern, const Color &background = Null);
void FillRectangleOpa(Draw &w, double x0, double y0, double x1, double y1, int scale, double opacity, const Color &background, const Color &color);
void FillRectangleOpa(Painter &w, double x0, double y0, double x1, double y1, int scale, double opacity, const Color &background, const Color &color);
void DrawPolylineOpa(Draw& w, const Vector<Point> &p, int scale, double opacity, double thick, const Color &color, String pattern = "", const Color &background = Null);
void DrawPolylineOpa(Painter& w, const Vector<Point> &p, int scale, double opacity, double thick, const Color &color, String pattern = "", const Color &background = Null);
void FillPolylineOpa(Draw& w, const Vector<Point> &p, int scale, double opacity, const Color &background, const Color &fillColor);
void FillPolylineOpa(Painter& w, const Vector<Point> &p, int scale, double opacity, const Color &background, const Color &fillColor);
void DrawPolylineOpa(Draw& w, const Vector<Pointf> &p, int scale, double opacity, double thick, const Color &color, String pattern = "", const Color &background = Null);
void DrawPolylineOpa(Painter& w, const Vector<Pointf> &p, int scale, double opacity, double thick, const Color &color, String pattern = "", const Color &background = Null);
void FillPolylineOpa(Draw& w, const Vector<Pointf> &p, int scale, double opacity, const Color &background, const Color &fillColor);
void FillPolylineOpa(Painter& w, const Vector<Pointf> &p, int scale, double opacity, const Color &background, const Color &fillColor);
void DrawVArrow(Draw &w, double x0, double y0, double x1, double y1, double width, double aWidth, double aHeight, const Color &color);
void DrawVArrow(Painter &w, double x0, double y0, double x1, double y1, double width, double aWidth, double aHeight, const Color &color);
void DrawHArrow(Draw &w, double x0, double y0, double x1, double y1, double width, double aWidth, double aHeight, const Color &color);

View file

@ -243,14 +243,14 @@ void ScatterDraw::DrawLegend(Draw& w, const Size &size, int scale) const {
scaledFont.Bold();
for(int row = 0, start = 0; row <= nrows; row++) {
for(int i = start; i < min(start + nlr, nlab); i++) {
int lx = rect.left + (i - start)*legendWidth + xWidth;
int ly = (rowIncSign >= 0 ? rect.top : rect.bottom) +
double lx = rect.left + (i - start)*legendWidth + xWidth;
double ly = (rowIncSign >= 0 ? rect.top : rect.bottom) +
rowIncSign*int(rowHeight*(row + 0.6) + loclegendRowSpacing*(row + 0.5));
Vector <Point> line;
line << Point(lx, ly) << Point(lx + lineLen, ly);
Vector <Pointf> line;
line << Pointf(lx, ly) << Pointf(lx + lineLen, ly);
if (series[i].opacity > 0 && series[i].seriesPlot)
DrawPolylineOpa(w, line, scale, 1, series[i].thickness, series[i].color, series[i].dash);
Point mark_p(lx + xWidth/*scale*7*/, ly);
Pointf mark_p(lx + xWidth/*scale*7*/, ly);
if (series[i].markWidth >= 1 && series[i].markPlot)
series[i].markPlot->Paint(w, scale, mark_p, series[i].markWidth, series[i].markColor,
series[i].markBorderWidth, series[i].markBorderColor);
@ -1710,18 +1710,18 @@ void ClipEnd(Painter &w) {
;
}
void DrawLineOpa(Draw& w, int x0, int y0, int x1, int y1, int scale, double opacity,
void DrawLineOpa(Draw& w, double x0, double y0, double x1, double y1, int scale, double opacity,
double thick, const Color &_color, String dash, const Color &background) {
Vector<Point> p;
p << Point(x0, y0) << Point(x1, y1);
Vector<Pointf> p;
p << Pointf(x0, y0) << Pointf(x1, y1);
DrawPolylineOpa(w, p, scale, opacity, thick, _color, dash, background);
}
void DrawCircleOpa(Draw& w, int x, int y, int r, int scale, double opacity,
void DrawCircleOpa(Draw& w, double x, double y, double r, int scale, double opacity,
double thick, const Color &_color, String dash, const Color &background) {
Vector<Point> p;
Vector<Pointf> p;
for (double ang = 0; ang <= 2*M_PI; ang += 2*M_PI/50)
p << Point(fround(x + r*cos(ang)), fround(y + r*sin(ang)));
p << Pointf(fround(x + r*cos(ang)), fround(y + r*sin(ang)));
DrawPolylineOpa(w, p, scale, opacity, thick, _color, dash, background);
}
@ -1742,7 +1742,7 @@ void DashScaled(Painter& w, const String dash, double scale) {
}
}
void DrawLineOpa(Painter& w, int x0, int y0, int x1, int y1, int scale,
void DrawLineOpa(Painter& w, double x0, double y0, double x1, double y1, int scale,
double opacity, double thick, const Color &color, String dash,
const Color &background) {
w.Move(Pointf(x0, y0));
@ -1752,7 +1752,7 @@ void DrawLineOpa(Painter& w, int x0, int y0, int x1, int y1, int scale,
w.Stroke(thick*scale, color);
}
void DrawCircleOpa(Painter& w, int x, int y, int r, int scale,
void DrawCircleOpa(Painter& w, double x, double y, double r, int scale,
double opacity, double thick, const Color &color, String dash,
const Color &background) {
w.Circle(x, y, r);
@ -1780,13 +1780,15 @@ void FillRectangleOpa(Painter &w, double x0, double y0, double x1, double y1, in
w.Rectangle(x0, y0, x1 - x0, y1 - y0).Opacity(opacity).Fill(color);
}
void DrawPolylineOpa(Draw& w, const Vector<Point> &p, int scale, double opacity,
void DrawPolylineOpa(Draw& w, const Vector<Pointf> &p, int scale, double opacity,
double thick, const Color &_color, String dash, const Color &background) {
ASSERT(!p.IsEmpty());
Color color = GetOpaqueColor(_color, background, opacity) ;
if (dash == LINE_SOLID)
w.DrawPolyline(p, fround(thick*scale), color);
else {
if (dash == LINE_SOLID) {
//w.DrawPolyline(p, fround(thick*scale), color);
for (int i = 1; i < p.GetCount(); ++i)
w.DrawLine(p[i-1], p[i], fround(thick*scale), color);
} else {
Vector <double> &pat = GetDashedArray(dash);
if (pat.IsEmpty())
return;
@ -1817,7 +1819,7 @@ void DrawPolylineOpa(Draw& w, const Vector<Point> &p, int scale, double opacity,
}
}
void DrawPolylineOpa(Painter& w, const Vector<Point> &p, int scale, double opacity,
void DrawPolylineOpa(Painter& w, const Vector<Pointf> &p, int scale, double opacity,
double thick, const Color &color, String dash, const Color &background) {
ASSERT(!p.IsEmpty());
w.Move(p[0]);
@ -1828,15 +1830,21 @@ void DrawPolylineOpa(Painter& w, const Vector<Point> &p, int scale, double opaci
w.Stroke(thick*scale, color);
}
void FillPolylineOpa(Draw& w, const Vector<Point> &p, int scale, double opacity,
void FillPolylineOpa(Draw& w, const Vector<Pointf> &p, int scale, double opacity,
const Color &background, const Color &fillColor) {
ASSERT(!p.IsEmpty());
Color opacolor = GetOpaqueColor(fillColor, background, opacity) ;
w.DrawPolygon(p, opacolor);
Vector<Point> pi;
pi.SetCount(p.GetCount());
for (int i = 0; i < pi.GetCount(); ++i) {
pi[i].x = (int)p[i].x;
pi[i].y = (int)p[i].y;
}
w.DrawPolygon(pi, opacolor);
}
void FillPolylineOpa(Painter& w, const Vector<Point> &p, int scale, double opacity,
void FillPolylineOpa(Painter& w, const Vector<Pointf> &p, int scale, double opacity,
const Color &background, const Color &fillColor) {
ASSERT(!p.IsEmpty());
w.Move(p[0]);

View file

@ -117,6 +117,9 @@ protected:
static String GetNewDash(int index);
static MarkPlot *GetNewMarkPlot(int index);
void WhenPaint(Painter &w) {WhenPainter(w);}
void WhenPaint(Draw &w) {WhenDraw(w);}
public:
Callback3<String&, int, double> cbModifFormatX;
Callback3<String&, int, double> cbModifFormatDeltaX;
@ -128,6 +131,8 @@ public:
Callback WhenZoomScroll;
Callback WhenSetRange;
Callback WhenSetXYMin;
Callback1<Painter&> WhenPainter;
Callback1<Draw&> WhenDraw;
ScatterDraw& SetSize(Size sz) {size = sz; return *this;};
virtual Size GetSize() const {return size;};
@ -491,6 +496,24 @@ public:
ScatterDraw& LinkedWith(ScatterDraw& ctrl);
void Unlinked();
int GetPlotWidth() {return plotW;}
int GetPlotHeight() {return plotH;}
Pointf GetPosPrimary(double x, double y) {
Pointf ret;
ret.x = plotW*(x - xMin)/xRange;
ret.y = plotH - plotH*(y - yMin)/yRange;
return ret;
}
double GetSizeX(double cx) {return plotW*cx/xRange;}
double GetSizeYPrimary(double cy) {return plotH*cy/yRange;}
Pointf GetPosSecondary(double x, double y) {
Pointf ret;
ret.x = plotW*(x - xMin)/xRange;
ret.y = plotH - plotH*(y - yMin2)/yRange2;
return ret;
}
double GetSizeYSecondary(double cy) {return plotH*cy/yRange2;}
protected:
ScatterDraw &_AddSeries(DataSource *data);
virtual void Refresh() {};
@ -826,7 +849,7 @@ void ScatterDraw::Plot(T& w, const Size &size, int scale)
if (series[j].opacity == 0 || (!series[j].seriesPlot && !series[j].markPlot) ||
(!series[j].PointsData()->IsExplicit() && series[j].PointsData()->GetCount() == 0))
continue;
Vector<Point> points;
Vector<Pointf> points;
if (series[j].PointsData()->IsParam()) {
double xmin = 0;
double xmax = double(series[j].PointsData()->GetCount());
@ -992,9 +1015,11 @@ void ScatterDraw::Plot(T& w, const Size &size, int scale)
ASSERT_(true, error);
}
}
WhenPaint(w);
ClipEnd(w);
w.End();
}
#endif

View file

@ -4,10 +4,10 @@
class SeriesPlot {
public:
virtual ~SeriesPlot() {};
virtual void Paint(Draw& w, Vector<Point> &p, const int &scale, const double opacity,
virtual void Paint(Draw& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const {};
virtual void Paint(Painter& w, Vector<Point> &p, const int &scale, const double opacity,
virtual void Paint(Painter& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const {};
template<class T>
@ -42,15 +42,15 @@ protected:
class LineSeriesPlot : public SeriesPlot {
private:
template <class T>
void DoPaint(T& w, Vector<Point> &p, const int &scale, const double opacity,
void DoPaint(T& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, int y0) const
{
if (!IsNull(fillColor)) {
int x = p[0].x;
p.Insert(0, Point(x, y0));
double x = p[0].x;
p.Insert(0, Pointf(x, y0));
x = p[p.GetCount() - 1].x;
p.Add(Point(x, y0));
p.Add(Pointf(x, y0));
FillPolylineOpa(w, p, scale, opacity, background, fillColor);
p.Remove(0);
p.Remove(p.GetCount() - 1);
@ -59,13 +59,13 @@ private:
}
public:
void Paint(Draw& w, Vector<Point> &p, const int &scale, const double opacity,
void Paint(Draw& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const
{
DoPaint(w, p, scale, opacity, fround(thick), color, pattern, background, fillColor, y0);
}
void Paint(Painter& w, Vector<Point> &p, const int &scale, const double opacity,
void Paint(Painter& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const
{
@ -77,12 +77,12 @@ public:
class StaggeredSeriesPlot : public SeriesPlot {
private:
template <class T>
void DoPaint(T& w, Vector<Point> &p, const int &scale, const double opacity,
void DoPaint(T& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, int y0) const
{
ASSERT(p.GetCount() > 1);
Vector<Point> ps;
Vector<Pointf> ps;
ps << Pointf(p[0].x - (p[1].x - p[0].x)/2., p[0].y);
for (int i = 1; i < p.GetCount(); ++i) {
double x = (p[i].x + p[i-1].x)/2.;
@ -91,10 +91,10 @@ private:
}
ps << Pointf(p[p.GetCount() - 1].x + (p[p.GetCount() - 1].x - p[p.GetCount() - 2].x)/2., p[p.GetCount() - 1].y);
if (!IsNull(fillColor)) {
int x = ps[0].x;
ps.Insert(0, Point(x, y0));
double x = ps[0].x;
ps.Insert(0, Pointf(x, y0));
x = ps[ps.GetCount() - 1].x;
ps.Add(Point(x, y0));
ps.Add(Pointf(x, y0));
FillPolylineOpa(w, ps, scale, opacity, background, fillColor);
ps.Remove(0);
ps.Remove(ps.GetCount() - 1);
@ -103,13 +103,13 @@ private:
}
public:
void Paint(Draw& w, Vector<Point> &p, const int &scale, const double opacity,
void Paint(Draw& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const
{
DoPaint(w, p, scale, opacity, thick, color, pattern, background, fillColor, y0);
}
void Paint(Painter& w, Vector<Point> &p, const int &scale, const double opacity,
void Paint(Painter& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const
{
@ -120,13 +120,13 @@ public:
class BarSeriesPlot : public SeriesPlot {
private:
template <class T>
void DoPaint(T& w, Vector<Point> &p, const int &scale, const double opacity,
void DoPaint(T& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, int y0) const
{
for (int i = 0; i < p.GetCount(); ++i) {
FillRectangleOpa(w, p[i].x - width*fx, y0, p[i].x + width*fx, p[i].y, scale, opacity, background, fillColor);
Vector<Point> ps;
Vector<Pointf> ps;
ps << Pointf(fround(p[i].x - width*fx), y0) << Pointf(fround(p[i].x - width*fx), p[i].y)
<< Pointf(fround(p[i].x + width*fx), p[i].y) << Pointf(fround(p[i].x + width*fx), y0);
DrawPolylineOpa(w, ps, scale, 1, fround(thick), color, pattern, background);
@ -137,13 +137,13 @@ private:
public:
BarSeriesPlot(double width) : width(width) {};
BarSeriesPlot() {};
void Paint(Draw& w, Vector<Point> &p, const int &scale, const double opacity,
void Paint(Draw& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const
{
DoPaint(w, p, scale, opacity, thick, color, pattern, background, fillColor, fx, y0);
}
void Paint(Painter& w, Vector<Point> &p, const int &scale, const double opacity,
void Paint(Painter& w, Vector<Pointf> &p, const int &scale, const double opacity,
double thick, const Color &color, String pattern, const Color &background,
const Color &fillColor, double fx, double fy, int y0) const
{