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.





  • 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 );
    

    (siehe auch hier).

    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.


Anmelden zum Antworten