Asteet ja radiaanit

jormamietti 23.03.08 18:08

Pari pallokolmion ratkaisuun liittyvää funktiota lausunnolle.

 Tekstiversio  Arvo: 1 (3 ääntä)  Äänestä: +  -
struct OSA
{
        double rad;
        int aste;
        int min;
        int sek;
}

const double RAD = 57.29577951;

/* Muuttaa radiaanit asteiksi, minuuteiksi ja sekunneiksi. */
void Radtodeg( struct OSA *osa )
{
        double daste, dmin, dsek;
        int iaste, imin;
        daste = osa->rad * RAD;
        osa->aste = iaste = (int)daste;
        dmin = (daste-iaste) * 60.;
        osa->min = imin = (int)dmin;
        dsek = (dmin-imin) * 60.;
        osa->sek = (int)(dsek+.5);
}

/* Muuttaa asteet, minuutit ja sekunnit radiaaneiksi. */
void Degtorad( struct OSA *osa )
{
        double daste, dmin, dsek;
        dsek = (double)osa->sek;
        dmin = (double)osa->min + dsek/60.;
        daste = (double)osa->aste+ dmin/60.;
        osa->rad = daste/RAD;
}
 

editoitu: 04:41 24.3.08
Jaenis 04:26 24.3.08 
Ihan toimiva, mutta eikö olisi "loogisempi" jos funktiot olisi tyyliin:
C
struct OSA RadToDeg(float Rad);
float DegToRad(struct OSA *osa);
Eli niille annettaisiin argumenttinä muunnettava tieto ja ne palauttaisivat tuloksen. Tällöin ton struktuurinkin voisi nimetä fiksummin, toi "OSA" on hiukan epäselvä nimeksi.

Pari hienosäätökommenttia...
C
const double RAD = 57.29577951;

// Sama asia eritavalla, käyttäen math kirjastoa ja pii vakiota
#include <math.h>
const double RAD = 180.0 / M_PI;


Tapasi merkitä desimaalilukuja on hiukan hämärä
C
// Käyttämäsi
dmin = (daste-iaste) * 60.;

// Hiukan standardimpi tapa:
dmin = (daste-iaste) * 60.0;
// Toinen:
dmin = (daste-iaste) * 60.0f;
// Tämänkin pitäisi toimia:
dmin = (daste-iaste) * 60f;
En mene takuuseen, mutta kait toi käyttämäsi tapa on myös standardin mukainen, en vain ole nähnyt sitä kovinkaan usein.

Ja vielä yks:
C
osa->sek = (int)(dsek+.5);

// Voi pyöristyksen tehdä math kirjaston round funktiollakin:
#include <math.h>
osa->sek = (int)round(dsek);


Edit: typot ja tekstinselvennystä
Edit2: Hassua, kuhan koodinväritys ei tunnista noita float numeroita
jormamietti 08:44 24.3.08 
Koodinväritys ja sisennyksien pituus näyttäisivät tulevan mureakuhasta.
Nimitys OSA tulee siitä, että yksikköpallon ollessa kyseessä sekä kolmion kulmat että sivut annetaan kulmayksiköissä. Kolmion rakenteena olen ajatellut käyttää:
struct KOL
{
struct OSA sivu[3];
struct OSA kulma[3];
double ala;
};
Laskennan trigonometriset funktiot toimivat radiaanella. Käyttäjä tietää paikan sijannin aste, min yksiköissä. Seuraavaksi olen ajatellut suunnitella funktiot HaeOsa() ja TuoOsa(), jotka kysyvät lähtöarvot ja palauttavat laskennan tulokset. Olen tutkinut Hannu Lappalaisen kirjaa: Merenkulun Pallotrigonometria ja todennut, että laskentafunktioihin tulee tarkistuksia ja poistumisia, jos välitulokset ovat mahdottomia. Merenkulkijoille tehtäviä tulostuksia varten täytyy vakioihin lisätä maapallon säde. JVM
P.S. C++ ja JAVA taitajat saanevat tästä aiheesta kolmiosta hyvän olion ja tulostukseen lisätyksi kolmion piirtämisen pallon pinnalle. Sama

jormamietti 13:40 24.3.08 

C
/* Osan tietojen kysely. */
/* Osan nimi ja laatu ovat ylemmän tason funktioissa, */
struct OSA HaeOsa(void)
{
        struct OSA temp;
        printf( " Anna aste min sek (max 180 astetta) : " );
        scanf( "%d %d %d", &temp.aste, &temp.min, &temp.sek );
        Degtorad(&temp);
        return temp;
}

/* Osan tietojen esitys. */
/* Osan nimi ja laatu ovat ylemmän tason funkioissa. */
void TuoOsa(struct OSA osa )
{
  printf( "%6.6f   %d %d %d \n", osa.rad, osa.aste, osa.min, osa.sek );
}
 


Näistä tuli aika yksinkertaiset, koska en vielä tiedä, mitä osia ja kuinka monta käsitellään samalla kerralla. JVM
jormamietti 14:19 11.4.08 
Oivalsin, että muuttujissa aste, min ja sek kannattaa käyttää double eikä int. Muutama funktio kevenee ja sitäpaitsi laskutehtävissä esimerkiksi paikan määrityksissä käytetään usein desimaaliasteita ja tai desimaaliminuutteja (32.4'). Ohjelmiin tulee enemmän tarkistuksia kuin varsinaista laskentaa, kun täytyy ottaa huomioon trigonometrian säännöt ja merenkulun käytännöt. JVM.
jormamietti 10:00 13.4.08 

C
#include <math.h>

struct OSA
{
        double rad;
        double aste;
        double min;
        double sek;
}testiosa;

/* Radiaanit asteiksi, minuuteiksi ja sekunneiksi */
void Radtodeg( struct OSA *osa )
{
        double aste, min, sek, kokaste, kokmin;
        aste = testiosa.rad * 180/M_PI;
        min = modf( aste, &kokaste );
        osa->aste = kokaste;
        min = min * 60;
        sek = modf( min, &kokmin );
        osa->min = kokmin;
        osa->sek = sek * 60;
}
 

Testissä tuli vastaan pieni yllätys. modf() muuttaa negatiivisten radiaanien kokonaisasteet positiivisiksi ja jättää jakojäännöksen negatiiviseksi. JVM