Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Explicit range #1

Merged
merged 4 commits into from
Feb 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
73 changes: 44 additions & 29 deletions ScatterDraw/DataSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class DataSource : public Pte<DataSource> {
public:
typedef double (DataSource::*Getdatafun)(int64 id);

DataSource() : isParam(false), isExplicit(false) {}
DataSource() : isParam(false), isExplicit(false), isAppend(false), isReverse(false) {}
virtual ~DataSource() noexcept {magic = 4321234;}
virtual double y(int64 ) = 0;
virtual double x(int64 ) = 0;
Expand All @@ -39,6 +39,8 @@ class DataSource : public Pte<DataSource> {
virtual int GetznFixedCount() const {return 0;}
bool IsParam() const {return isParam;}
bool IsExplicit() const {return isExplicit;}
bool IsAppend() const {return isAppend;}
bool IsReverse() const {return isReverse;}

void SetDestructor(Function <void(void)> _OnDestructor) {OnDestructor = _OnDestructor;}

Expand Down Expand Up @@ -240,7 +242,7 @@ class DataSource : public Pte<DataSource> {
bool IsMagic() {return magic == 1234321;} // Temporal use, just for testing

protected:
bool isParam, isExplicit;
bool isParam, isExplicit, isAppend, isReverse;

private:
Function <void(void)> OnDestructor;
Expand All @@ -261,6 +263,8 @@ class DataXRange : public DataSource {
data = &_data;
isExplicit = _data.IsExplicit();
isParam = _data.IsParam();
isAppend = _data.IsAppend();
isReverse = _data.IsReverse();
xLow = _xLow;
xHigh = _xHigh;
count = 1000;
Expand Down Expand Up @@ -328,6 +332,8 @@ class DataTranslateScale : public DataSource {
data = &_data;
isExplicit = _data.IsExplicit();
isParam = _data.IsParam();
isAppend = _data.IsAppend();
isReverse = _data.IsReverse();
shiftX = _shiftX;
shiftY = _shiftY;
multX = _multX;
Expand Down Expand Up @@ -358,75 +364,84 @@ class DataTranslateScale : public DataSource {
}
};

class DataReverse : public DataSource {
private:
class DataWrapper : public DataSource {
protected:
DataSource *data;

public:
DataReverse() : data(0) {}
DataReverse(DataSource &_data) {Init(_data);}
DataWrapper() : data(0) {}
DataWrapper(DataSource &_data) {Init(_data);}
void Init(DataSource *_data) {Init(*_data);}
void Init(DataSource &_data) {
ASSERT(!_data.IsExplicit() && !_data.IsParam());
data = &_data;
isExplicit = data->IsExplicit();
}
DataSource& Data() {return *data;}
};

class DataReverse : public DataWrapper {
public:
DataReverse() {}
DataReverse(DataSource &_data) {Init(_data);}
void Init(DataSource *_data) {Init(*_data);}
void Init(DataSource &_data) {
DataWrapper::Init(_data);
isReverse = true;
}
virtual inline double y(int64 id) {return data->y(GetCount() - id - 1);}
virtual inline double x(int64 id) {return data->x(GetCount() - id - 1);}
virtual int64 GetCount() const {return data->GetCount();}
};

class DataReverseX : public DataSource {
private:
DataSource *data;

class DataReverseX : public DataWrapper {
public:
DataReverseX() : data(0) {}
DataReverseX() {}
DataReverseX(DataSource &_data) {Init(_data);}
void Init(DataSource &_data) {
ASSERT(!_data.IsExplicit() && !_data.IsParam());
data = &_data;
DataWrapper::Init(_data);
}
virtual inline double y(int64 id) {return data->y(id);}
virtual inline double x(int64 id) {return data->x(GetCount() - id - 1);}
virtual int64 GetCount() const {return data->GetCount();}
};

class DataAppend : public DataSource {
protected:
DataSource *data1, *data2;
private:
DataSource *data[2] = {0, 0};

public:
DataAppend() : data1(0), data2(0) {}
DataAppend() {}
DataAppend(DataSource &_data1, DataSource &_data2) {Init(_data1, _data2);}
void Init(DataSource &_data1, DataSource &_data2) {
ASSERT(!_data1.IsExplicit() && !_data1.IsParam() && !_data2.IsExplicit() && !_data2.IsParam());
data1 = &_data1;
data2 = &_data2;
data[0] = &_data1;
data[1] = &_data2;
isExplicit = data[0]->IsExplicit() && data[1]->IsExplicit();
isAppend = true;
}
virtual inline double y(int64 id) {
int64 count1 = data1->GetCount();
int64 count1 = data[0]->GetCount();
if (id < count1)
return data1->y(id);
return data2->y(id - count1);
return data[0]->y(id);
return data[1]->y(id - count1);
}
virtual inline double x(int64 id) {
int64 count1 = data1->GetCount();
int64 count1 = data[0]->GetCount();
if (id < count1)
return data1->x(id);
return data2->x(id - count1);
return data[0]->x(id);
return data[1]->x(id - count1);
}
virtual int64 GetCount() const {return data1->GetCount() + data2->GetCount();}
virtual int64 GetCount() const {return data[0]->GetCount() + data[1]->GetCount();}
DataSource& DataAt(int i) {return *data[i];}
};

class DataRange : public DataAppend {
public:
DataRange() : DataAppend() {}
DataRange(DataSource &_data1, DataSource &_data2) {Init(_data1, _data2);}
void Init(DataSource &_data1, DataSource &_data2) {
ASSERT(!_data1.IsExplicit() && !_data1.IsParam() && !_data2.IsExplicit() && !_data2.IsParam());
data1 = &_data1;
rev.Init(_data2);
data2 = &rev;
DataAppend::Init(_data1, rev);
}
private:
DataReverse rev;
Expand Down
101 changes: 101 additions & 0 deletions ScatterDraw/ScatterDraw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1646,6 +1646,107 @@ bool ScatterDraw::CheckDash(const char *dash) {
return true;
}

Vector<Pointf> ScatterDraw::DataAddPoints(DataSource& data, bool primaryY, bool sequential)
{
Vector<Pointf> points;
auto ScaleX = [w=plotW, x0=xMin, r=xRange](double x) { return fround(w*(x - x0)/r); };
auto ScaleY =
[h=plotH, y0=primaryY ? yMin : yMin2, r=primaryY ? yRange : yRange2]
(double y) { return h - fround(h*(y - y0)/r); };
if (data.IsReverse()) {
points = DataAddPoints(dynamic_cast<DataWrapper&>(data).Data(), primaryY, sequential);
Reverse(points);
} else if (data.IsAppend()) {
for (int i = 0; i < 2; i++)
points.Append(DataAddPoints(dynamic_cast<DataAppend&>(data).DataAt(i), primaryY, sequential));
} else if (data.IsParam()) {
double xmin = 0;
double xmax = double(data.GetCount());
for (double x = xmin; x <= xmax; x++) {
double xx = data.x(x);
double yy = data.y(x);
if (IsNum(xx) && IsNum(yy))
points << Point(ScaleX(xx), ScaleY(yy));
}
} else if (data.IsExplicit()) {
double xmin = xMin - 1;
double xmax = xMin + xRange + 1;
double dx = (xmax - xmin)/plotW;
for (double xx = xmin; xx < xmax; xx += dx) {
double yy = data.f(xx);
if (IsNum(yy))
points << Point(ScaleX(xx), ScaleY(yy));
}
} else {
int64 imin, imax;
if (sequential) {
imin = imax = Null;
for (int64 i = 0; i < data.GetCount(); ++i) {
double xx = data.x(i);
if (IsNum(xx)) {
if (IsNull(imin)) {
if (xx >= xMin)
imin = i;
}
if (IsNull(imax)) {
if (xx >= xMin + xRange)
imax = i;
}
}
}
if (IsNull(imin))
imin = 0;
if (IsNull(imax))
imax = data.GetCount() - 1;
} else {
imin = 0;
imax = data.GetCount() - 1;
}
if (fastViewX) {
double dxpix = (data.x(imax) - data.x(imin))/plotW;
int npix = 1;
for (int64 i = imin; i <= imax; ) {
double yy = data.y(i);
int64 ii;
double maxv = data.x(imin) + dxpix*npix;
double maxY = yy, minY = yy;
for (ii = 1; i + ii < imax && data.x(i + ii) < maxv; ++ii) {
double dd = data.y(i + ii);
if (!IsNum(dd))
continue;
maxY = max(maxY, dd);
minY = min(minY, dd);
}
double xx = data.x(i);
if (!IsNum(xx)) {
++i;
continue;
}
i += ii;
npix++;
int ix = ScaleX(xx);
int iMax, iMin;
if (IsNum(yy)) {
iMax = ScaleY(maxY);
iMin = ScaleY(minY);
points << Point(ix, iMax);
if (iMax != iMin)
points << Point(ix, iMin);
}
}
} else {
for (int64 i = imin; i <= imax; ) {
double xx = data.x(i);
double yy = data.y(i);
++i;
if (IsNum(xx) && IsNum(yy))
points << Point(ScaleX(xx), ScaleY(yy));
}
}
}
return points;
}

INITBLOCK {
SeriesPlot::Register<LineSeriesPlot>("Line");
SeriesPlot::Register<StaggeredSeriesPlot>("Staggered");
Expand Down