@@ -313,7 +313,7 @@ int StelGeodesicGrid::getZoneNumberForPoint(const Vec3f &v,int searchLevel) cons
313313// First iteration on the icosahedron base triangles
314314void StelGeodesicGrid::searchZones (const QVector<SphericalCap>& convex,
315315 int **inside_list,int **border_list,
316- int maxSearchLevel) const
316+ int maxSearchLevel, const Vec3d vel ) const
317317{
318318 if (maxSearchLevel < 0 ) maxSearchLevel = 0 ;
319319 else if (maxSearchLevel > maxLevel) maxSearchLevel = maxLevel;
@@ -329,12 +329,13 @@ void StelGeodesicGrid::searchZones(const QVector<SphericalCap>& convex,
329329#else
330330 bool corner_inside[12 ][static_cast <size_t >(convex.size ())];
331331#endif
332+ const Vec3f velf = vel.toVec3f ();
332333 for (int h=0 ;h<convex.size ();h++)
333334 {
334335 const SphericalCap& half_space (convex.at (h));
335336 for (int i=0 ;i<12 ;i++)
336337 {
337- corner_inside[i][h] = half_space.contains (icosahedron_corners[i]);
338+ corner_inside[i][h] = half_space.contains (icosahedron_corners[i]+velf );
338339 }
339340 }
340341 for (int i=0 ;i<20 ;i++)
@@ -344,7 +345,7 @@ void StelGeodesicGrid::searchZones(const QVector<SphericalCap>& convex,
344345 corner_inside[icosahedron_triangles[i].corners [0 ]],
345346 corner_inside[icosahedron_triangles[i].corners [1 ]],
346347 corner_inside[icosahedron_triangles[i].corners [2 ]],
347- inside_list,border_list,maxSearchLevel);
348+ inside_list,border_list,maxSearchLevel,velf );
348349 }
349350#if defined __STRICT_ANSI__ || !defined __GNUC__
350351 delete[] halfs_used;
@@ -360,7 +361,7 @@ void StelGeodesicGrid::searchZones(int lev,int index,
360361 const bool *corner1_inside,
361362 const bool *corner2_inside,
362363 int **inside_list,int **border_list,
363- const int maxSearchLevel) const
364+ const int maxSearchLevel, const Vec3f vel ) const
364365{
365366#if defined __STRICT_ANSI__ || !defined __GNUC__
366367 int *halfs_used = new int [static_cast <size_t >(halfSpacesUsed)];
@@ -416,26 +417,26 @@ void StelGeodesicGrid::searchZones(int lev,int index,
416417 {
417418 const int i = halfs_used[h];
418419 const SphericalCap& half_space (convex.at (i));
419- edge0_inside[i] = half_space.contains (t.e0 );
420- edge1_inside[i] = half_space.contains (t.e1 );
421- edge2_inside[i] = half_space.contains (t.e2 );
420+ edge0_inside[i] = half_space.contains (t.e0 +vel );
421+ edge1_inside[i] = half_space.contains (t.e1 +vel );
422+ edge2_inside[i] = half_space.contains (t.e2 +vel );
422423 }
423424 searchZones (lev,index+0 ,
424425 convex,halfs_used,halfs_used_count,
425426 corner0_inside,edge2_inside,edge1_inside,
426- inside_list,border_list,maxSearchLevel);
427+ inside_list,border_list,maxSearchLevel,vel );
427428 searchZones (lev,index+1 ,
428429 convex,halfs_used,halfs_used_count,
429430 edge2_inside,corner1_inside,edge0_inside,
430- inside_list,border_list,maxSearchLevel);
431+ inside_list,border_list,maxSearchLevel,vel );
431432 searchZones (lev,index+2 ,
432433 convex,halfs_used,halfs_used_count,
433434 edge1_inside,edge0_inside,corner2_inside,
434- inside_list,border_list,maxSearchLevel);
435+ inside_list,border_list,maxSearchLevel,vel );
435436 searchZones (lev,index+3 ,
436437 convex,halfs_used,halfs_used_count,
437438 edge0_inside,edge1_inside,edge2_inside,
438- inside_list,border_list,maxSearchLevel);
439+ inside_list,border_list,maxSearchLevel,vel );
439440#if defined __STRICT_ANSI__ || !defined __GNUC__
440441 delete[] edge0_inside;
441442 delete[] edge1_inside;
@@ -453,7 +454,7 @@ void StelGeodesicGrid::searchZones(int lev,int index,
453454/* ************************************************************************
454455 Return a search result matching the given spatial region
455456*************************************************************************/
456- const GeodesicSearchResult* StelGeodesicGrid::search (const QVector<SphericalCap>& convex, int maxSearchLevel) const
457+ const GeodesicSearchResult* StelGeodesicGrid::search (const QVector<SphericalCap>& convex, int maxSearchLevel, const Vec3d vel ) const
457458{
458459 // Try to use the cached version
459460 if (maxSearchLevel==lastMaxSearchlevel && convex==lastSearchRegion)
@@ -463,7 +464,7 @@ const GeodesicSearchResult* StelGeodesicGrid::search(const QVector<SphericalCap>
463464 // Else recompute it and update cache parameters
464465 lastMaxSearchlevel = maxSearchLevel;
465466 lastSearchRegion = convex;
466- cacheSearchResult->search (convex, maxSearchLevel);
467+ cacheSearchResult->search (convex, maxSearchLevel,vel );
467468 return cacheSearchResult;
468469}
469470
@@ -501,14 +502,14 @@ void GeodesicSearchResult::print() const
501502 }
502503}
503504
504- void GeodesicSearchResult::search (const QVector<SphericalCap>& convex, int maxSearchLevel)
505+ void GeodesicSearchResult::search (const QVector<SphericalCap>& convex, int maxSearchLevel, const Vec3d vel )
505506{
506507 for (int i=grid.getMaxLevel ();i>=0 ;i--)
507508 {
508509 inside[i] = zones[i];
509510 border[i] = zones[i]+StelGeodesicGrid::nrOfZones (i);
510511 }
511- grid.searchZones (convex,inside,border,maxSearchLevel);
512+ grid.searchZones (convex,inside,border,maxSearchLevel,vel );
512513}
513514
514515void GeodesicSearchInsideIterator::reset (void )
0 commit comments