SkyPoint SkyPoint::moveAway( const SkyPoint &from, double dist ) const { dms lat1, dtheta; if( dist == 0.0 ) { qDebug() << "moveAway called with zero distance!"; return *this; } double dst = fabs( dist * dms::DegToRad / 3600.0 ); // In radian // Compute the bearing angle w.r.t. the RA axis ("latitude") dms dRA( ra() - from.ra() ); dms dDec( dec() - from.dec() ); double bearing = atan2( dRA.sin() / dRA.cos(), dDec.sin() ); // Do not use dRA = PI / 2!! //double bearing = atan2( dDec.radians() , dRA.radians() ); double dir0 = (dist >= 0 ) ? bearing : bearing + dms::PI; // in radian dist = fabs( dist ); // in radian lat1.setRadians( asin( dec().sin() * cos( dst ) + dec().cos() * sin( dst ) * cos( dir0 ) ) ); dtheta.setRadians( atan2( sin( dir0 ) * sin( dst ) * dec().cos(), cos( dst ) - dec().sin() * lat1.sin() ) ); return SkyPoint( ra() + dtheta, lat1 ); }
SkyPoint modCalcAngDist::getCoords (dmsBox* rBox, dmsBox* dBox, bool *ok) { dms raCoord, decCoord; bool ok2=false; raCoord = rBox->createDms(false, &ok2); if ( ok2 ) decCoord = dBox->createDms(true, &ok2); if ( ok2 ) { if ( ok ) *ok = ok2; return SkyPoint (raCoord, decCoord); } else { if ( ok ) *ok = ok2; return SkyPoint(); } }
SkyPoint modCalcAngDist::getCoords (dmsBox* rBox, dmsBox* dBox) { dms raCoord, decCoord; raCoord = rBox->createDms(FALSE); decCoord = dBox->createDms(); SkyPoint sp = SkyPoint (raCoord, decCoord); return sp; }
SkyPoint modCalcAzel::getEquCoords (void) { dms raCoord, decCoord; raCoord = raBox->createDms(FALSE); decCoord = decBox->createDms(); SkyPoint sp = SkyPoint (raCoord, decCoord); return sp; }
SkyPoint modCalcAzel::getHorCoords (void) { dms azCoord, elCoord; azCoord = azBox->createDms(); elCoord = elBox->createDms(); SkyPoint sp = SkyPoint(); sp.setAz(azCoord); sp.setAlt(elCoord); return sp; }
SkyPoint SkyPoint::timeTransformed( const SkyPoint *p, const KStarsDateTime &dt, const GeoLocation *geo, const double hour ) { Q_ASSERT( p ); if( !p ) return SkyPoint( NaN::d, NaN::d ); // Jasem 2015-08-24 Using correct procedure to find altitude SkyPoint sp = *p; // make a copy KStarsDateTime targetDateTime = dt.addSecs( hour * 3600.0 ); dms LST = geo->GSTtoLST( targetDateTime.gst() ); sp.EquatorialToHorizontal( &LST, geo->lat() ); return sp; }
SkyPoint SkyPoint::Eterms(void) { double sd, cd, sinEterm, cosEterm; dms raTemp, raDelta, decDelta; Dec.SinCos(sd,cd); raTemp.setH( RA.Hours() + 11.25); raTemp.SinCos(sinEterm,cosEterm); raDelta.setH( 0.0227*sinEterm/(3600.*cd) ); decDelta.setD( 0.341*cosEterm*sd/3600. + 0.029*cd/3600. ); return SkyPoint(raDelta, decDelta); }
SkyPoint SkyObject::recomputeCoords( const KStarsDateTime &dt, const GeoLocation *geo ) { //store current position SkyPoint original( ra(), dec() ); // compute coords for new time jd KSNumbers num( dt.djd() ); if ( isSolarSystem() && geo ) { dms LST = geo->GSTtoLST( dt.gst() ); updateCoords( &num, true, geo->lat(), &LST ); } else { updateCoords( &num ); } //the coordinates for the date dt: SkyPoint sp = SkyPoint( ra(), dec() ); // restore original coords setRA( original.ra()->Hours() ); setDec( original.dec()->Degrees() ); return sp; }
//void modCalcAngDist::processLines( const QFile * fIn ) { void modCalcAngDist::processLines( QTextStream &istream ) { // we open the output file // QTextStream istream(&fIn); QString outputFileName; outputFileName = OutputLineEditBatch->text(); QFile fOut( outputFileName ); fOut.open(IO_WriteOnly); QTextStream ostream(&fOut); QString line; QString space = " "; int i = 0; SkyPoint sp0, sp1; dms ra0B, dec0B, ra1B, dec1B, dist; while ( ! istream.eof() ) { line = istream.readLine(); line.stripWhiteSpace(); //Go through the line, looking for parameters QStringList fields = QStringList::split( " ", line ); i = 0; // Read RA and write in ostream if corresponds if(ra0CheckBatch->isChecked() ) { ra0B = dms::fromString( fields[i],FALSE); i++; } else ra0B = ra0BoxBatch->createDms(FALSE); if ( allRadioBatch->isChecked() ) ostream << ra0B.toHMSString() << space; else if(ra0CheckBatch->isChecked() ) ostream << ra0B.toHMSString() << space; // Read DEC and write in ostream if corresponds if(dec0CheckBatch->isChecked() ) { dec0B = dms::fromString( fields[i], TRUE); i++; } else dec0B = dec0BoxBatch->createDms(); if ( allRadioBatch->isChecked() ) ostream << dec0B.toDMSString() << space; else if(dec0CheckBatch->isChecked() ) ostream << dec0B.toDMSString() << space; // Read RA and write in ostream if corresponds if(ra1CheckBatch->isChecked() ) { ra1B = dms::fromString( fields[i],FALSE); i++; } else ra1B = ra1BoxBatch->createDms(FALSE); if ( allRadioBatch->isChecked() ) ostream << ra1B.toHMSString() << space; else if(ra1CheckBatch->isChecked() ) ostream << ra1B.toHMSString() << space; // Read DEC and write in ostream if corresponds if(dec1CheckBatch->isChecked() ) { dec1B = dms::fromString( fields[i], TRUE); i++; } else dec1B = dec1BoxBatch->createDms(); if ( allRadioBatch->isChecked() ) ostream << dec1B.toDMSString() << space; else if(dec1CheckBatch->isChecked() ) ostream << dec1B.toDMSString() << space; sp0 = SkyPoint (ra0B, dec0B); sp1 = SkyPoint (ra1B, dec1B); dist = sp0.angularDistanceTo(&sp1); ostream << dist.toDMSString() << endl; } fOut.close(); }
void modCalcVlsr::processLines( QTextStream &istream ) { // we open the output file // QTextStream istream(&fIn); QString outputFileName; outputFileName = OutputFileBoxBatch->url().toLocalFile(); QFile fOut( outputFileName ); fOut.open(QIODevice::WriteOnly); QTextStream ostream(&fOut); QString line; QChar space = ' '; int i = 0; long double jd0; SkyPoint spB; double sra, cra, sdc, cdc; dms raB, decB, latB, longB; QString epoch0B; double vhB, vgB, vtB, vlsrB, heightB; double vtopo[3]; QTime utB; QDate dtB; KStarsDateTime dt0B; while ( ! istream.atEnd() ) { line = istream.readLine(); line.trimmed(); //Go through the line, looking for parameters QStringList fields = line.split( ' ' ); i = 0; // Read Ut and write in ostream if corresponds if(UTCheckBatch->isChecked() ) { utB = QTime::fromString( fields[i] ); i++; } else utB = UTBoxBatch->time(); if ( AllRadioBatch->isChecked() ) ostream << KGlobal::locale()->formatTime( utB ) << space; else if(UTCheckBatch->isChecked() ) ostream << KGlobal::locale()->formatTime( utB ) << space; // Read date and write in ostream if corresponds if(DateCheckBatch->isChecked() ) { dtB = QDate::fromString( fields[i] ); i++; } else dtB = DateBoxBatch->date(); if ( AllRadioBatch->isChecked() ) ostream << KGlobal::locale()->formatDate( dtB, KLocale::LongDate ).append(space); else if(DateCheckBatch->isChecked() ) ostream << KGlobal::locale()->formatDate( dtB, KLocale::LongDate ).append(space); // Read RA and write in ostream if corresponds if(RACheckBatch->isChecked() ) { raB = dms::fromString( fields[i],false); i++; } else raB = RABoxBatch->createDms(false); if ( AllRadioBatch->isChecked() ) ostream << raB.toHMSString() << space; else if(RACheckBatch->isChecked() ) ostream << raB.toHMSString() << space; // Read DEC and write in ostream if corresponds if(DecCheckBatch->isChecked() ) { decB = dms::fromString( fields[i], true); i++; } else decB = DecBoxBatch->createDms(); if ( AllRadioBatch->isChecked() ) ostream << decB.toDMSString() << space; else if(DecCheckBatch->isChecked() ) ostream << decB.toDMSString() << space; // Read Epoch and write in ostream if corresponds if(EpochCheckBatch->isChecked() ) { epoch0B = fields[i]; i++; } else epoch0B = EpochBoxBatch->text(); if ( AllRadioBatch->isChecked() ) ostream << epoch0B << space; else if(EpochCheckBatch->isChecked() ) ostream << epoch0B << space; // Read vlsr and write in ostream if corresponds if(InputVelocityCheckBatch->isChecked() ) { vlsrB = fields[i].toDouble(); i++; } else vlsrB = InputVelocityComboBatch->currentText().toDouble(); if ( AllRadioBatch->isChecked() ) ostream << vlsrB << space; else if(InputVelocityCheckBatch->isChecked() ) ostream << vlsrB << space; // Read Longitude and write in ostream if corresponds if (LongCheckBatch->isChecked() ) { longB = dms::fromString( fields[i],true); i++; } else longB = LongitudeBoxBatch->createDms(true); if ( AllRadioBatch->isChecked() ) ostream << longB.toDMSString() << space; else if (LongCheckBatch->isChecked() ) ostream << longB.toDMSString() << space; // Read Latitude if (LatCheckBatch->isChecked() ) { latB = dms::fromString( fields[i], true); i++; } else latB = LatitudeBoxBatch->createDms(true); if ( AllRadioBatch->isChecked() ) ostream << latB.toDMSString() << space; else if (LatCheckBatch->isChecked() ) ostream << latB.toDMSString() << space; // Read height and write in ostream if corresponds if(ElevationCheckBatch->isChecked() ) { heightB = fields[i].toDouble(); i++; } else heightB = ElevationBoxBatch->text().toDouble(); if ( AllRadioBatch->isChecked() ) ostream << heightB << space; else if(ElevationCheckBatch->isChecked() ) ostream << heightB << space; // We make the first calculations spB = SkyPoint (raB, decB); dt0B.setFromEpoch(epoch0B); vhB = spB.vHeliocentric(vlsrB, dt0B.djd()); jd0 = KStarsDateTime(dtB,utB).djd(); vgB = spB.vGeocentric(vlsrB, jd0); geoPlace->setLong( longB ); geoPlace->setLat( latB ); geoPlace->setHeight( heightB ); dms gsidt = KStarsDateTime(dtB,utB).gst(); geoPlace->TopocentricVelocity(vtopo, gsidt); spB.ra().SinCos(sra, cra); spB.dec().SinCos(sdc, cdc); vtB = vgB - (vtopo[0]*cdc*cra + vtopo[1]*cdc*sra + vtopo[2]*sdc); ostream << vhB << space << vgB << space << vtB << endl; } fOut.close(); }
void modCalcAzel::processLines( QTextStream &istream ) { // we open the output file // QTextStream istream(&fIn); QString outputFileName; outputFileName = OutputLineEditBatch->text(); QFile fOut( outputFileName ); fOut.open(IO_WriteOnly); QTextStream ostream(&fOut); QString line; QString space = " "; int i = 0; long double jd0, jdf; dms LST; SkyPoint sp; dms raB, decB, latB, longB, azB, elB; double epoch0B; QTime utB; ExtDate dtB; while ( ! istream.eof() ) { line = istream.readLine(); line.stripWhiteSpace(); //Go through the line, looking for parameters QStringList fields = QStringList::split( " ", line ); i = 0; // Read Ut and write in ostream if corresponds if(utCheckBatch->isChecked() ) { utB = QTime::fromString( fields[i] ); i++; } else utB = utBoxBatch->time(); if ( allRadioBatch->isChecked() ) ostream << utB.toString() << space; else if(utCheckBatch->isChecked() ) ostream << utB.toString() << space; // Read date and write in ostream if corresponds if(dateCheckBatch->isChecked() ) { dtB = ExtDate::fromString( fields[i] ); i++; } else dtB = dateBoxBatch->date(); if ( allRadioBatch->isChecked() ) ostream << dtB.toString().append(space); else if(dateCheckBatch->isChecked() ) ostream << dtB.toString().append(space); // Read Longitude and write in ostream if corresponds if (longCheckBatch->isChecked() ) { longB = dms::fromString( fields[i],TRUE); i++; } else longB = longBoxBatch->createDms(TRUE); if ( allRadioBatch->isChecked() ) ostream << longB.toDMSString() << space; else if (longCheckBatch->isChecked() ) ostream << longB.toDMSString() << space; // Read Latitude if (latCheckBatch->isChecked() ) { latB = dms::fromString( fields[i], TRUE); i++; } else latB = latBoxBatch->createDms(TRUE); if ( allRadioBatch->isChecked() ) ostream << latB.toDMSString() << space; else if (latCheckBatch->isChecked() ) ostream << latB.toDMSString() << space; // Read Epoch and write in ostream if corresponds if(epochCheckBatch->isChecked() ) { epoch0B = fields[i].toDouble(); i++; } else epoch0B = getEpoch( epochBoxBatch->text() ); if ( allRadioBatch->isChecked() ) ostream << epoch0B << space; else if(epochCheckBatch->isChecked() ) ostream << epoch0B << space; // We make the first calculations KStarsDateTime dt; dt.setFromEpoch( epoch0B ); jdf = KStarsDateTime(dtB,utB).djd(); jd0 = dt.djd(); LST = KStarsDateTime(dtB,utB).gst().Degrees() + longB.Degrees(); // Equatorial coordinates are the input coords. if (!horInputCoords) { // Read RA and write in ostream if corresponds if(raCheckBatch->isChecked() ) { raB = dms::fromString( fields[i],FALSE); i++; } else raB = raBoxBatch->createDms(FALSE); if ( allRadioBatch->isChecked() ) ostream << raB.toHMSString() << space; else if(raCheckBatch->isChecked() ) ostream << raB.toHMSString() << space; // Read DEC and write in ostream if corresponds if(decCheckBatch->isChecked() ) { decB = dms::fromString( fields[i], TRUE); i++; } else decB = decBoxBatch->createDms(); if ( allRadioBatch->isChecked() ) ostream << decB.toDMSString() << space; else if(decCheckBatch->isChecked() ) ostream << decB.toDMSString() << space; sp = SkyPoint (raB, decB); sp.apparentCoord(jd0, jdf); sp.EquatorialToHorizontal( &LST, &latB ); ostream << sp.az()->toDMSString() << space << sp.alt()->toDMSString() << endl; // Input coords are horizontal coordinates } else { if(azCheckBatch->isChecked() ) { azB = dms::fromString( fields[i],FALSE); i++; } else azB = azBoxBatch->createDms(); if ( allRadioBatch->isChecked() ) ostream << azB.toHMSString() << space; else if(raCheckBatch->isChecked() ) ostream << azB.toHMSString() << space; // Read DEC and write in ostream if corresponds if(elCheckBatch->isChecked() ) { elB = dms::fromString( fields[i], TRUE); i++; } else elB = decBoxBatch->createDms(); if ( allRadioBatch->isChecked() ) ostream << elB.toDMSString() << space; else if(elCheckBatch->isChecked() ) ostream << elB.toDMSString() << space; sp.setAz(azB); sp.setAlt(elB); sp.HorizontalToEquatorial( &LST, &latB ); ostream << sp.ra()->toHMSString() << space << sp.dec()->toDMSString() << endl; } } fOut.close(); }
Vector2f Projector::clipLineVec( SkyPoint *p1, SkyPoint *p2 ) const { /* ASSUMES p1 was not clipped but p2 was. * Return the QPoint that barely clips in the line twixt p1 and p2. */ //TODO: iteration = ceil( 0.5*log2( w^2 + h^2) )?? // also possibly rewrite this // --hdevalence int iteration = 15; // For "perfect" clipping: // 2^interations should be >= max pixels/line bool isVisible = true; // so we start at midpoint SkyPoint mid; Vector2f oMid; double x, y, z, dx, dy, dz, ra, dec; int newx, newy, oldx, oldy; oldx = oldy = -10000; // any old value that is not the first omid toXYZ( p1, &x, &y, &z ); // -jbb printf("\np1: %6.4f %6.4f %6.4f\n", x, y, z); toXYZ( p2, &dx, &dy, &dz ); // -jbb printf("p2: %6.4f %6.4f %6.4f\n", dx, dy, dz); dx -= x; dy -= y; dz -= z; // Successive approximation to point on line that just clips. while(iteration-- > 0) { dx *= .5; dy *= .5; dz *= .5; if ( ! isVisible ) { // move back toward visible p1 x -= dx; y -= dy; z -= dz; } else { // move out toward clipped p2 x += dx; y += dy; z += dz; } // -jbb printf(" : %6.4f %6.4f %6.4f\n", x, y, z); // [x, y, z] => [ra, dec] ra = atan2( y, x ); dec = asin( z / sqrt(x*x + y*y + z*z) ); mid = SkyPoint( ra * 12. / dms::PI, dec * 180. / dms::PI ); mid.EquatorialToHorizontal( m_data->lst(), m_data->geo()->lat() ); oMid = toScreenVec( &mid, false, &isVisible ); //AND the result with checkVisibility to clip things going below horizon isVisible &= checkVisibility(&mid); newx = (int) oMid.x(); newy = (int) oMid.y(); // -jbb printf("new x/y: %4d %4d", newx, newy); if ( (oldx == newx) && (oldy == newy) ) { break; } oldx = newx; oldy = newy; } return oMid; }
void modCalcGalCoord::processLines( QTextStream &istream ) { // we open the output file // QTextStream istream(&fIn); const QString outputFileName = OutputFileBoxBatch->url().toLocalFile(); QFile fOut( outputFileName ); fOut.open(QIODevice::WriteOnly); QTextStream ostream(&fOut); QString line; QChar space = ' '; int i = 0; SkyPoint sp; dms raB, decB, galLatB, galLongB; QString epoch0B; while ( ! istream.atEnd() ) { line = istream.readLine(); line.trimmed(); //Go through the line, looking for parameters QStringList fields = line.split( ' ' ); i = 0; // Input coords are galactic coordinates: if (galInputCoords) { // Read Galactic Longitude and write in ostream if corresponds if(galLongCheckBatch->isChecked() ) { galLongB = dms::fromString( fields[i], true); i++; } else galLongB = galLongBoxBatch->createDms(true); if ( allRadioBatch->isChecked() ) ostream << galLongB.toDMSString() << space; else if(galLongCheckBatch->isChecked() ) ostream << galLongB.toDMSString() << space; // Read Galactic Latitude and write in ostream if corresponds if(galLatCheckBatch->isChecked() ) { galLatB = dms::fromString( fields[i], true); i++; } else galLatB = galLatBoxBatch->createDms(true); if ( allRadioBatch->isChecked() ) ostream << galLatB.toDMSString() << space; else if(galLatCheckBatch->isChecked() ) ostream << galLatB.toDMSString() << space; sp = SkyPoint (); sp.GalacticToEquatorial1950(&galLongB, &galLatB); ostream << sp.ra().toHMSString() << space << sp.dec().toDMSString() << epoch0B << endl; // Input coords. are equatorial coordinates: } else { // Read RA and write in ostream if corresponds if(raCheckBatch->isChecked() ) { raB = dms::fromString( fields[i],false); i++; } else raB = raBoxBatch->createDms(false); if ( allRadioBatch->isChecked() ) ostream << raB.toHMSString() << space; else if(raCheckBatch->isChecked() ) ostream << raB.toHMSString() << space; // Read DEC and write in ostream if corresponds if(decCheckBatch->isChecked() ) { decB = dms::fromString( fields[i], true); i++; } else decB = decBoxBatch->createDms(); if ( allRadioBatch->isChecked() ) ostream << decB.toDMSString() << space; else if(decCheckBatch->isChecked() ) ostream << decB.toDMSString() << space; // Read Epoch and write in ostream if corresponds if(epochCheckBatch->isChecked() ) { epoch0B = fields[i]; i++; } else epoch0B = epochBoxBatch->text(); if ( allRadioBatch->isChecked() ) ostream << epoch0B << space; else if(epochCheckBatch->isChecked() ) ostream << epoch0B << space; sp = SkyPoint (raB, decB); sp.J2000ToB1950(); sp.Equatorial1950ToGalactic(galLongB, galLatB); ostream << galLongB.toDMSString() << space << galLatB.toDMSString() << endl; } } fOut.close(); }