Polygon - Mittelpunkt und Schwerepunkt?



  • @TaucherOne sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    void forEachPolyEdge(vector<vector<double>> poly, function<void(vector<double>)> f)

    Sicher, dass du poly per value übergeben willst (gilt allgemein für alle deine Funktionen!)?

    Aber wozu überhaupt diese Funktion? Mir ist der Nutzen gerade gar nicht klar. Du sparst doch mit dieser Funktion gar nichts? (range-based-for oder std::for_each tun doch dasselbe?)

    srand(time(NULL));

    Wenn du das nutzt, dann einmalig im Programm. Aber du könntest auch die Variante mit https://en.cppreference.com/w/cpp/numeric/random anschauen. Dann brauchst du keine Rechnungen wie double rx = (double)rand() / (double)RAND_MAX * (maxx - minx) + minx; selber machen (bist du hier sicher, dass das richtige rauskommt? Passen die Grenzen? Das muss man alles nicht überlegen/verifizieren, wenn man einfach eine uniform_real_distribution nimmt (oder uniform_int_distribution, je nachdem, was man braucht)

    double getMaxDbl()
    {
        return (unsigned int)(-1);
    }
    double getMinDbl()
    {
        return -(double)(unsigned int)(-1);
    }
    

    Was sind das denn für wilde Funktionen? Das ist nicht minDbl, sondern max unsigned integer als double.
    Suchst du vielleicht nach std::numeric_limits<double>::min() (bzw ...::max())? Siehe https://en.cppreference.com/w/cpp/types/numeric_limits

    Ganz allgemein scheint noch, dass dein Poly als vector von vector irgendwie nicht sinnvoll modelliert ist. Der innerste vector soll ja Edges darstellen? Oder einen vertex? Das hat ja immer nur 2 Werte (warum dann ein vector?) Ich würde versuchen, das als class oder struct zu modellieren und nicht einen vector von vector verwenden. Der vector von vector könnte ja irgendwas sein und hat keine direkte Verbindung zu einem Polygon. Eine allereinfache Verbesserung wäre ein std::vector<Point2d>, wobei Point2d dann eine Klasse mit x und y wäre. Dein forEachPolyEdge hat mich noch viel mehr verwirrt, weil es doch ein forEachPolyVertex ist? Das macht ja nicht mit Kanten, sondern ruft die Funktion für jede Ecke auf.


  • Gesperrt

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    Aber wozu überhaupt diese Funktion? Mir ist der Nutzen gerade gar nicht klar. Du sparst doch mit dieser Funktion gar nichts?

    Oh doch. Ich brauche mir keine Gedanken um ein (sich wiederholendes) Schleifenkonstrukt und die passenden Indices machen.

    Dass nicht per Referenz aufgerufen wird, ist richtig. Daran hatte ich nicht gedacht. Danke.


  • Gesperrt

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    Der innerste vector soll ja Edges darstellen?

    Die x- und y-Komponente einer Ecke, ja.



  • @TaucherOne sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    Der innerste vector soll ja Edges darstellen?

    Die x- und y-Komponente einer Ecke, ja.

    Eine Edge ist aber eine Kante, kein Ecke. (ich kam aufgrund deines Funktionsnamens zu dieser Frage!)


  • Gesperrt

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    @TaucherOne sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    Der innerste vector soll ja Edges darstellen?

    Die x- und y-Komponente einer Ecke, ja.

    Eine Edge ist aber eine Kante, kein Ecke.

    Ja, Sie haben Edges geschrieben. Das gesamte Polygon ist durch seine Ecken, nicht Kanten/Seiten, angegeben. Quasi eine Punktemenge. Aber ich will jetzt nicht so sehr hinab in die Graphentheorie.^^

    E:

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    (ich kam aufgrund deines Funktionsnamens zu dieser Frage!)

    Sorry, der ist auch falsch gewählt. 😞


  • Gesperrt

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    Was sind das denn für wilde Funktionen? Das ist nicht minDbl, sondern max unsigned integer als double.

    Eigentlich habe ich nur einen für die meisten Fälle groß genug bzw. klein genug (magischen) Wert gesucht ... Ich seh schon, dort droht auch ein Pitfall.



  • Kann mich da @wob nur anschließen, modellier' ne vernünftige Polygon Klasse mit Point2D als Punktmenge. vector<vector<double>> ist nur durch Erklärung als Polygon zu erkennen. Wie wird denn ein Stützpunkt dargestellt, gehören jeweils zwei aufeinanderfolgende Vektorelemente zusammen und bilden einen Punkt?

    Die Funktionen forEachPolyEdge und forEachPolySite (was genau soll die können? Was hat Site mit Polygonen zu tun?) sind verwirrend (auch das wurde schon erwähnt), dafür gibt`s std::for_each (und std::transform). Zusammen mit nem vernünftigen Modell ist das auch deutlich besser lesbar.

    struct Point2D
    {
       double X = 0.0;
       double Y = 0.0;
    
       Point2D() = default;
    };
    
    struct Line2D
    {
       Point2D  Start;
       Point2D  End;
    
       Line2D() = default;
       Line2D( Point2D const& s, Point2D const& e ) : 
          Start( s ), End( e )
       {
       }
    };
    
    
    struct Polygon
    {
       std::vector<Point2D> Vertices;
    
       Polygon() = default;
    
       // Überladung für []-Operator vielleicht? vertex_count() + edge_count()
    
       Line2D edge( unsigned int index ) const
       {
          // TO DO: Test auf Gültigkeit von index nachrüsten
          return Line2D( Vertices[index], Vertices[index +1] );
       }
    };
      
    int main()
    {
       Polygon p = {...};
       
       auto UnaryOps = []( Point2D const& pt )
       {
          // tu was mit nem Punkt
       };
       std::for_each( p.Vertices,begin(), p.Vertices.end(), UnaryOps );
    };


  • @Quiche-Lorraine sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    Gute Triangulierungen sehe ich selten. Ich bin aber auch im Bereich der digitalen Geländemodelle unterwegs und so mancher Geländeschnitt oder so manche Bruchkante verändert die Vermaschung öfters negativ. In einem extremen Fall hatte ich eine Vermaschung wo auf 1% der Fläche 99% der Dreiecke waren und das völlig korrekt!

    Ich glaube ich kann mir das vorstellen: Wenn das Gelände z.B. eine grosse Ebene hat, dann kann man diese eben mit nur einem Dreieck darstellen. Ich denke hinter diesen Dreiecksnetzen steckt eine andere Motivation, nämlich (datensparsam) die Anzahl der Dreiecke zu minimieren.

    Man kann natürlich auch die grossen Dreiecke weiter unterteilen und eine möglichst gleichförmige Triangulation finden. Ich denke im Bereich (physikalischer) Simulationen dürfte es einige Verfahren geben, welche in einem Vorverarbeitungsschritt eine solche Triangulation aus vorhandenen Modellen erzeugen. Schliesslich will man Ebenen und Gebirge vielleicht nicht unbedingt unterschiedlich präzise simulieren 🙂


  • Gesperrt

    @DocShoe Dir scheint meine Antwort schlicht entgangen zu sein. Das kann mal vorkommen, aber bitte lese doch den kompletten Thread nächstes Mal, bevor du anfängst zu bellen...

    @TaucherOne sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    @wob sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    Aber wozu überhaupt diese Funktion? Mir ist der Nutzen gerade gar nicht klar. Du sparst doch mit dieser Funktion gar nichts?

    Oh doch. Ich brauche mir keine Gedanken um ein (sich wiederholendes) Schleifenkonstrukt und die passenden Indices machen.

    Dass nicht per Referenz aufgerufen wird, ist richtig. Daran hatte ich nicht gedacht. Danke.



  • @TaucherOne sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    @DocShoe Dir scheint meine Antwort schlicht entgangen zu sein.

    Mir ist in erster Linie entgangen, dass du die nächste Inkarnation von Fragender, cyborg_beta und CyborgBeta bist.

    @TaucherOne sagte in Polygon - Mittelpunkt und Schwerepunkt?:

    @DocShoe Das kann mal vorkommen, aber bitte lese doch den kompletten Thread nächstes Mal, bevor du anfängst zu bellen...

    1. Lies!, Imperativ
    2. Nein, da brauche ich nicht. Es reicht aus, wenn ich ab da lese, wo dir das erste mal empfohlen wurde, deine Daten vernünftig zu modellieren. Du brauchst obskure Funktionen, die durch ein obskures Datenmodell auftretende Probleme lösen, die du durch ein vernünftiges Datenmodell nicht hättest.

  • Gesperrt

    Ok, touché, halber Punkt für dich. 😉


Anmelden zum Antworten