Übergroße Winkel normieren
-
Hey,
ich muss für die Uni Funktionsrümpfe in einem Programm ergänzen. In diesem geht es u.A. um Winkelumrechnung.
Anfangs ist ein Winkel im Gradmaß mit Bogenminute und -sekunde gegeben. Ist dieser zu groß, soll er normiert werden. Genau hier liegt mein Problem.Angeblich wird z.B. ein Winkel der Größe 400°400'400" auf 46°46'40" normiert. Kann mir jemand erklären, wie das funktioniert? Also rein mathematisch, muss nicht in Codeform sein.
Hier die Programmvorlage, falls es interessiert:
#include <stdio.h> #ifndef M_PI const double M_PI = 3.14159265358979323846; // falls nicht in math.h #endif // Struktur für Winkel typedef struct { int grad; // in {0, ..., 359} int minuten; // in {0, ..., 59} double sekunden; // in [0; 60) } Winkel; void winkelNormalisiere(Winkel* w) // normalisiert w, falls grad/minuten/sekunden zu groß, // z.B. 400°400'400" wird zu 46°46'40" // ist jedoch eine der Komponenten negativ, wird *w immer gesetzt auf 0°0'0" { } // erzeugt den Winkel g°m's" und gibt diesen normalisiert zurück Winkel winkelNeu(int g, int m, double s) { } // Rückgabe des Winkels in Grad als Gleitkommazahl, z.B. 90°30'0" -> 90.5 double winkelAlsDouble(const Winkel* w) { } // Rückgabe des Winkels im Bogenmaß, z.B. 90°0'0" -> M_PI/2 double winkelImBogenmass(const Winkel* w) { } // addiert die winkel *w1 und *w2 und gibt die Summe normalisiert zurück Winkel winkelPlus(const Winkel* w1, const Winkel* w2) { } // Ausgabe eines Winkels, Format z.B. 90°12'38" void winkelDrucke(const Winkel* w) { } // Einlesen eines Winkels in *w im Format wie bei Ausgabe void winkelEingabe(Winkel* w) { } // Testprogramm int main(void) { Winkel w1 = winkelNeu(90, 0, 0); printf("w1 = "); winkelDrucke(&w1); putchar('\n'); // -> w1 = 90°0'0" Winkel w2 = winkelNeu(1, 7, 3.678); printf("w2 = "); winkelDrucke(&w2); putchar('\n'); // -> w2 = 1°7'3.678" printf("neuen Winkel eingeben: "); winkelEingabe(&w2); // z.B.: 400°400'400" printf("gelesene Eingabe: "); winkelDrucke(&w2); putchar('\n'); // -> gelesene Eingabe: 46°46'40" printf("in Grad: %g°\n", winkelAlsDouble(&w2)); // -> in Grad: 46.7778° printf("im Bogenmaß: %g\n", winkelImBogenmass(&w2));//-> im Bogenmaß: 0.816426 Winkel w3 = winkelNeu(22, 22, 22); Winkel w4 = winkelNeu(44, 44, 44); winkelDrucke(&w3); printf(" + "); winkelDrucke(&w4); printf(" = "); Winkel wsum = winkelPlus(&w3, &w4); winkelDrucke(&wsum); putchar('\n'); // -> 22°22'22" + 44°44'44" = 67°7'6" return 0; }
MfG
Simon
-
lprulzcrossover schrieb:
Angeblich wird z.B. ein Winkel der Größe 400°400'400" auf 46°46'46" normiert.
Kann es ein, dass du die 0 nicht richtig gelesen hast?
40°40'40" kommt eher hin.Einmal rum im Kreis, bist du wieder am Anfang.
Der Bereich geht von 0 <= winkel < 360°Du must solange 360 abziehen bis es passt. Oder modulo 360 rechnen.
-
Na dasselbe dachte ich eben auch, aber mein Übungsleiter hat mir extra noch mal bestätigt, dass 46°46'40" herauskommt...
Hätte ansonsten auch einfach 400°-360° = 40° gerechnet. Ich finde aber auch rein gar nichts dazu im Internet...
-
Oh man, ich sollte nachdenken vor dem schreiben.
Es sind 60' für 1° und 60" für 1'
Daher sind die 400" schon 6'40" plus die 6°40" von den 400'.
Dann passt das auch.
-
http://de.wikipedia.org/wiki/Winkelminute
Winkelminuten und Winkelsekunden
so in etwa: 400' entsprechen 6.6 Grad, d.h. 400 grad und 400' werden zu (400 -360) + 6 grad = 46 grad
-
Ah okay, danke ihr beiden, soweit habe ich nicht gedacht
-
Eine Winkelminute hat 60 Winkelsekunden und ein Winkelgrad 60 Winkelminuten...
-> 400°400'400" = 400°400'(6*60+40)'' = 400°406'40" = 400°(6*60+46)'40" = 406°46'40"
Und nun noch die Normierung des Winkels:
-> 406°-360° = 46°
insg. -> 46°46'40"
Ups: zu spät