dms SkyObject::riseSetTimeAz( const KStarsDateTime &dt, const GeoLocation *geo, bool riseT ) { dms Azimuth; double AltRad, AzRad; double sindec, cosdec, sinlat, coslat, sinHA, cosHA; double sinAlt, cosAlt; QTime UT = riseSetTimeUT( dt, geo, riseT ); KStarsDateTime dt0 = dt; dt0.setTime( UT ); SkyPoint sp = recomputeCoords( dt0, geo ); const dms *ram = sp.ra0(); const dms *decm = sp.dec0(); dms LST = auxRiseSetTimeLST( geo->lat(), ram, decm, riseT ); dms HourAngle = dms( LST.Degrees() - ram->Degrees() ); geo->lat()->SinCos( sinlat, coslat ); dec()->SinCos( sindec, cosdec ); HourAngle.SinCos( sinHA, cosHA ); sinAlt = sindec*sinlat + cosdec*coslat*cosHA; AltRad = asin( sinAlt ); cosAlt = cos( AltRad ); AzRad = acos( ( sindec - sinlat*sinAlt )/( coslat*cosAlt ) ); if ( sinHA > 0.0 ) AzRad = 2.0*dms::PI - AzRad; // resolve acos() ambiguity Azimuth.setRadians( AzRad ); return Azimuth; }
bool DeepStarComponent::starsInAperture( QList<StarObject *> &list, const SkyPoint ¢er, float radius, float maglim ) { if( maglim < triggerMag ) return false; // For DeepStarComponents, whether we use ra0() and dec0(), or // ra() and dec(), should not matter, because the stars are // repeated in all trixels that they will pass through, although // the factuality of this statement needs to be verified // Ensure that we have deprecessed the (RA, Dec) to (RA0, Dec0) Q_ASSERT( center.ra0().Degrees() >= 0.0 ); Q_ASSERT( center.dec0().Degrees() <= 90.0 ); m_skyMesh->intersect( center.ra0().Degrees(), center.dec0().Degrees(), radius, (BufNum) OBJ_NEAREST_BUF ); MeshIterator region( m_skyMesh, OBJ_NEAREST_BUF ); if( maglim < -28 ) maglim = m_FaintMagnitude; while ( region.hasNext() ) { Trixel currentRegion = region.next(); // FIXME: Build a better way to iterate over all stars. // Ideally, StarBlockList should have such a facility. StarBlockList *sbl = m_starBlockList[ currentRegion ]; sbl->fillToMag( maglim ); for( int i = 0; i < sbl->getBlockCount(); ++i ) { StarBlock *block = sbl->block( i ); for( int j = 0; j < block->getStarCount(); ++j ) { #ifdef KSTARS_LITE StarObject *star = &(block->star( j )->star); #else StarObject *star = block->star( j ); #endif if( star->mag() > maglim ) break; // Stars are organized by magnitude, so this should work if( star->angularDistanceTo( ¢er ).Degrees() <= radius ) list.append( star ); } } } return true; }
dms SkyObject::transitAltitude( const KStarsDateTime &dt, const GeoLocation *geo ) { KStarsDateTime dt0 = dt; QTime UT = transitTimeUT( dt, geo ); dt0.setTime( UT ); SkyPoint sp = recomputeCoords( dt0, geo ); const dms *decm = sp.dec0(); dms delta; delta.setRadians( asin ( sin (geo->lat()->radians()) * sin ( decm->radians() ) + cos (geo->lat()->radians()) * cos (decm->radians() ) ) ); return delta; }