Mathematisches Problem mit C++ lösen
-
also habe gerade noch mal geprüft, der Link geht bei mir.
Nein, habe noch nichts programmiert, habe im vorfeld mal das ganze etwas durchdacht und da ist mir aufgefallen, dass mir dazu nichts einfällt.
-
Ist doch eigentlich ganz einfach
http://de.wikipedia.org/wiki/Bild:Winkelfunktionen_Einheitskreis.svg
-
demnach wäre auf der Skitze D (sin(x)/cos(x)), aber das kann ja net sein.
-
@bild
so wie das aussieht handelt es sich in dem Bild vom OP um kein rechwinkliges Dreieck, in deinem Bild schon

-
Einheitskreis r=1 bei dir r=10, also mal 10
Und dann auch noch beachten wie der winkel gemessen werden muss.Firefighter schrieb:
@bild
so wie das aussieht handelt es sich in dem Bild vom OP um kein rechwinkliges Dreieck, in deinem Bild schon
Beim OP ist erst mal kein Dreieck sondern ein Kreissegment zu sehen, das Dreieck kann man sich denken.
-
Sehe ich das richtig, dass dies ein Kreissegment ist, also b=c?
Wenn ja, wäre vielleicht allgemein die Umwandlung von x-y-Koordinaten in Polar-Koordinaten und zurück das richtige Programm, denn die Polarkoordinaten vom Punkt B sind Radius r=c=b und Winkel phi=90°. Bei Punkt C sind r=b=c und phi=90°-20°=70°. Input wäre dann b,70° und Output C(x,y).Regel:
Aus der Definition der Winkelfunktionen ergibt sich unmittelbar x = r * cos(phi) und y = r * sin(phi).Umgekehrt werden die Polar- aus den kartesischen Koordinaten mittels r2 = x2 + y2 und tan(phi) = y/x berechnet. Ist x > 0, so ist phi durch atan(y/x) gegeben, ansonsten ist noch 180° (im Bogenmaß pi) hinzuzufügen oder abzuziehen, was auf dasselbe hinausläuft.
Dein Punkt C wäre also durch C( b*cos(70°), b*sin(70°) ) beschreibbar.
Ergibt: C( b*0.342 , b*0.94 ) oder mit b=10 C(3.42, 9.4)
Hilft das weiter?
Ich gebe Dir nur ein Programm zum Überprüfen des Winkels phi:
#include <cmath> #include <limits> #include <iostream> using namespace std; float polarangle(float objx, float objy, float centx=0, float centy=0) { float x, y, phi; y = objy - centy; x = objx - centx; if ((x == 0) && (y < 0)) { return 270;} // avoid division by zero if ((x == 0) && (y > 0)) { return 90; } // avoid division by zero if ((x == 0) && (y == 0)) { return 0; } // points overlap, no angle phi = atan(y/x) * 180/3.14159; // calling arctan and converting radians to degree's if (x < 0) { return (phi + 180); } else return phi; } void wait() { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.get(); } int main() { float x,y; cout << "X: "; cin >> x; cout << "Y: "; cin >> y; cout << "X: " << x << " Y: " << y << " Winkel phi: " << polarangle(x,y) << " degrees" << endl; wait(); }X: 3.42
Y: 9.4
X: 3.42 Y: 9.4 Winkel phi: 70.0072 degrees
-
Also wenn ich das richtig verstanden habe, dann würde dieses Programm korrekt arbeiten:
#include <iostream> #include <cmath> using namespace std; int main(void) { int b; double winkel; double Cx, Cy; cout << "Koordinaten von C errechnen" << endl; cout << "+++++++++++++++++++++++++++" << endl; cout << "\nb: "; cin >> b; cout << "Winkel (vom Lot auf b): "; cin >> winkel; if(winkel == 0){ Cx = 0; Cy = b; } else{ Cx = floor(b*cos(90.0-winkel)); Cy = floor(b*sin(90.0-winkel)); } cout << "\nC (" << Cx << "/" << Cy << ")" << endl; return(0); }Wenn ja, dann habe ich es verstanden.
Gruß
EDIT:
Oh, habe deinen letzten Post nicht mehr mitbekommen, werde da mal reinschauen.
-
Ja, sieht sehr gut aus. Allerdings rechnet die sin- und cos-Funktion mit "radians", das sind 360° = 2*pi. Daher musst Du die "degrees" in "radians" umrechnen:
Cx = b*cos((90.0-winkel)/180*3.14159); Cy = b*sin((90.0-winkel)/180*3.14159);Vorzeichen noch beachten, wenn sich das ganze in andere Quadranten verschiebt.
Polarkoordinaten:
http://de.wikipedia.org/wiki/Polarkoordinaten
-
Das ist doch nix weiter als drehung der Koordinaten, d.h. Drehmatrix mal vektor
schauste hier.grüße
-
Erhard Henkes schrieb:
Ich gebe Dir nur ein Programm zum Überprüfen des Winkels phi:
#include <cmath> #include <limits> #include <iostream> using namespace std; float polarangle(float objx, float objy, float centx=0, float centy=0) { float x, y, phi; y = objy - centy; x = objx - centx; if ((x == 0) && (y < 0)) { return 270;} // avoid division by zero if ((x == 0) && (y > 0)) { return 90; } // avoid division by zero if ((x == 0) && (y == 0)) { return 0; } // points overlap, no angle phi = atan(y/x) * 180/3.14159; // calling arctan and converting radians to degree's if (x < 0) { return (phi + 180); } else return phi; }Hallo Erhard,
um sich das if( x== 0) oder fast 0(!?) und die anderen Fallunterscheidungen zu ersparen gibt es die Funktion
atan2( y, x );Die Konstante PI sollte man sich immer von der eingebauten Bibliothek liefern lassen. Entweder mit
const double PI = std::acos( -1.0 );oder
const double PI = 4 * std::atan( 1.0 );Gruß
Werner
-
Man kann es auch extrem kompliziert lösen.^^
Schau hier:
http://de.wikipedia.org/wiki/Skalarprodukt(cos lösen mithilfe des Taschenrechners ;))
dann brauchst du noch eine zweite Gl.
da du die Länge von c kennst, hast du noch eine Bedingung an den Vektor A, da nimmst du einfach die Länge sprich: sqrt(C1^2 + C2^2)
dann einfach mittels Elimination der Variablen beide Einträge für C bestimmen.
Diese Variante hat neben nur 5mins Rechnen auch noch den Vorteil, das sie auf jedem Vektorraum über dem du ein Skalarrpodukt definieren kannst gültig ist. Sprich, du kannst damit Relativitätstheorie und Stringtheorie betreiben, wobei das in Klasse 10 wohl etwas unüblich ist.