Warning, /education/kstars/kstars/data/tools/HTMesh-0.01/HTMesh.xs is written in an unsupported language. File is not indexed.

0001 #ifdef __cplusplus
0002 extern "C" {
0003 #endif
0004 #include "EXTERN.h"
0005 #include "perl.h"
0006 #include "XSUB.h"
0007 #ifdef __cplusplus
0008 }
0009 #endif
0010 
0011 #include "ppport.h"
0012 
0013 #include <iostream>
0014 
0015 #include "SpatialVector.h"
0016 #include "SpatialIndex.h"
0017 #include "RangeConvex.h"
0018 #include "HtmRange.h"
0019 #include "HtmRangeIterator.h"
0020 
0021 
0022 class HTMesh {
0023 int level, build_level;
0024 SpatialIndex *htm;
0025 char name_buffer[128];
0026 HtmRange* range;
0027 HtmRangeIterator* iterator;
0028 long numTriangles;
0029 
0030 public:
0031         HTMesh(int level_in, int build_level_in) {
0032             level = level_in;
0033             build_level = build_level_in;
0034             if (build_level > 0) {
0035                 if (build_level > level) {
0036                     build_level = level;
0037                 }
0038                 htm = new SpatialIndex(level, build_level);
0039             }
0040             else {
0041                 htm = new SpatialIndex(level);
0042             }
0043             
0044             numTriangles = 8;
0045             for (int i = level; i--;) {
0046                 numTriangles *= 4;
0047             }
0048         }
0049        
0050         ~HTMesh() {
0051             delete htm;
0052         }
0053 
0054         /* long lookupId(double ra, double dec) { */
0055         /*      return htm->idByPoint(ra * 15.0, dec); */
0056         /* } */
0057 
0058         const char* idToName(long id) {
0059             htm->nameById(id, name_buffer);
0060             return name_buffer;
0061         }
0062 
0063         /* const char* lookupName(double ra, double dec) { */
0064         /*     long id = lookupId(ra, dec); */
0065         /*     return idToName(id); */
0066         /* } */
0067 
0068         void intersectCircle(double ra, double dec, double rad) {
0069             ra = ra * 15.0;
0070             RangeConvex convex;
0071             double d = cos( 3.1415926535897932385E0 * rad/180.0);
0072             SpatialConstraint c(SpatialVector(ra, dec), d);
0073             convex.add(c); // [ed:RangeConvex::add]
0074             convex.setOlevel(level);
0075             range = new HtmRange();
0076             convex.intersect(htm, range); // commit fec61ac2c400e7138425961e779fed3bbf5687a5 removed unmanipulated bool parameter from RangeConvex::intersect -- asimha
0077             iterator = new HtmRangeIterator(range);
0078         }
0079 
0080         void intersectRectangle(double ra, double dec, double dra, double ddec) {
0081             dra = dra / 15.0;
0082             double ra1 = ra - dra;
0083             double ra2 = ra + dra;
0084             double dec1 = dec - ddec;
0085             double dec2 = dec + ddec;
0086             intersectPolygon4(ra1, dec1, ra1, dec2, ra2, dec2, ra2, dec1);
0087         }
0088         
0089         void intersectPolygon4(double ra1, double dec1, double ra2, double dec2,
0090                                double ra3, double dec3, double ra4, double dec4) {
0091             SpatialVector* corner[4];
0092             corner[0] = new SpatialVector(ra1 * 15.0, dec1);
0093             corner[1] = new SpatialVector(ra2 * 15.0, dec2);
0094             corner[2] = new SpatialVector(ra3 * 15.0, dec3);
0095             corner[3] = new SpatialVector(ra4 * 15.0, dec4);
0096             RangeConvex* convex = new RangeConvex(corner[0], corner[1], corner[2], corner[3]);
0097             convex->setOlevel(level);
0098             range = new HtmRange();
0099             convex->intersect(htm, range); // commit fec61ac2c400e7138425961e779fed3bbf5687a5 removed unmanipulated bool parameter from RangeConvex::intersect -- asimha
0100             iterator = new HtmRangeIterator(range);
0101         }
0102 
0103         double timeRectangle(int iter, double ra, double dec, double dra, double ddec) {
0104             int i = iter;
0105             time_t t0 = clock();
0106             while(i--) {
0107                 intersectRectangle(ra, dec, dra, ddec);
0108             }
0109             time_t t1 = clock();
0110             double nsec = (double)(t1-t0)/(double)CLOCKS_PER_SEC ;
0111             return nsec;
0112         }
0113 
0114         double timeCircle(int iter, double ra, double dec, double rad) {
0115             int i = iter;
0116             time_t t0 = clock();
0117             while(i--) {
0118                 intersectCircle(ra, dec, rad);
0119             }
0120             time_t t1 = clock();
0121             double nsec = (double)(t1-t0)/(double)CLOCKS_PER_SEC ;
0122             return nsec;
0123         }
0124 
0125         HtmRangeIterator* getIterator() {
0126             return iterator;
0127         }
0128 
0129         SpatialIndex* getHtm() {
0130             return htm;
0131         }
0132 
0133         bool hasNext() {
0134             return iterator->hasNext();
0135         }
0136 
0137         long nextId() {
0138             return iterator->next();
0139         }
0140         const char * nextName() {
0141             return iterator->nextSymbolic(name_buffer);
0142         }
0143 
0144         long totalTriangles() {
0145             return numTriangles;
0146         }
0147 
0148         int resultSize() {
0149             HtmRangeIterator* iter;
0150             int size = 0;
0151             iter = new HtmRangeIterator(range);
0152             while (iter->hasNext()) {
0153                 size++;
0154                 iter->next();
0155             }
0156             return size;
0157         }
0158 };
0159 
0160 MODULE = HTMesh         PACKAGE = HTMesh
0161 
0162 HTMesh *
0163 HTMesh::new(int level, int build_level=0)
0164 
0165 void
0166 HTMesh::DESTROY()
0167 
0168 void
0169 HTMesh::intersect_rect(double ra, double dec, double dra, double ddec)
0170 CODE:
0171     THIS->intersectRectangle(ra, dec, dra, ddec);
0172 
0173 void
0174 HTMesh::intersect_poly4(double ra1, double dec1, double ra2, double dec2, double ra3, double dec3, double ra4, double dec4)
0175 CODE:
0176     THIS->intersectPolygon4(ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4);
0177 
0178 void
0179 HTMesh::intersect_circle(double ra, double dec, double rad)
0180 CODE:
0181     THIS->intersectCircle(ra, dec, rad);
0182     
0183 double
0184 HTMesh::time_rect(int iterations, double ra, double dec, double dra, double ddec)
0185 CODE:
0186     RETVAL = THIS->timeRectangle(iterations, ra, dec, dra, ddec);
0187 OUTPUT:
0188     RETVAL
0189     
0190 double
0191 HTMesh::time_circle(int iter, double ra, double dec, double rad)
0192 CODE:
0193     RETVAL = THIS->timeCircle(iter, ra, dec, rad);
0194 OUTPUT:
0195     RETVAL
0196     
0197 void
0198 HTMesh::results()
0199 PPCODE:
0200         HtmRangeIterator* iterator = THIS->getIterator();
0201         while ( iterator->hasNext() ) {
0202                 XPUSHs(sv_2mortal(newSVnv(iterator->next())));
0203         }
0204 
0205 void
0206 HTMesh::next_triangle()
0207 PPCODE:
0208         long id = THIS->nextId();
0209         SpatialIndex* htm = THIS->getHtm();
0210         SpatialVector v1, v2, v3;
0211         htm->nodeVertex(id, v1, v2, v3);
0212         
0213         XPUSHs(sv_2mortal(newSVnv( v1.ra() / 15.0 )));
0214         XPUSHs(sv_2mortal(newSVnv( v1.dec() )));
0215         
0216         XPUSHs(sv_2mortal(newSVnv( v2.ra() / 15.0 )));
0217         XPUSHs(sv_2mortal(newSVnv( v2.dec() )));
0218 
0219         XPUSHs(sv_2mortal(newSVnv( v3.ra() / 15.0 )));
0220         XPUSHs(sv_2mortal(newSVnv( v3.dec() )));
0221 
0222         XPUSHs(sv_2mortal(newSVnv( id )));
0223 
0224 bool
0225 HTMesh::has_next()
0226 CODE:
0227     RETVAL = THIS->hasNext();
0228 OUTPUT:
0229     RETVAL
0230 
0231 const char*
0232 HTMesh::id_to_name(long id)
0233 CODE:
0234     RETVAL = THIS->idToName(id);
0235 OUTPUT:
0236     RETVAL
0237 
0238 long
0239 HTMesh::next_id()
0240 CODE:
0241     RETVAL = THIS->nextId();
0242 OUTPUT:
0243     RETVAL
0244 
0245 const char *
0246 HTMesh::next_name()
0247 CODE:
0248     RETVAL = THIS->nextName();
0249 OUTPUT:
0250     RETVAL
0251 
0252 long
0253 HTMesh::total_triangles()
0254 CODE:
0255     RETVAL = THIS->totalTriangles();
0256 OUTPUT:
0257     RETVAL
0258 
0259 int
0260 HTMesh::result_size()
0261 CODE:
0262     RETVAL = THIS->resultSize();
0263 OUTPUT:
0264     RETVAL
0265