9#include "hipsrenderer.h"
11#include "colorscheme.h"
12#include "kstars_debug.h"
15#include "skyqpainter.h"
16#include "projections/projector.h"
18HIPSRenderer::HIPSRenderer()
20 m_scanRender.reset(
new ScanRender());
21 m_HEALpix.reset(
new HEALPix());
24bool HIPSRenderer::render(uint16_t w, uint16_t h,
QImage *hipsImage,
const Projector *m_proj)
34 double fov = m_proj->
fov() * w / h;
37 while( level < HIPSManager::Instance()->getCurrentOrder() && fov < minfov)
44 level = HIPSManager::Instance()->getUsableLevel(level);
46 m_renderedMap.clear();
51 SkyPoint
center = SkyMap::Instance()->getCenterPoint();
53 center.catalogueCoord(KStarsData::Instance()->updateNum()->julianDay());
55 double ra =
center.ra0().radians();
56 double de =
center.dec0().radians();
58 if (std::isnan(ra) || std::isnan(de))
60 qCWarning(KSTARS) <<
"NAN Center, HiPS draw canceled.";
76 int centerPix = m_HEALpix->getPix(level, ra, de);
78 SkyPoint cornerSkyCoords[4];
80 m_HEALpix->getCornerPoints(level, centerPix, cornerSkyCoords);
88 for (
int i = 0; i < 2; i++)
89 tileLine[i] = m_projector->toScreen(&cornerSkyCoords[i]);
91 int size = std::sqrt(std::pow(tileLine[0].x() - tileLine[1].x(), 2) + std::pow(tileLine[0].y() - tileLine[1].y(), 2));
93 size = HIPSManager::Instance()->getCurrentTileWidth();
95 bool old = m_scanRender->isBilinearInterpolationEnabled();
96 m_scanRender->setBilinearInterpolationEnabled(Options::hIPSBiLinearInterpolation()
97 && (size >= HIPSManager::Instance()->getCurrentTileWidth() || allSky));
99 renderRec(allSky, level, centerPix, hipsImage);
101 m_scanRender->setBilinearInterpolationEnabled(old);
106void HIPSRenderer::renderRec(
bool allsky,
int level,
int pix,
QImage *pDest)
108 if (m_renderedMap.contains(pix))
113 if (renderPix(allsky, level, pix, pDest))
115 m_renderedMap.insert(pix);
117 int nside = 1 <<
level;
119 m_HEALpix->neighbours(nside, pix, dirs);
121 renderRec(allsky, level, dirs[0], pDest);
122 renderRec(allsky, level, dirs[2], pDest);
123 renderRec(allsky, level, dirs[4], pDest);
124 renderRec(allsky, level, dirs[6], pDest);
128bool HIPSRenderer::renderPix(
bool allsky,
int level,
int pix,
QImage *pDest)
130 SkyPoint cornerSkyCoords[4];
131 QPointF cornerScreenCoords[4];
132 bool freeImage =
false;
134 m_HEALpix->getCornerPoints(level, pix, cornerSkyCoords);
135 bool isVisible =
false;
137 for (
int i = 0; i < 4; i++)
139 cornerScreenCoords[i] = m_projector->toScreen(&cornerSkyCoords[i]);
140 isVisible |= m_projector->checkVisibility(&cornerSkyCoords[i]);
155 QImage *image = HIPSManager::Instance()->getPix(allsky, level, pix, freeImage);
172 QPointF uv[16][4] = {{QPointF(.25, .25), QPointF(0.25, 0), QPointF(0, .0), QPointF(0, .25)},
173 {QPointF(.25, .5), QPointF(0.25, 0.25), QPointF(0, .25), QPointF(0, .5)},
174 {QPointF(.5, .25), QPointF(0.5, 0), QPointF(.25, .0), QPointF(.25, .25)},
175 {QPointF(.5, .5), QPointF(0.5, 0.25), QPointF(.25, .25), QPointF(.25, .5)},
177 {QPointF(.25, .75), QPointF(0.25, 0.5), QPointF(0, 0.5), QPointF(0, .75)},
178 {QPointF(.25, 1), QPointF(0.25, 0.75), QPointF(0, .75), QPointF(0, 1)},
179 {QPointF(.5, .75), QPointF(0.5, 0.5), QPointF(.25, .5), QPointF(.25, .75)},
180 {QPointF(.5, 1), QPointF(0.5, 0.75), QPointF(.25, .75), QPointF(.25, 1)},
182 {QPointF(.75, .25), QPointF(0.75, 0), QPointF(0.5, .0), QPointF(0.5, .25)},
183 {QPointF(.75, .5), QPointF(0.75, 0.25), QPointF(0.5, .25), QPointF(0.5, .5)},
184 {QPointF(1, .25), QPointF(1, 0), QPointF(.75, .0), QPointF(.75, .25)},
185 {QPointF(1, .5), QPointF(1, 0.25), QPointF(.75, .25), QPointF(.75, .5)},
187 {QPointF(.75, .75), QPointF(0.75, 0.5), QPointF(0.5, .5), QPointF(0.5, .75)},
188 {QPointF(.75, 1), QPointF(0.75, 0.75), QPointF(0.5, .75), QPointF(0.5, 1)},
189 {QPointF(1, .75), QPointF(1, 0.5), QPointF(.75, .5), QPointF(.75, .75)},
190 {QPointF(1, 1), QPointF(1, 0.75), QPointF(.75, .75), QPointF(.75, 1)},
196 m_HEALpix->getPixChilds(pix, childPixelID);
199 for (
int id : childPixelID)
201 int grandChildPixelID[4];
207 m_HEALpix->getPixChilds(
id, grandChildPixelID);
209 QPointF fineScreenCoords[4];
211 for (
int id2 : grandChildPixelID)
213 SkyPoint fineSkyPoints[4];
214 m_HEALpix->getCornerPoints(level + 2, id2, fineSkyPoints);
216 for (
int i = 0; i < 4; i++)
217 fineScreenCoords[i] = m_projector->toScreen(&fineSkyPoints[i]);
218 m_scanRender->renderPolygon(3, fineScreenCoords, pDest, image, uv[j]);
229 if (Options::hIPSShowGrid())
235 p.drawLine(cornerScreenCoords[0].x(), cornerScreenCoords[0].y(), cornerScreenCoords[1].x(), cornerScreenCoords[1].y());
236 p.drawLine(cornerScreenCoords[1].x(), cornerScreenCoords[1].y(), cornerScreenCoords[2].x(), cornerScreenCoords[2].y());
237 p.drawLine(cornerScreenCoords[2].x(), cornerScreenCoords[2].y(), cornerScreenCoords[3].x(), cornerScreenCoords[3].y());
238 p.drawLine(cornerScreenCoords[3].x(), cornerScreenCoords[3].y(), cornerScreenCoords[0].x(), cornerScreenCoords[0].y());
239 p.drawText((cornerScreenCoords[0].x() + cornerScreenCoords[1].x() + cornerScreenCoords[2].x() + cornerScreenCoords[3].x()) /
241 (cornerScreenCoords[0].y() + cornerScreenCoords[1].y() + cornerScreenCoords[2].y() + cornerScreenCoords[3].y()) / 4,
QColor colorNamed(const QString &name) const
Retrieve a color by name.
ColorScheme * colorScheme()
The Projector class is the primary class that serves as an interface to handle projections.
double fov() const
Return the FOV of this projection.
QStringView level(QStringView ifopt)
QString name(NameFormat format) const const
qsizetype sizeInBytes() const const
QString number(double n, char format, int precision)
QTextStream & center(QTextStream &stream)