Add WCSData::calculateBounds

This commit is contained in:
2022-06-13 23:28:39 +02:00
parent 42dd55244a
commit 04e587b51c
4 changed files with 74 additions and 18 deletions
+66 -12
View File
@@ -79,9 +79,10 @@ WCSData::~WCSData()
freeWCS(); freeWCS();
} }
SkyPoint WCSData::pixelToWorld(QPointF pixel) const bool WCSData::pixelToWorld(const QPointF &pixel, SkyPoint &point) const
{ {
if(wcs == nullptr)return SkyPoint(); if(!valid())return false;
double pixcrd[2] = {pixel.x(), pixel.y()}; double pixcrd[2] = {pixel.x(), pixel.y()};
double imgcrd[8] = {0}; double imgcrd[8] = {0};
double phi = 0; double phi = 0;
@@ -91,27 +92,80 @@ SkyPoint WCSData::pixelToWorld(QPointF pixel) const
int status = wcsp2s(wcs, 1, 2, pixcrd, imgcrd, &phi, &theta, world, stat); int status = wcsp2s(wcs, 1, 2, pixcrd, imgcrd, &phi, &theta, world, stat);
if(status == 0) if(status == 0)
{ {
return SkyPoint(world[0], world[1]); point = SkyPoint(world[0], world[1]);
return true;
} }
return SkyPoint(); return false;
} }
QPointF WCSData::worldToPixel(SkyPoint point) const bool WCSData::worldToPixel(const SkyPoint &point, QPointF &pixel) const
{ {
return QPointF(); if(!valid())return false;
double world[2] = {point.RA(), point.DEC()};
double phi = 0;
double theta = 0;
double imgcrd[8] = {0};
double pixcrd[8] = {0};
int stat[NWCSFIX] = {0};
int status = wcss2p(wcs, 1, 2, world, &phi, &theta, imgcrd, pixcrd, stat);
if(status == 0)
{
pixel = QPointF(pixcrd[0], pixcrd[1]);
return true;
}
return false;
} }
void WCSData::calculateBounds(double &minRa, double &maxRa, double &minDec, double &maxDec) void WCSData::calculateBounds(int w, int h, double &minRa, double &maxRa, double &minDec, double &maxDec)
{ {
minRa = -1000; if(wcs == nullptr)return;
maxRa = 1000;
minDec = -1000; minRa = 1000;
maxDec = 1000; maxRa = -1000;
minDec = 1000;
maxDec = -1000;
auto update = [&](const QPointF &pixel)
{
SkyPoint point;
pixelToWorld(pixel, point);
minRa = std::min(minRa, point.RA());
maxRa = std::max(maxRa, point.RA());
minDec = std::min(minDec, point.DEC());
maxDec = std::max(maxDec, point.DEC());
};
for(int x=0; x<w; x++)
{
update(QPointF(x, 0));
update(QPointF(x, h - 1));
}
for(int y=0; y<h; y++)
{
update(QPointF(0, y));
update(QPointF(w - 1, y));
}
QPointF ncp;
QPointF scp;
QRectF s(0, 0, w - 1, h - 1);
if(worldToPixel(SkyPoint(0, 90), ncp))
{
if(s.contains(ncp))
maxDec = 90;
}
if(worldToPixel(SkyPoint(0, -90), scp))
{
if(s.contains(scp))
minDec = -90;
}
} }
SkyPoint::SkyPoint() : ra(NAN), dec(NAN) SkyPoint::SkyPoint() : ra(NAN), dec(NAN)
{ {
} }
SkyPoint::SkyPoint(double ra, double dec) : ra(ra), dec(dec) SkyPoint::SkyPoint(double ra, double dec) : ra(ra), dec(dec)
+4 -3
View File
@@ -35,9 +35,10 @@ public:
WCSData(); WCSData();
WCSData(char *header, int nrec); WCSData(char *header, int nrec);
~WCSData(); ~WCSData();
SkyPoint pixelToWorld(QPointF pixel) const; bool pixelToWorld(const QPointF &pixel, SkyPoint &point) const;
QPointF worldToPixel(SkyPoint point) const; bool worldToPixel(const SkyPoint &point, QPointF &pixel) const;
void calculateBounds(double &minRa, double &maxRa, double &minDec, double &maxDec); void calculateBounds(int w, int h, double &minRa, double &maxRa, double &minDec, double &maxDec);
bool valid() const { return wcs; };
}; };
struct ImageInfoData struct ImageInfoData
+3 -3
View File
@@ -428,7 +428,7 @@ void ImageWidget::dropEvent(QDropEvent *event)
void ImageWidget::mousePressEvent(QMouseEvent *event) void ImageWidget::mousePressEvent(QMouseEvent *event)
{ {
if(m_thumbnailCount && event->button() == Qt::LeftButton && event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) if(m_showThumbnails && event->button() == Qt::LeftButton && event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier))
m_selecting = true; m_selecting = true;
if(m_selecting) if(m_selecting)
@@ -448,7 +448,7 @@ void ImageWidget::mouseMoveEvent(QMouseEvent *event)
else else
event->ignore(); event->ignore();
if(m_rawImage) if(!m_showThumbnails && m_rawImage)
{ {
float dx = m_dx; float dx = m_dx;
float dy = m_dy; float dy = m_dy;
@@ -465,7 +465,7 @@ void ImageWidget::mouseMoveEvent(QMouseEvent *event)
SkyPoint sky; SkyPoint sky;
if(m_wcs) if(m_wcs)
{ {
sky = m_wcs->pixelToWorld(QPointF(pix.x(), pix.y())); m_wcs->pixelToWorld(QPointF(pix.x(), pix.y()), sky);
} }
if(m_rawImage->pixel(pix.x(), pix.y(), rgb)) if(m_rawImage->pixel(pix.x(), pix.y(), rgb))
+1
View File
@@ -174,6 +174,7 @@ int loadFITSHeader(fitsfile *file, ImageInfoData &info)
if(status == 0) if(status == 0)
{ {
info.wcs = std::make_shared<WCSData>(header, nrec); info.wcs = std::make_shared<WCSData>(header, nrec);
if(!info.wcs->valid())info.wcs.reset();
} }
fits_free_memory(header, &status); fits_free_memory(header, &status);
return status; return status;