Polygon, geometrischer Algorithmus



  • Hallo liebe Leute,

    ich habe grade ein grosses Problem, ich sitze inner Uni im C-Praktikum und schaffe folgende Aufgabe nicht:
    "Schreiben Sie ein Programm, das eine Menge von Punkten einliest, daraus den einfachen geschlossenen Pfad in Form eines Polygons konstruiert und dessen E
    Eckpunkte in der richtige Reihenfolge wieder ausgibt."

    Das einzige was ich bisher hinbekommen habe, ist die Struktur:

    #include "stdafx.h" 
    
    #define Nmax 50 
    struct point 
    { 
    int x, y; 
    
    char c; 
    }; 
    
    struct line 
    { 
    struct point p1, p2; 
    }; 
    struct point polygon [Nmax];
    

    Als Hilfe haben wir folgende Funktion bekommen:

    float floattheta(point p1, point p2){ 
       int dx, dy, ax, ay; 
       float t; 
       dx = p2.x - p1.x; ax = abs(dx); 
       dy = p2.y - p1.y; ay = abs(dy); 
       t = (ax+ay == 0) ? 0 : (float) dy / (ax+ay); 
       if (dx < 0) t = 2-t; else if (dy < 0) t = 4+t; 
       return t*90.0; 
    }
    

    Allerdings weiss ich nicht, was die Funktion abs() genau machen soll.

    Fuer jegliche Hilfe waere ich dankbar!



  • Gegenfrage: Was genau verstehst du (bzw. dein Dozent) unter "richtige Reihenfolge"?



  • wir sollen bei der kleinsten y koordinate anfangen. sind mehrere y koordinaten gleich, sollen wir die kleinste x koordinate als ersten punkt nehmen. und dann in dieser reihenfolge anschliessend wieder ausgeben.



  • Du könntest den Mittelpunkt aller Punkte berechnen, dann die Punkte nach Winkel sortiert ausgeben.



  • dafuer brauche ich aber theta() nicht oder?



  • Sabine83 schrieb:

    dafuer brauche ich aber theta() nicht oder?

    Du misst einfach für jeden Punkt die Distanz in x und y zum Mittelpunkt aller Punkte. Mit atan2(dy, dx) kannst du dann jeweils den Winkel berechnen.



  • leider kann ich das nicht in c code uebersetzen



  • atan2() bestimmt den Winkel, in dem der übergebene Punkt zum Ursprung liegt. Ich habe mir deine theta()-Funktion nicht genau angesehen, aber ich würde mal sagen, daß sie vergleichbare Werte* liefern dürfte.

    Das heißt, du benötigst nur noch einen Sortieralgorithmus, den du über deine Punktliste laufen lässt - und verwendest "theta(p[i],center)<theta(p[j],center)" als Vergleichkriterium für die Sortierung.

    * das sind keine Winkelangaben, aber für deine Zwecke reicht auch aus, wenn du daran feststellen kannst, welcher Winkel größer ist.



  • Sabine83 schrieb:

    leider kann ich das nicht in c code uebersetzen

    Du solltest dich mal mit for-loops und qsort() befassen (falls du das noch nicht kennst). Infos dazu gibt's übarall im Internet.



  • @sabine: bevor hier alle anfangen die reihenfolge der punkte zu ermitteln, bekommst du die denn überhaupt hin:

    Schreiben Sie ein Programm, das eine Menge von Punkten einliest, daraus den einfachen geschlossenen Pfad in Form eines Polygons konstruiert


Anmelden zum Antworten