24 m_level(level), m_buildLevel(buildLevel), m_numBuffers(numBuffers), htmDebug(0)
27 if (m_buildLevel > 0) {
28 if (m_buildLevel > m_level) m_buildLevel = m_level;
37 for(
int i = m_level; i--;) {
45 magicNum = numTrixels;
46 degree2Rad = 3.1415926535897932385E0 / 180.0;
50 if (m_meshBuffer == NULL) {
51 fprintf(stderr,
"Out of memory allocating %d MeshBuffers.\n", numBuffers);
54 for (
int i = 0; i < numBuffers; i++) {
63 for (
BufNum i=0; i < m_numBuffers; i++)
64 delete m_meshBuffer[i];
75 if ( ! validBufNum(bufNum) )
85 while (iterator.hasNext() ) {
89 if (buffer->
error() ) {
90 fprintf(stderr,
"%s: trixel overflow.\n", name);
101 double d = cos(radius * degree2Rad);
106 if ( ! performIntersection(&convex, bufNum) )
107 printf(
"In intersect(%f, %f, %f)\n", ra, dec, radius);
113 double ra3,
double dec3,
BufNum bufNum)
115 if ( fabs(ra1 - ra3) + fabs( dec1 - dec3) < eps )
116 return intersect( ra1, dec1, ra2, dec2 );
118 else if ( fabs(ra1 - ra2) + fabs(dec1 - dec2) < eps )
119 return intersect( ra1, dec1, ra3, dec3 );
121 else if ( fabs(ra2 - ra3) + fabs(dec2 - dec3) < eps )
122 return intersect( ra1, dec1, ra2, dec2 );
129 if ( ! performIntersection(&convex, bufNum) )
130 printf(
"In intersect(%f, %f, %f, %f, %f, %f)\n",
131 ra1, dec1, ra2, dec2, ra3, dec3);
137 double ra3,
double dec3,
double ra4,
double dec4,
140 if ( fabs(ra1 - ra4) + fabs(dec1 - dec4) < eps )
141 return intersect( ra2, dec2, ra3, dec3, ra4, dec4 );
143 else if ( fabs(ra1 - ra2) + fabs(dec1 - dec2) < eps )
144 return intersect( ra2, dec2, ra3, dec3, ra4, dec4 );
146 else if ( fabs(ra2 - ra3) + fabs(dec2 - dec3) < eps )
147 return intersect( ra1, dec1, ra2, dec2, ra4, dec4 );
149 else if ( fabs(ra3 - ra4) + fabs(dec3 - dec4) < eps )
150 return intersect( ra1, dec1, ra2, dec2, ra4, dec4 );
159 if ( ! performIntersection(&convex, bufNum) )
160 printf(
"In intersect(%f, %f, %f, %f, %f, %f, %f, %f)\n",
161 ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4);
165 void HTMesh::toXYZ(
double ra,
double dec,
double *x,
double *y,
double *z)
170 double sinRa = sin(ra);
171 double cosRa = cos(ra);
172 double sinDec = sin(dec);
173 double cosDec = cos(dec);
188 double x1, y1, z1, x2, y2, z2;
196 toXYZ( ra1, dec1, &x1, &y1, &z1);
197 toXYZ( ra2, dec2, &x2, &y2, &z2);
202 len += fabs(y1 - y2);
203 len += fabs(z1 - z2);
206 printf(
"htmDebug = %d\n", htmDebug);
207 printf(
"p1 = (%f, %f, %f)\n", x1, y1, z1);
208 printf(
"p2 = (%f, %f, %f)\n", x2, y2, z2);
209 printf(
"edge: %f (radians) %f (degrees)\n", edge, edge / degree2Rad);
210 printf(
"len : %f (radians) %f (degrees)\n", len, len / degree2Rad);
217 double cx = y1 * z2 - z1 * y2;
218 double cy = z1 * x2 - x1 * z2;
219 double cz = x1 * y2 - y1 * x2;
221 if ( htmDebug > 0 ) printf(
"cp = (%f, %f, %f)\n", cx, cy, cz);
223 double norm = edge10 / ( fabs(cx) + fabs(cy) + fabs(cz) );
230 if ( htmDebug > 0 ) printf(
"cpn = (%f, %f, %f)\n", cx, cy, cz);
237 if ( htmDebug > 0 ) printf(
"cpf = (%f, %f, %f)\n", cx, cy, cz);
240 norm = sqrt( cx*cx + cy*cy + cz*cz);
241 double ra0 = atan2( cy, cx ) / degree2Rad;
242 double dec0 = asin( cz / norm ) / degree2Rad;
244 if ( htmDebug > 0 ) printf(
"new ra, dec = (%f, %f)\n", ra0, dec0);
251 if ( ! performIntersection(&convex, bufNum) )
252 printf(
"In intersect(%f, %f, %f, %f)\n", ra1, dec1, ra2, dec2);
258 if ( ! validBufNum(bufNum) )
260 return m_meshBuffer[ bufNum ];
266 if ( ! validBufNum(bufNum) )
268 return m_meshBuffer[ bufNum ]->
size();
272 double *ra2,
double *dec2,
273 double *ra3,
double *dec3)
Trixel index(double ra, double dec) const
The Spatial Index is a quad tree of spherical triangles.
int intersectSize(BufNum bufNum=0)
float64 dec()
return dec - this norms the vector to 1 if not already done so
void intersect(const SpatialIndex *index, HtmRange *hr)
Intersect with index.
int append(Trixel trixel)
void add(SpatialConstraint &)
Add a constraint.
float64 ra()
return ra - this norms the vector to 1 if not already done so
The Constraint is really a cone on the sky-sphere.
MeshBuffer * meshBuffer(BufNum bufNum=0)
void intersect(double ra, double dec, double radius, BufNum bufNum=0)
finds the trixels that cover the specified circle
The SpatialVector is a 3D vector usually living on the surface of the sphere.
void vertices(Trixel id, double *ra1, double *dec1, double *ra2, double *dec2, double *ra3, double *dec3)
uint64 idByPoint(const SpatialVector &vector) const
find a node by giving a vector.
void nodeVertex(const uint64 id, SpatialVector &v1, SpatialVector &v2, SpatialVector &v3) const
return the actual vertex vectors
A spatial convex is composed of spatial constraints.
void setOlevel(int level)
HTMesh(int level, int buildLevel, int numBuffers=1)