Graph display bugfixes

This commit is contained in:
Jan Käberich 2020-11-26 17:45:55 +01:00
parent 3a88e10875
commit 1a7212191a
4 changed files with 39 additions and 22 deletions

View File

@ -166,6 +166,11 @@ void Trace::removeMarker(TraceMarker *m)
void Trace::updateTimeDomainData() void Trace::updateTimeDomainData()
{ {
if(_data.size() < 2) {
// can't compute anything
timeDomain.clear();
return;
}
// using namespace std::chrono; // using namespace std::chrono;
// auto starttime = duration_cast< milliseconds >( // auto starttime = duration_cast< milliseconds >(
// system_clock::now().time_since_epoch() // system_clock::now().time_since_epoch()
@ -221,7 +226,7 @@ void Trace::updateTimeDomainData()
t.impedance = numeric_limits<double>::quiet_NaN(); t.impedance = numeric_limits<double>::quiet_NaN();
} }
last_step += t.impulseResponse; last_step += t.impulseResponse;
timeDomain.push_back(t); timeDomain[i] = t;
} }
// auto duration = duration_cast< milliseconds >( // auto duration = duration_cast< milliseconds >(
// system_clock::now().time_since_epoch() // system_clock::now().time_since_epoch()

View File

@ -234,7 +234,7 @@ void TracePlot::dragLeaveEvent(QDragLeaveEvent *event)
Q_UNUSED(event) Q_UNUSED(event)
dropPending = false; dropPending = false;
dropTrace = nullptr; dropTrace = nullptr;
triggerReplot(); replot();
} }
std::set<TracePlot *> TracePlot::getPlots() std::set<TracePlot *> TracePlot::getPlots()

View File

@ -355,8 +355,8 @@ void TraceXYPlot::draw(QPainter &p)
p.setPen(pen); p.setPen(pen);
auto nPoints = numTraceSamples(t); auto nPoints = numTraceSamples(t);
for(unsigned int j=1;j<nPoints;j++) { for(unsigned int j=1;j<nPoints;j++) {
auto last = transformY(t, j-1, YAxis[i].type); auto last = traceToCoordinate(t, j-1, YAxis[i].type);
auto now = transformY(t, j, YAxis[i].type); auto now = traceToCoordinate(t, j, YAxis[i].type);
if(isnan(last.y()) || isnan(now.y()) || isinf(last.y()) || isinf(now.y())) { if(isnan(last.y()) || isnan(now.y()) || isinf(last.y()) || isinf(now.y())) {
continue; continue;
@ -393,7 +393,7 @@ void TraceXYPlot::draw(QPainter &p)
if (xPosition < XAxis.rangeMin || xPosition > XAxis.rangeMax) { if (xPosition < XAxis.rangeMin || xPosition > XAxis.rangeMax) {
continue; continue;
} }
QPointF markerPoint = QPointF(xPosition, transformY(m->getData(), YAxis[i].type)); QPointF markerPoint = QPointF(xPosition, traceToCoordinate(m->getData(), YAxis[i].type));
auto point = plotValueToPixel(markerPoint, i); auto point = plotValueToPixel(markerPoint, i);
if(!plotRect.contains(point)) { if(!plotRect.contains(point)) {
// out of screen // out of screen
@ -451,7 +451,12 @@ void TraceXYPlot::updateAxisTicks()
{ {
auto createEvenlySpacedTicks = [](vector<double>& ticks, double start, double stop, double step) { auto createEvenlySpacedTicks = [](vector<double>& ticks, double start, double stop, double step) {
ticks.clear(); ticks.clear();
for(double tick = start; tick - stop < numeric_limits<double>::epsilon() ;tick+= step) { if(start > stop) {
swap(start, stop);
}
step = abs(step);
constexpr unsigned int maxTicks = 100;
for(double tick = start; tick - stop < numeric_limits<double>::epsilon() && ticks.size() <= maxTicks;tick+= step) {
ticks.push_back(tick); ticks.push_back(tick);
} }
}; };
@ -494,6 +499,10 @@ void TraceXYPlot::updateAxisTicks()
|| tracesAxis[1].find(t.first) != tracesAxis[1].end()); || tracesAxis[1].find(t.first) != tracesAxis[1].end());
auto trace = t.first; auto trace = t.first;
if(enabled && trace->isVisible()) { if(enabled && trace->isVisible()) {
if(!numTraceSamples(trace)) {
// empty trace, do not use for automatic axis calculation
continue;
}
// this trace is currently displayed // this trace is currently displayed
double trace_min = std::numeric_limits<double>::max(); double trace_min = std::numeric_limits<double>::max();
double trace_max = std::numeric_limits<double>::lowest(); double trace_max = std::numeric_limits<double>::lowest();
@ -520,13 +529,12 @@ void TraceXYPlot::updateAxisTicks()
} }
} }
} }
if(min >= max) { if(min < max) {
// still at initial values, no traces are active, leave axis unchanged // found min/max values
return; XAxis.rangeMin = min;
XAxis.rangeMax = max;
XAxis.rangeDiv = createAutomaticTicks(XAxis.ticks, min, max, 8);
} }
XAxis.rangeMin = min;
XAxis.rangeMax = max;
XAxis.rangeDiv = createAutomaticTicks(XAxis.ticks, min, max, 8);
} }
for(int i=0;i<2;i++) { for(int i=0;i<2;i++) {
@ -539,7 +547,12 @@ void TraceXYPlot::updateAxisTicks()
for(auto t : tracesAxis[i]) { for(auto t : tracesAxis[i]) {
unsigned int samples = numTraceSamples(t); unsigned int samples = numTraceSamples(t);
for(unsigned int j=0;j<samples;j++) { for(unsigned int j=0;j<samples;j++) {
auto point = transformY(t, j, YAxis[i].type); auto point = traceToCoordinate(t, j, YAxis[i].type);
if(point.x() < XAxis.rangeMin || point.x() > XAxis.rangeMax) {
// this point is not in the displayed X range, skip for auto Y range calculation
continue;
}
if(point.y() > max) { if(point.y() > max) {
max = point.y(); max = point.y();
@ -557,7 +570,6 @@ void TraceXYPlot::updateAxisTicks()
YAxis[i].rangeDiv = createAutomaticTicks(YAxis[i].ticks, min, max, 8); YAxis[i].rangeDiv = createAutomaticTicks(YAxis[i].ticks, min, max, 8);
} }
} }
triggerReplot();
} }
QString TraceXYPlot::AxisTypeToName(TraceXYPlot::YAxisType type) QString TraceXYPlot::AxisTypeToName(TraceXYPlot::YAxisType type)
@ -620,7 +632,7 @@ bool TraceXYPlot::supported(Trace *t, TraceXYPlot::YAxisType type)
return true; return true;
} }
double TraceXYPlot::transformY(std::complex<double> data, TraceXYPlot::YAxisType type) double TraceXYPlot::traceToCoordinate(std::complex<double> data, TraceXYPlot::YAxisType type)
{ {
switch(type) { switch(type) {
case YAxisType::Magnitude: case YAxisType::Magnitude:
@ -646,7 +658,7 @@ double TraceXYPlot::transformY(std::complex<double> data, TraceXYPlot::YAxisType
return numeric_limits<double>::quiet_NaN(); return numeric_limits<double>::quiet_NaN();
} }
QPointF TraceXYPlot::transformY(Trace *t, unsigned int sample, TraceXYPlot::YAxisType type) QPointF TraceXYPlot::traceToCoordinate(Trace *t, unsigned int sample, TraceXYPlot::YAxisType type)
{ {
QPointF ret = QPointF(numeric_limits<double>::quiet_NaN(), numeric_limits<double>::quiet_NaN()); QPointF ret = QPointF(numeric_limits<double>::quiet_NaN(), numeric_limits<double>::quiet_NaN());
switch(type) { switch(type) {
@ -654,7 +666,7 @@ QPointF TraceXYPlot::transformY(Trace *t, unsigned int sample, TraceXYPlot::YAxi
case YAxisType::Phase: case YAxisType::Phase:
case YAxisType::VSWR: { case YAxisType::VSWR: {
auto d = t->sample(sample); auto d = t->sample(sample);
ret.setY(transformY(d.S, type)); ret.setY(traceToCoordinate(d.S, type));
ret.setX(d.frequency); ret.setX(d.frequency);
} }
break; break;
@ -705,7 +717,7 @@ QPoint TraceXYPlot::dataToPixel(Trace::Data d)
if(d.frequency < XAxis.rangeMin || d.frequency > XAxis.rangeMax) { if(d.frequency < XAxis.rangeMin || d.frequency > XAxis.rangeMax) {
return QPoint(); return QPoint();
} }
auto y = transformY(d.S, YAxis[0].type); auto y = traceToCoordinate(d.S, YAxis[0].type);
QPoint p; QPoint p;
p.setX(Util::Scale<double>(d.frequency, XAxis.rangeMin, XAxis.rangeMax, plotAreaLeft, plotAreaLeft + plotAreaWidth)); p.setX(Util::Scale<double>(d.frequency, XAxis.rangeMin, XAxis.rangeMax, plotAreaLeft, plotAreaLeft + plotAreaWidth));
p.setY(Util::Scale<double>(y, YAxis[0].rangeMin, YAxis[0].rangeMax, plotAreaBottom, 0)); p.setY(Util::Scale<double>(y, YAxis[0].rangeMin, YAxis[0].rangeMax, plotAreaBottom, 0));
@ -736,7 +748,7 @@ QPoint TraceXYPlot::markerToPixel(TraceMarker *m)
return ret; return ret;
} }
QPointF plotPoint; QPointF plotPoint;
plotPoint.setY(transformY(m->getData(), YAxis[0].type)); plotPoint.setY(traceToCoordinate(m->getData(), YAxis[0].type));
if(m->isTimeDomain()) { if(m->isTimeDomain()) {
auto timedata = m->getTimeData(); auto timedata = m->getTimeData();
if(XAxis.type == XAxisType::Distance) { if(XAxis.type == XAxisType::Distance) {
@ -760,7 +772,7 @@ double TraceXYPlot::nearestTracePoint(Trace *t, QPoint pixel)
double closestXpos = 0; double closestXpos = 0;
auto samples = numTraceSamples(t); auto samples = numTraceSamples(t);
for(unsigned int i=0;i<samples;i++) { for(unsigned int i=0;i<samples;i++) {
auto point = transformY(t, i, YAxis[0].type); auto point = traceToCoordinate(t, i, YAxis[0].type);
if(isnan(point.x()) || isnan(point.y())) { if(isnan(point.x()) || isnan(point.y())) {
continue; continue;
} }

View File

@ -58,8 +58,8 @@ private:
QString AxisTypeToName(YAxisType type); QString AxisTypeToName(YAxisType type);
void enableTraceAxis(Trace *t, int axis, bool enabled); void enableTraceAxis(Trace *t, int axis, bool enabled);
bool supported(Trace *t, YAxisType type); bool supported(Trace *t, YAxisType type);
double transformY(std::complex<double> data, YAxisType type); double traceToCoordinate(std::complex<double> data, YAxisType type);
QPointF transformY(Trace *t, unsigned int sample, YAxisType type); QPointF traceToCoordinate(Trace *t, unsigned int sample, YAxisType type);
unsigned int numTraceSamples(Trace *t); unsigned int numTraceSamples(Trace *t);
QPoint dataToPixel(Trace::Data d); QPoint dataToPixel(Trace::Data d);
QPoint plotValueToPixel(QPointF plotValue, int Yaxis); QPoint plotValueToPixel(QPointF plotValue, int Yaxis);