Refractor drawing grid

This commit is contained in:
2025-05-27 16:16:30 +02:00
parent e587d84e05
commit 6069ebbbac
4 changed files with 133 additions and 115 deletions
+112
View File
@@ -415,3 +415,115 @@ SkyPointScale ImageInfoData::getCenterRaDec() const
} }
return ret; return ret;
} }
SkyGrid WCSDataT::prepareGrid(uint32_t w, uint32_t h)
{
SkyGrid skyGrid;
if(!wcs)return skyGrid;
double minRa, maxRa, minDec, maxDec, crVal1, crVal2;
calculateBounds(minRa, maxRa, minDec, maxDec, crVal1, crVal2);
double raStep = 15;
double decStep = 15;
double raRange = maxRa - minRa;
double decRange = maxDec - minDec;
const QVector<double> raSteps = {15, 5, 2.5, 1.25, 0.25, 20/240.0, 10/240.0, 5/240.0, 1/240.0};
const QVector<double> decSteps = {20, 10, 5, 2, 1, 20/60.0, 10/60.0, 5/60.0, 2/60.0, 1/60.0, 20/3600.0, 10/3600.0, 5/3600.0, 2/3600.0, 1/3600.0};
for(double ra : raSteps)
{
if(ra * 5 <= raRange)
{
raStep = ra;
break;
}
}
for(double dec : decSteps)
{
if(dec * 5 <= decRange)
{
decStep = dec;
break;
}
}
minRa -= std::fmod(minRa, raStep);
minDec -= std::fmod(minDec, decStep);
if(minRa < 0)minRa -= raStep;
if(minDec < 0)minDec -= decStep;
QRectF clip(0, 0, w, h);
const double step = 0.2;
maxRa += raStep;
maxDec += decStep;
for(double ra = minRa; ra <= maxRa; ra += raStep)
{
QPointF p;
worldToPixel(SkyPoint(ra, minDec), p);
skyGrid.grid.moveTo(p);
for(double dec = minDec + decStep * step; dec <= maxDec; dec += decStep * step)
{
worldToPixel(SkyPoint(ra, dec), p);
skyGrid.grid.lineTo(p);
}
}
for(double dec = minDec; dec <= maxDec; dec += decStep)
{
QPointF p;
worldToPixel(SkyPoint(minRa, dec), p);
skyGrid.grid.moveTo(p);
for(double ra = minRa + raStep * step; ra <= maxRa; ra += raStep * step)
{
worldToPixel(SkyPoint(ra, dec), p);
skyGrid.grid.lineTo(p);
}
}
SkyPoint sp1, sp2,orig;
pixelToWorld(QPointF(-1, -1), orig);
sp1 = orig;
for(uint32_t x = 0; x < w; x++)
{
QPointF p(x, 0);
if(!pixelToWorld(p, sp2))
break;
if(static_cast<int>(sp1.RA() / raStep) != static_cast<int>(sp2.RA() / raStep))
skyGrid.text.append({p, std::abs(sp1.RA()) > std::abs(sp2.RA()) ? sp1.RAString() : sp2.RAString()});
if(static_cast<int>(sp1.DEC() / decStep) != static_cast<int>(sp2.DEC() / decStep))
skyGrid.text.append({p, std::abs(sp1.DEC()) > std::abs(sp2.DEC()) ? sp1.DECString() : sp2.DECString()});
sp1 = sp2;
}
sp1 = orig;
for(uint32_t y = 0; y < h; y++)
{
QPointF p(0, y);
if(!pixelToWorld(p, sp2))
break;
if(static_cast<int>(sp1.RA() / raStep) != static_cast<int>(sp2.RA() / raStep))
skyGrid.text.append({p, std::abs(sp1.RA()) > std::abs(sp2.RA()) ? sp1.RAString() : sp2.RAString()});
if(static_cast<int>(sp1.DEC() / decStep) != static_cast<int>(sp2.DEC() / decStep))
skyGrid.text.append({p, std::abs(sp1.DEC()) > std::abs(sp2.DEC()) ? sp1.DECString() : sp2.DECString()});
sp1 = sp2;
}
skyGrid.empty = false;
return skyGrid;
}
void SkyGrid::clear()
{
empty = true;
grid.clear();
text.clear();
}
+10
View File
@@ -5,6 +5,7 @@
#include <QPointF> #include <QPointF>
#include <QVector> #include <QVector>
#include <QVariant> #include <QVariant>
#include <QPainterPath>
#include <wcslib/wcs.h> #include <wcslib/wcs.h>
#include <cmath> #include <cmath>
#include <memory> #include <memory>
@@ -53,6 +54,14 @@ struct SkyPointScale
double scaleHigh = 10000.0; double scaleHigh = 10000.0;
}; };
struct SkyGrid
{
bool empty = true;
QPainterPath grid;
QVector<QPair<QPointF, QString>> text;
void clear();
};
class WCSDataT class WCSDataT
{ {
int nwcs = 0; int nwcs = 0;
@@ -70,6 +79,7 @@ public:
void calculateBounds(double &minRa, double &maxRa, double &minDec, double &maxDec, double &crVal1, double &crVal2) const; void calculateBounds(double &minRa, double &maxRa, double &minDec, double &maxDec, double &crVal1, double &crVal2) const;
bool valid() const { return wcs; }; bool valid() const { return wcs; };
SkyPointScale getRaDecScale() const; SkyPointScale getRaDecScale() const;
SkyGrid prepareGrid(uint32_t w, uint32_t h);
}; };
struct ImageInfoData struct ImageInfoData
+10 -113
View File
@@ -26,8 +26,6 @@ struct RawImageType
QOpenGLTexture::PixelType dataType; QOpenGLTexture::PixelType dataType;
}; };
void prepareGrid(WCSDataT *wcs, uint32_t w, uint32_t h, QPainterPath &grid, QPainterPath &text);
RawImageType getRawImageType(const RawImage *img) RawImageType getRawImageType(const RawImage *img)
{ {
RawImageType type; RawImageType type;
@@ -183,9 +181,9 @@ void ImageWidgetGL::setWCS(std::shared_ptr<WCSDataT> wcs)
{ {
m_wcs = wcs; m_wcs = wcs;
m_grid.clear(); m_grid.clear();
m_text.clear();
if(m_drawGrid) if(m_drawGrid)
prepareGrid(m_wcs.get(), m_imgWidth, m_imgHeight, m_grid, m_text); m_grid = m_wcs->prepareGrid(m_imgWidth, m_imgHeight);
} }
void ImageWidgetGL::zoom(int zoom, const QPointF &mousePos) void ImageWidgetGL::zoom(int zoom, const QPointF &mousePos)
@@ -502,111 +500,10 @@ void swPaint(std::shared_ptr<RawImage> &rawImage, float dx, float dy, float scal
painter.drawImage(0, 0, img); painter.drawImage(0, 0, img);
} }
void prepareGrid(WCSDataT *wcs, uint32_t w, uint32_t h, QPainterPath &grid, QPainterPath &text)
{
if(!wcs)return;
double minRa, maxRa, minDec, maxDec, crVal1, crVal2;
wcs->calculateBounds(minRa, maxRa, minDec, maxDec, crVal1, crVal2);
double raStep = 15;
double decStep = 15;
double raRange = maxRa - minRa;
double decRange = maxDec - minDec;
const QVector<double> raSteps = {15, 5, 2.5, 1.25, 0.25, 20/240.0, 10/240.0, 5/240.0, 1/240.0};
const QVector<double> decSteps = {20, 10, 5, 2, 1, 20/60.0, 10/60.0, 5/60.0, 2/60.0, 1/60.0, 20/3600.0, 10/3600.0, 5/3600.0, 2/3600.0, 1/3600.0};
for(double ra : raSteps)
{
if(ra * 5 <= raRange)
{
raStep = ra;
break;
}
}
for(double dec : decSteps)
{
if(dec * 5 <= decRange)
{
decStep = dec;
break;
}
}
minRa -= std::fmod(minRa, raStep);
minDec -= std::fmod(minDec, decStep);
if(minRa < 0)minRa -= raStep;
if(minDec < 0)minDec -= decStep;
QRectF clip(0, 0, w, h);
maxRa += raStep;
maxDec += decStep;
for(double ra = minRa; ra <= maxRa; ra += raStep)
{
QPointF p;
wcs->worldToPixel(SkyPoint(ra, minDec), p);
grid.moveTo(p);
for(double dec = minDec + decStep * 0.02; dec <= maxDec; dec += decStep * 0.02)
{
wcs->worldToPixel(SkyPoint(ra, dec), p);
grid.lineTo(p);
}
}
for(double dec = minDec; dec <= maxDec; dec += decStep)
{
QPointF p;
wcs->worldToPixel(SkyPoint(minRa, dec), p);
grid.moveTo(p);
for(double ra = minRa + raStep * 0.02; ra <= maxRa; ra += raStep * 0.02)
{
wcs->worldToPixel(SkyPoint(ra, dec), p);
grid.lineTo(p);
}
}
SkyPoint sp1, sp2,orig;
wcs->pixelToWorld(QPointF(-1, -1), orig);
sp1 = orig;
QFont font("Sans", 12);
for(uint32_t x = 0; x < w; x++)
{
QPointF p(x, 0);
if(!wcs->pixelToWorld(p, sp2))
break;
if(static_cast<int>(sp1.RA() / raStep) != static_cast<int>(sp2.RA() / raStep))
text.addText(p + QPointF(0, 14), font, std::abs(sp1.RA()) > std::abs(sp2.RA()) ? sp1.RAString() : sp2.RAString());
if(static_cast<int>(sp1.DEC() / decStep) != static_cast<int>(sp2.DEC() / decStep))
text.addText(p + QPointF(0, 14), font, std::abs(sp1.DEC()) > std::abs(sp2.DEC()) ? sp1.DECString() : sp2.DECString());
sp1 = sp2;
}
sp1 = orig;
for(uint32_t y = 0; y < h; y++)
{
QPointF p(0, y);
if(!wcs->pixelToWorld(p, sp2))
break;
if(static_cast<int>(sp1.RA() / raStep) != static_cast<int>(sp2.RA() / raStep))
text.addText(p + QPointF(2, 0), font, std::abs(sp1.RA()) > std::abs(sp2.RA()) ? sp1.RAString() : sp2.RAString());
if(static_cast<int>(sp1.DEC() / decStep) != static_cast<int>(sp2.DEC() / decStep))
text.addText(p + QPointF(2, 0), font, std::abs(sp1.DEC()) > std::abs(sp2.DEC()) ? sp1.DECString() : sp2.DECString());
sp1 = sp2;
}
}
void ImageWidgetGL::drawGrid(bool enable) void ImageWidgetGL::drawGrid(bool enable)
{ {
if(m_grid.elementCount() == 0) if(m_grid.empty)
prepareGrid(m_wcs.get(), m_imgWidth, m_imgHeight, m_grid, m_text); m_grid = m_wcs->prepareGrid(m_imgWidth, m_imgHeight);
if(enable != m_drawGrid) if(enable != m_drawGrid)
{ {
@@ -733,7 +630,7 @@ void ImageWidgetGL::paintGL()
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
m_vao->release(); m_vao->release();
if(m_drawGrid) if(m_drawGrid && !m_grid.empty)
{ {
QPainter painter(this); QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::Antialiasing);
@@ -745,12 +642,12 @@ void ImageWidgetGL::paintGL()
tran.scale(m_scale, m_scale); tran.scale(m_scale, m_scale);
painter.setTransform(tran); painter.setTransform(tran);
painter.setClipRect(0, 0, m_imgWidth, m_imgHeight); painter.setClipRect(0, 0, m_imgWidth, m_imgHeight);
painter.drawPath(m_grid); painter.drawPath(m_grid.grid);
painter.setPen(Qt::NoPen); painter.setPen(Qt::yellow);
painter.setBrush(Qt::yellow); painter.setFont(QFont({"Arial", "Sans"}, 12 / m_scale));
painter.drawPath(m_text); for(auto &text : m_grid.text)
painter.drawText(QRectF(text.first, QSizeF(4000, 4000)), text.second);
} }
} }
} }
+1 -2
View File
@@ -72,8 +72,7 @@ class ImageWidgetGL : public QOpenGLWidget, public ImageWidget
GLuint m_debayerTex = 0; GLuint m_debayerTex = 0;
std::shared_ptr<RawImage> m_rawImage; std::shared_ptr<RawImage> m_rawImage;
std::shared_ptr<WCSDataT> m_wcs; std::shared_ptr<WCSDataT> m_wcs;
QPainterPath m_grid; SkyGrid m_grid;
QPainterPath m_text;
int m_width, m_height; int m_width, m_height;
int m_imgWidth = -1, m_imgHeight = -1; int m_imgWidth = -1, m_imgHeight = -1;
int m_currentImg = 0; int m_currentImg = 0;