Frage: Thema Kugelkoordinaten mit cos/sin berechen
-
Hi,
ich brächte hilfe bei meiner Kugel.
um genauer zu sein brauch ich hilfe bei der berechnung der Punkte
die formel hab ich ja und kapier ich alles das problem ist nur wie benutzt ich cos und sin in C ++?
Formel:
theta = 0 - 360°
phi = 0 - 180°x = r * cos(theta) * sin(phi);
y = r * sin(theta) * sin(phi);
z = r * cos(phi);gerechnet werden würde dann bei theta in 20er schritten und bei phi in 10er schritten
z.B.
x = 1 * cos(0) * sin(0)
y = 1 * sin(0) * sin(0)
z = 1 * cos(0)wäre dann er oberste punkt X = 0 Y = 0 Z = 1
der nächste punkt wäre dann ein phi tiefer also bei 10 und da müsste man dann 18 neue punkte machen mit immer einem thteta weiter beginnent bei 0wär dann
1 - 18 punkte
immer mit phi 10
und theta 0 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360
und das nächste wäre dann phi 20
und theta das selbe
bis phi halt 180 istaber das wesentlich Problem ist cosinus und sinus in C++ für mich das program drum herum würd ich sicher dann hinbekommen
Danke schonmal
-
#include <cmath> std::cos(); std::sin();
aber RTFM
-
Ich wuerd mal auf <math> tippen. Dort gibts bestimmt Funktionen wie sin() und cos(), allerdings arbeiten die mit rad und nicht mit grad. Also deine Gradzahlen mit PI/180 multiplizieren. Zwei Anmerkungen noch zu deinen Darstellugnen:
erstens: von 0 - 360 hast du 19 Punkte aufgezaehlt - kein Wunder, da 0 und 360 in dem Fall das selbe ist. entscheide dich am besten fuer einen von beiden. Im anderen Fall musst du von 0-180 tatsaechlich 19 Schritte gehn von Pol zu Pol.
zweitens: jeder, derm in der Physik oder anderswo schonmal Kugelkoordinaten ueber den Weg gelaufen sind, wird bei deinen Angaben vermutlich erstmal stutzig: allgemein ist es ueblich, den Polarwinkel mit zu bezeichnen und den Azimuthalwinkel mit , also genau andersrum als du es hier gemacht hast.
-
hmmm also wenn ichs genau andersrum gemacht hab tuts mir leid
ja und 0 360 ist das selbe ja passt schon wenn ich eins von beiden nehme da sich die punkte dann verbinden und dann verbindet sich punkt 0 halt dann mit punkt 17 (dann sinds 18) dann ist ok
hmmm also ok pi\180 * z.b. 20° also aber wie genau muss ich dann pi nehmen?
3.1415926535 langt das dann?
und wäre dann X = 1 * grad * 3.1415926535/180 <---- soweit richtig
aber wie geht des dann bei sinus?und dafür bräuchte ich eine nähere erläuterung und wenns ginge ein anwendungsbeispiel
#include <cmath> std::cos(); std::sin();
-
wie schon oben stand, steht alles in den Dokus zur standardbibliothek. Auch std::pi() duerfte eine Funktion in <math> sein, die dir pi in hinreichender Genauigkeit liefert. Und wie du eine Funktion anwendest sollte eigentlich klar sein.
X = 1 * grad * 3.1415926535/180
ist auf jeden Fall nicht richtig. Du hast doch die Formel fuer x oben hingeschrieben, und die sah etwas anders aus.
-
GT schrieb:
hmmm also ok pi\180 * z.b. 20° also aber wie genau muss ich dann pi nehmen?
3.1415926535 langt das dann?
Besser:
const double PI = std::acos( -1.0 );
GT schrieb:
und wäre dann X = 1 * grad * 3.1415926535/180 <---- soweit richtig
aber wie geht des dann bei sinus?Du lässt am besten zwei Schleifen über Phi und Theta laufen, dann schreibt man die Berechnung von x,y und z in C++ wie folgt
double r = 1.0; for( int phi = 10; phi < 180; phi += 10 ) { for( int theta = 0; theta < 360; theta += 20 ) { double x = r * cos(theta * PI/180) * sin(phi * PI/180); double y = r * sin(theta * PI/180) * sin(phi * PI/180); double z = r * cos(phi * PI/180); } }
.. ohne jede Optimierung.
Gruß
Werner
-
es gibt ein M_PI in der math/cmath. das sollte man auch benutzen...
-
es gibt ein M_PI in der math/cmath. das sollte man auch benutzen...
Aber Vorsicht:
The "Math Constants" are not defined in Standard C/C++. Therefore, in order to use them, you have to first define _USE_MATH_DEFINES and then include cmath or math.h as below.
(Visual-C++ 2005 Doku)
Grüße,
Martin
-
vielen dank schonmal
dann weder ich das mal austesten und mein versuchs ergebniss ihr kuntgeben
-
wie ich es anstelle weis ich jetzt aber jetzt wollte ich noch mal rat einholen für eine schleife
int Punkt1; int Punkt2; int Punkt3; Punkt1 = radius * cos_d(0) * sin_d(0); Punkt2 = radius * sin_d(0) * sin_d(0); Punkt3 = radius * cos_d(0);
cos_d und sin_d wandeln den wert in der klammer um.
Wegen der schleife ich brauch da eine schleife die pro reihe 18 werte von theta schreibt immer mit dem selben phi wert
und das 306 mal
also ich brauch ne schleife die 0 - 360 hochzählt in 20er schritten das dann das theta sind dann 18 werte das bei einem gleichbleibenden phi wert angefangen bie 0 bis 180 in 10er schritten und die nachdem sie 360 erreicht hat bzw. 340 da ja 360 und 0 das selbe sind (aber kann man ja anders lösen) dann phi um 10 hochzählt
und dann brauch ich dann immer die rechnung drin für die 3 punkte
Punkt1 = radius * cos_d(0) * sin_d(0);
Punkt2 = radius * sin_d(0) * sin_d(0);
Punkt3 = radius * cos_d(0);also quasi 54 zahlen pro schleifendruchlauf
da müsste ich dann eine schleife in ner schleife machen oder? also die bei phi 0 anfängt dann 0 -360 hochzählt für jeden schritt die 3 rechnungen macht und dann um 10 bei phi hochzähltalso wär dann die erste schleife die phi ? oder die bei 360 erreicht phi um 10 erhöt und in der schleife muss dann die schleife sein die theta 0 -360 zählt und rechnet oder?
oder kann mir wer nen beispiel geben?
-
Die doppelte Schleife wurde oben doch schon von Werner gepostet.
Und wenn du dir angewöhnst, Punkte und Kommata etwas großzügiger zu benutzen, wirds sehr viel leichter, deine Sätze zu lesen und zu verstehen.Denn wenn man Sätze lesen muss bei denen jede Interpunktion das heißt Kommas und Punkte also Satzzeichen fehlt und die auch noch versucht zu verstehen dann kann das auf Dauer recht schwierig werden manche bekommen davon sogar Kopfschmerzen.
-
tut mir leid
-
Verdammt das ist ja genau das was ich brauch. Doof das ich nicht drauf eingegangen bin.
Das löst ja dann schon alle meine Probleme
Vielen dank Werner Salomon und pumuckl ich versuch mich zu bessern. Ist eine angewohnheit von mir so zu schreiben.
-
/edit doppelpost