• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • htmesh
HTMesh.cpp
Go to the documentation of this file.
1 #include <unistd.h>
2 #include <cstdlib>
3 #include <iostream>
4 
5 #include "HTMesh.h"
6 #include "MeshBuffer.h"
7 #include "MeshIterator.h"
8 
9 #include "SpatialVector.h"
10 #include "SpatialIndex.h"
11 #include "RangeConvex.h"
12 #include "HtmRange.h"
13 #include "HtmRangeIterator.h"
14 
15 /******************************************************************************
16  * Note: There is "complete" checking for duplicate points in the line and
17  * polygon intersection routines below. This may have a slight performance
18  * impact on indexing lines and polygons.
19  *
20  * -- James B. Bowlin
21  *****************************************************************************/
22 
23 HTMesh::HTMesh(int level, int buildLevel, int numBuffers) :
24  m_level(level), m_buildLevel(buildLevel), m_numBuffers(numBuffers), htmDebug(0)
25 {
26  name = "HTMesh";
27  if (m_buildLevel > 0) {
28  if (m_buildLevel > m_level) m_buildLevel = m_level;
29  htm = new SpatialIndex(m_level, m_buildLevel);
30  }
31  else {
32  htm = new SpatialIndex(m_level);
33  }
34 
35  edge = 2. / 3.14; // inverse of roughly 1/4 circle
36  numTrixels = 8;
37  for(int i = m_level; i--;) {
38  numTrixels *= 4;
39  edge *= 2.0;
40  }
41  edge = 1.0 / edge; // roughly length of one edge (radians)
42  edge10 = edge / 10.0;
43  eps = 1.0e-6; // arbitrary small number
44 
45  magicNum = numTrixels;
46  degree2Rad = 3.1415926535897932385E0 / 180.0;
47 
48  // Allocate MeshBuffers
49  m_meshBuffer = (MeshBuffer**) malloc( sizeof(MeshBuffer*) * numBuffers);
50  if (m_meshBuffer == NULL) {
51  fprintf(stderr, "Out of memory allocating %d MeshBuffers.\n", numBuffers);
52  exit(0);
53  }
54  for (int i = 0; i < numBuffers; i++) {
55  m_meshBuffer[i] = new MeshBuffer( this );
56  }
57 }
58 
59 
60 HTMesh::~HTMesh()
61 {
62  delete htm;
63  for ( BufNum i=0; i < m_numBuffers; i++)
64  delete m_meshBuffer[i];
65  free(m_meshBuffer);
66 }
67 
68 Trixel HTMesh::index(double ra, double dec) const
69 {
70  return (Trixel) htm->idByPoint( SpatialVector(ra, dec) ) - magicNum;
71 }
72 
73 bool HTMesh::performIntersection(RangeConvex* convex, BufNum bufNum) {
74 
75  if ( ! validBufNum(bufNum) )
76  return false;
77 
78  convex->setOlevel(m_level);
79  HtmRange range;
80  convex->intersect(htm, &range);
81  HtmRangeIterator iterator(&range);
82 
83  MeshBuffer* buffer = m_meshBuffer[bufNum];
84  buffer->reset();
85  while (iterator.hasNext() ) {
86  buffer->append( (Trixel) iterator.next() - magicNum);
87  }
88 
89  if (buffer->error() ) {
90  fprintf(stderr, "%s: trixel overflow.\n", name);
91  return false;
92  };
93 
94  return true;
95 }
96 
97 
98 // CIRCLE
99 void HTMesh::intersect(double ra, double dec, double radius, BufNum bufNum)
100 {
101  double d = cos(radius * degree2Rad);
102  SpatialConstraint c(SpatialVector(ra, dec), d);
103  RangeConvex convex;
104  convex.add(c); // [ed:RangeConvex::add]
105 
106  if ( ! performIntersection(&convex, bufNum) )
107  printf("In intersect(%f, %f, %f)\n", ra, dec, radius);
108 }
109 
110 
111 // TRIANGLE
112 void HTMesh::intersect(double ra1, double dec1, double ra2, double dec2,
113  double ra3, double dec3, BufNum bufNum)
114 {
115  if ( fabs(ra1 - ra3) + fabs( dec1 - dec3) < eps )
116  return intersect( ra1, dec1, ra2, dec2 );
117 
118  else if ( fabs(ra1 - ra2) + fabs(dec1 - dec2) < eps )
119  return intersect( ra1, dec1, ra3, dec3 );
120 
121  else if ( fabs(ra2 - ra3) + fabs(dec2 - dec3) < eps )
122  return intersect( ra1, dec1, ra2, dec2 );
123 
124  SpatialVector p1(ra1, dec1);
125  SpatialVector p2(ra2, dec2);
126  SpatialVector p3(ra3, dec3);
127  RangeConvex convex(&p1, &p2, &p3);
128 
129  if ( ! performIntersection(&convex, bufNum) )
130  printf("In intersect(%f, %f, %f, %f, %f, %f)\n",
131  ra1, dec1, ra2, dec2, ra3, dec3);
132 }
133 
134 
135 // QUADRILATERAL
136 void HTMesh::intersect(double ra1, double dec1, double ra2, double dec2,
137  double ra3, double dec3, double ra4, double dec4,
138  BufNum bufNum)
139 {
140  if ( fabs(ra1 - ra4) + fabs(dec1 - dec4) < eps )
141  return intersect( ra2, dec2, ra3, dec3, ra4, dec4 );
142 
143  else if ( fabs(ra1 - ra2) + fabs(dec1 - dec2) < eps )
144  return intersect( ra2, dec2, ra3, dec3, ra4, dec4 );
145 
146  else if ( fabs(ra2 - ra3) + fabs(dec2 - dec3) < eps )
147  return intersect( ra1, dec1, ra2, dec2, ra4, dec4 );
148 
149  else if ( fabs(ra3 - ra4) + fabs(dec3 - dec4) < eps )
150  return intersect( ra1, dec1, ra2, dec2, ra4, dec4 );
151 
152 
153  SpatialVector p1(ra1, dec1);
154  SpatialVector p2(ra2, dec2);
155  SpatialVector p3(ra3, dec3);
156  SpatialVector p4(ra4, dec4);
157  RangeConvex convex( &p1, &p2, &p3, &p4);
158 
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);
162 }
163 
164 
165 void HTMesh::toXYZ(double ra, double dec, double *x, double *y, double *z)
166 {
167  ra *= degree2Rad;
168  dec *= degree2Rad;
169 
170  double sinRa = sin(ra);
171  double cosRa = cos(ra);
172  double sinDec = sin(dec);
173  double cosDec = cos(dec);
174 
175  *x = cosDec * cosRa;
176  *y = cosDec * sinRa;
177  *z = sinDec;
178 }
179 
180 
181 // Intersect a line segment by forming a very thin triangle to use for the
182 // intersection. Use cross product to ensure we have a perpendicular vector.
183 
184 // LINE
185 void HTMesh::intersect(double ra1, double dec1, double ra2, double dec2,
186  BufNum bufNum)
187 {
188  double x1, y1, z1, x2, y2, z2;
189 
190  //if (ra1 == 0.0 || ra1 == 180.00) ra1 += 0.1;
191  //if (ra2 == 0.0 || ra2 == 180.00) ra2 -= 0.1;
192  //if (dec1 == 0.0 ) dec1 += 0.1;
193  //if (dec2 == 0.0 ) dec2 -= 0.1;
194 
195  // convert to Cartesian. Ugh.
196  toXYZ( ra1, dec1, &x1, &y1, &z1);
197  toXYZ( ra2, dec2, &x2, &y2, &z2);
198 
199  // Check if points are too close
200  double len;
201  len = fabs(x1 - x2);
202  len += fabs(y1 - y2);
203  len += fabs(z1 - z2);
204 
205  if (htmDebug > 0 ) {
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);
211  }
212 
213  if ( len < edge10 )
214  return intersect( ra1, len, bufNum);
215 
216  // Cartesian cross product => perpendicular!. Ugh.
217  double cx = y1 * z2 - z1 * y2;
218  double cy = z1 * x2 - x1 * z2;
219  double cz = x1 * y2 - y1 * x2;
220 
221  if ( htmDebug > 0 ) printf("cp = (%f, %f, %f)\n", cx, cy, cz);
222 
223  double norm = edge10 / ( fabs(cx) + fabs(cy) + fabs(cz) );
224 
225  // give it length edge/10
226  cx *= norm;
227  cy *= norm;
228  cz *= norm;
229 
230  if ( htmDebug > 0 ) printf("cpn = (%f, %f, %f)\n", cx, cy, cz);
231 
232  // add it to (ra1, dec1)
233  cx += x1;
234  cy += y1;
235  cz += z1;
236 
237  if ( htmDebug > 0 ) printf("cpf = (%f, %f, %f)\n", cx, cy, cz);
238 
239  // back to spherical
240  norm = sqrt( cx*cx + cy*cy + cz*cz);
241  double ra0 = atan2( cy, cx ) / degree2Rad;
242  double dec0 = asin( cz / norm ) / degree2Rad;
243 
244  if ( htmDebug > 0 ) printf("new ra, dec = (%f, %f)\n", ra0, dec0);
245 
246  SpatialVector p1(ra1, dec1);
247  SpatialVector p0(ra0, dec0);
248  SpatialVector p2(ra2, dec2);
249  RangeConvex convex(&p1, &p0, &p2);
250 
251  if ( ! performIntersection(&convex, bufNum) )
252  printf("In intersect(%f, %f, %f, %f)\n", ra1, dec1, ra2, dec2);
253 }
254 
255 
256 MeshBuffer* HTMesh::meshBuffer(BufNum bufNum)
257 {
258  if ( ! validBufNum(bufNum) )
259  return 0;
260  return m_meshBuffer[ bufNum ];
261 }
262 
263 
264 int HTMesh::intersectSize(BufNum bufNum)
265 {
266  if ( ! validBufNum(bufNum) )
267  return 0;
268  return m_meshBuffer[ bufNum ]->size();
269 }
270 
271 void HTMesh::vertices(Trixel id, double *ra1, double *dec1,
272  double *ra2, double *dec2,
273  double *ra3, double *dec3)
274 {
275  SpatialVector v1, v2, v3;
276  htm->nodeVertex(id + magicNum, v1, v2, v3);
277  *ra1 = v1.ra();
278  *dec1 = v1.dec();
279  *ra2 = v2.ra();
280  *dec2 = v2.dec();
281  *ra3 = v3.ra();
282  *dec3 = v3.dec();
283 }
HTMesh::~HTMesh
~HTMesh()
Definition: HTMesh.cpp:60
HTMesh::index
Trixel index(double ra, double dec) const
Definition: HTMesh.cpp:68
HTMesh.h
SpatialIndex
The Spatial Index is a quad tree of spherical triangles.
Definition: SpatialIndex.h:59
SpatialVector.h
RangeConvex.h
HTMesh::intersectSize
int intersectSize(BufNum bufNum=0)
Definition: HTMesh.cpp:264
SpatialVector::dec
float64 dec()
return dec - this norms the vector to 1 if not already done so
Definition: SpatialVector.cpp:98
RangeConvex::intersect
void intersect(const SpatialIndex *index, HtmRange *hr)
Intersect with index.
Definition: RangeConvex.cpp:513
MeshBuffer::append
int append(Trixel trixel)
Definition: MeshBuffer.cpp:26
RangeConvex::add
void add(SpatialConstraint &)
Add a constraint.
Definition: RangeConvex.cpp:115
SpatialVector::ra
float64 ra()
return ra - this norms the vector to 1 if not already done so
Definition: SpatialVector.cpp:90
HtmRange.h
MeshBuffer
Definition: MeshBuffer.h:25
SpatialConstraint
The Constraint is really a cone on the sky-sphere.
Definition: SpatialConstraint.h:76
HTMesh::meshBuffer
MeshBuffer * meshBuffer(BufNum bufNum=0)
Definition: HTMesh.cpp:256
HTMesh::intersect
void intersect(double ra, double dec, double radius, BufNum bufNum=0)
finds the trixels that cover the specified circle
Definition: HTMesh.cpp:99
MeshBuffer.h
SpatialVector
The SpatialVector is a 3D vector usually living on the surface of the sphere.
Definition: SpatialVector.h:32
HTMesh::vertices
void vertices(Trixel id, double *ra1, double *dec1, double *ra2, double *dec2, double *ra3, double *dec3)
Definition: HTMesh.cpp:271
MeshBuffer::reset
void reset()
Definition: MeshBuffer.h:34
SpatialIndex.h
HtmRange
Definition: HtmRange.h:14
MeshIterator.h
BufNum
unsigned short BufNum
Definition: htmesh/typedef.h:5
HtmRangeIterator.h
MeshBuffer::size
int size() const
Definition: MeshBuffer.h:46
Trixel
unsigned int Trixel
Definition: htmesh/typedef.h:4
SpatialIndex::idByPoint
uint64 idByPoint(const SpatialVector &vector) const
find a node by giving a vector.
Definition: SpatialIndex.cpp:502
NaN::d
const double d
Definition: nan.h:35
SpatialIndex::nodeVertex
void nodeVertex(const uint64 id, SpatialVector &v1, SpatialVector &v2, SpatialVector &v3) const
return the actual vertex vectors
Definition: SpatialIndex.cpp:122
MeshBuffer::error
int error() const
Definition: MeshBuffer.h:51
RangeConvex
A spatial convex is composed of spatial constraints.
Definition: RangeConvex.h:59
RangeConvex::setOlevel
void setOlevel(int level)
Definition: RangeConvex.h:84
HTMesh::HTMesh
HTMesh(int level, int buildLevel, int numBuffers=1)
Definition: HTMesh.cpp:23
HtmRangeIterator
Definition: HtmRangeIterator.h:6
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal