Struktogramm und Algorithmus für Bauingeniuersinformatik

Neue Frage »

Auf diesen Beitrag antworten »
Whitey Struktogramm und Algorithmus für Bauingeniuersinformatik

Meine Frage:
Hallo Freunde,

Ein guter Freund hat mich gebeten für ihn eine Aufgabe für sein Studium zu erledigen. Ich kann Java schreiben, habe es mir selbst bei gebracht. Leider kann ich mit der unten stehenden Aufgabe nichts anfangen.

"Überlegen Sie sich einen Algorithmus, mit dem der Winkel zwischen dem Kranausleger und einem beliebigen Findling auf dem Baufeld berechnet werden kann. Beachten Sie dabei eventuelle Periodeninkonsistenzen bei den Winkelfunktionen (Periode tan: ?, cos, sin: 2?). Erklären Sie diesen Algorithmus in Worten und stellen Sie Ihn in einem Struktogramm dar."

Kann mir jemand helfen?

Vielen Dank.

Meine Ideen:
Leider bisher völlig im dunkeln...
 
Auf diesen Beitrag antworten »
as_string RE: Struktogramm und Algorithmus für Bauingeniuersinformatik

Hallo!

Ich glaube, so kann Dir wahrscheinlich keiner wirklich helfen. Ist da eine Skizze mit bei?
Welche Angaben hast Du denn überhaupt? Koordinaten von Kran? Koordinaten der Findlinge? In welchem Koordinatensystem?
Um welchen Winkel geht es überhaupt? Um den, den sich der Kran inklusive Ausleger drehen sollte, um an den Findling zu kommen? Ich meine, schon die Beschreibung "der Winkel zwischen dem Kranausleger und einem beliebigen Findling" ist ja Quatsch: Der Findling ist ja an einem Punkt auf dem Boden wahrscheinlich und der Ausleger ist irgendwo waagerecht in der Luft. Wo soll da ein Winkel zwischen diesen beiden Objekten sein?

Das mit den Perioden: Winkelfunktionen sind ja im Allgemeinen periodisch, sprich der Funktionswert ist der gleiche für verschiedene Winkel. Du kannst also gerade bei den Umkehrfunktionen arcsin und so nicht sicher wissen, welcher Winkel es wirklich war. Du bekommst nur einen raus, aber es hätten ja noch andere Winkel sein können, die auf denselben Sinus-Wert kommen.
z. B. ist sin(x) = sin(180°-x); z. B. sin(60°) = sin(120°); so ist z. B. arcsin(sin(60°)) = 60°, aber auch arcsin(sin(120°)) = 60°; Du musst also noch zusätzliche Informationen nutzen, um entscheiden zu können, ob der Winkel jetzt eher größer oder kleiner 90° war z. B..

Allerdings ist das jetzt alles nur ein Beispiel. Weil ich noch nicht weiß, wie "der Input" überhaupt aussehen soll, und auch nicht, was genau das Ergebnis sein soll, kann ich auch nicht sagen, wie man es überhaupt rechnen sollte. Und dementsprechend dann auch nicht, wie man mit den Periodizitäts-Problemen von den Winkelfunktionen umgeht.

Gruß
Marco
Auf diesen Beitrag antworten »
Whitey

Ich denke xy Achse werden mit dem Schnittpunkt am Standort des Krans auf dem Baugelände abgelegt und der Findling ist beliebig platziert, dann entweder in Sektor 1,2,3 oder 4. Der Input soll wohl die Koordinate des Findlings sein und der Output der Winkel, wobei der Ausleger sich natürlich in die Richtung drehen soll, die näher am Findling dran ist.

Aber ich verzweifle daran wirklich. Es ist für mich in einem unschaffbaren Bereich.

Danke schonmal für deine Überlegungen, das kann ich alles sehr gut nachvollziehen.

Gruß,

Whitey
Auf diesen Beitrag antworten »
Whitey

Hier ein Bild.
 
Auf diesen Beitrag antworten »
eulerscheZahl

Verstehe ich das richtig, dass der Kran an (450/400) ist und du ihn so drehen willst, dass er ein Objekt von z.B. (500/50) aufnehmen kann?
[latex]\Delta x = 50, \Delta y = 350[/latex]
Dann einfach den Winkel berechnen über [latex]\varphi = \arctan\left(\frac{\Delta y}{\Delta x}\right)[/latex]
Das funktioniert für den ersten und vierten Quadranten. Ansonsten musst du eben noch umrechnen.
Auf diesen Beitrag antworten »
as_string

Ehrlich gesagt, habe ich es immer noch nicht ganz verstanden, was gesucht ist... Der Kran hat ja sicher schon eine Drehung. Soll dann berechnet werden, ob er sich "am Besten" nach links oder nach rechts dreht und um welchen Winkel dann?

Ansonsten: Das Problem beim Arctan ist ja, dass der Bruch [latex]\frac{\Delta y}{\Delta x}[/latex] sehr groß wird, wenn [latex]\Delta x[/latex] klein ist, sprich, wenn man in die Nähe ±90° kommt. Und genau bei ±90° hätte man sogar eine "Division by zero", wenn man einfach nur stur die Formel anwenden würde.
Ich könnte mir vorstellen, dass da die numerische Genauigkeit darunter leidet, wenn man die Arctan Funktion mit sehr großen Werten "füttert".

Deshalb würde ich vorschlagen, dass man immer nur bis zu 45° geht. Wenn [latex]\Delta y > \Delta x[/latex], würde ich die beiden für die Berechnung vom arctan vertauschen. Dann musst Du allerdings wieder darauf achten, dass Du den Winkel natürlich in diesem Fall "nachkorrigieren" musst.

Dann ist die Frage, ob Du den Winkel im Berech von -180° bis +180° raus bekommen möchtest oder von 0° bis 360°. Ich gehe mal von -180° bis +180° aus, weil es eigentlich eher gebräuchlich ist, würde ich sagen.

Dann können wir uns eine Tabelle machen, was wir raus bekommen würden, wenn wir einfach nur arctan(y/x) anwenden würden für x>y und arctan(x/y) für x<y:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
      soll        |         ist         |  Argument | Korrektur
   0° -    45°    |       0° -   45°    |    y/x    |   OK
  45° -    90°    |      45° -    0°    |    x/y    |   90° - alpha
  90° -   135°    |       0° -  -45°    |    x/y    |   90° - alpha
 135° -   180°    |     -45° -    0°    |    y/x    | alpha + 180°
-180° -  -135°    |       0° -   45°    |    y/x    | alpha - 180°
-135° -   -90°    |      45° -    0°    |    x/y    |  -90° - alpha
 -90° -   -45°    |       0° -  -45°    |    x/y    |  -90° - alpha
 -45° -     0°    |     -45° -    0°    |    y/x    |   OK


Falls man C oder C++ verwendet, hat man eine Funktion atan2, die das schon alles so macht. Sie nimmt gleich zwei Argumente entgegen, die y und x entsprechen. Das scheint also ein häufig auftretender Fall zu sein, wenn das gleich in die C-Standard-Bibliothek aufgenommen wurde.
Ich weiß nicht aus dem Stehgreif, wie es in anderen Programmiersprachen ist.

Ich habe mal ein kleines C++-Programmchen gemacht, das die obige Tabelle umsetzt und einige Wert-Paare durch probiert. Außerdem vergleicht es das Resultat mit dem von atan2() zur Kontrolle:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
#include <iostream>
#include <math.h>

using namespace std;

double coords2angle(double, double);

void testCoords2angle(double, double);

int main() {
    testCoords2angle( 1,  0);
    testCoords2angle( 1,  1);
    testCoords2angle( 0,  1);
    testCoords2angle(-1,  1);
    testCoords2angle(-1,  0);
    testCoords2angle(-1, -1);
    testCoords2angle( 0, -1);
    testCoords2angle( 1, -1);
    testCoords2angle(-1,  2);
    testCoords2angle(-2,  1);
    testCoords2angle(-2, -1);
    testCoords2angle(-1, -2);
    testCoords2angle( 1, -2);
    testCoords2angle( 2, -1);
}

void testCoords2angle(double x, double y) {
    cout << "x: " << x << "; y: " << y << "; Winkel: " << coords2angle(x, y) * 180/M_PI << "; sollte laut atan2() sein: " << atan2(y, x) * 180/M_PI << endl;
}

double coords2angle(double x, double y) {
    double angle;
    if(fabs(y) > fabs(x)) {
        angle = ((y > .0) ? M_PI/2 : -M_PI/2) - atan(x/y);
    }
    else {
        angle = atan(y/x);
        if(x < .0)
            if(y >= .0)
                angle += M_PI;
            else
                angle -= M_PI;
    }

    return angle;
}


Die Ausgabe ist:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
x: 1; y: 0; Winkel: 0; sollte laut atan2() sein: 0
x: 1; y: 1; Winkel: 45; sollte laut atan2() sein: 45
x: 0; y: 1; Winkel: 90; sollte laut atan2() sein: 90
x: -1; y: 1; Winkel: 135; sollte laut atan2() sein: 135
x: -1; y: 0; Winkel: 180; sollte laut atan2() sein: 180
x: -1; y: -1; Winkel: -135; sollte laut atan2() sein: -135
x: 0; y: -1; Winkel: -90; sollte laut atan2() sein: -90
x: 1; y: -1; Winkel: -45; sollte laut atan2() sein: -45
x: -1; y: 2; Winkel: 116.565; sollte laut atan2() sein: 116.565
x: -2; y: 1; Winkel: 153.435; sollte laut atan2() sein: 153.435
x: -2; y: -1; Winkel: -153.435; sollte laut atan2() sein: -153.435
x: -1; y: -2; Winkel: -116.565; sollte laut atan2() sein: -116.565
x: 1; y: -2; Winkel: -63.4349; sollte laut atan2() sein: -63.4349
x: 2; y: -1; Winkel: -26.5651; sollte laut atan2() sein: -26.5651
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »