Entwickler-Ecke

WinForms - PointF[]: Auf Inhalt zugreifen


noiiZeee - Fr 16.04.21 11:18
Titel: PointF[]: Auf Inhalt zugreifen
Hallo liebe Gemeinde!
Ich stecke momentan in Schwierigkeiten und zwar bearbeite ich gerade eine Aufgabe in der es darum geht, ein Dreieck zu erstellen, dieses mit einer Methode aufzurufen und damit dann zu verändern. Die Parameter der Methode "Dreieck" sind mir aber vorgeschrieben und dürfen nicht verändert werden.
Der Code sieht so aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
protected void OnPaint(PaintEventArgs e)
{            
    PointF p1 = new PointF(300.0F, 0.0F);
    PointF p2 = new PointF(0.0F, 600.0F);
    PointF p3 = new PointF(600.0F, 600.0F);

    PointF[] punkte = { p1, p2, p3 };

    Dreieck(e.Graphics, new SolidBrush(Color.Green), punkte);            
}

private void Dreieck(Graphics g, Brush farbe, PointF[] punkte)
{                       
    g.FillPolygon(farbe, punkte);            
}


Beim Starten der Anwendung bekomme ich ein grünes Dreieck so wie gewollte aber wie kann ich nun auf meine Punkte "punkte" p1, p2 und p3 in der Methode zugreifen und verändern?

Mfg


Th69 - Fr 16.04.21 12:26

Hallo,

dazu kannst du einfach per Index zugreifen, z.B.:

C#-Quelltext
1:
punkte[0] = 42F;                    

Ich verstehe aber den Sinn der Aufgabe nicht, denn eigentlich sollten bei einer reinen Zeichenmethode (wie Dreieck) ja gerade über die Parameter die Werte unverändert übernommen werden.
Sollte nicht eher in der OnPaint-Methode auf eine (von anderen Methoden) veränderliche Punkteliste zugegriffen werden (d.h. diese als Member bereitstellen)?


Ralf Jansen - Fr 16.04.21 13:02

Vielleicht genauer erklären warum du was willst, ich verstehe es auch nicht.

Was soll eine Dreieck Methode wenn sie das zu zeichnende übergeben bekommt? Würde ich 4 Punkte übergeben würde die Dreieck Methode ein Viereck zeichnen.
Möchtest du nicht vielleicht eher nur die Position im Graphics Object übergeben und möglicherweise die Größe des Dreiecks aber die nötigen Punkte in der Methode erst berechnen?


noiiZeee - Fr 16.04.21 15:36

Danke für eure Antworten. Ich soll aus dem Dreieck ein Fraktal erstellen.


Th69 - Fr 16.04.21 15:52

Meinst du so etwas wie das Sierpinski-Dreieck [https://de.wikipedia.org/wiki/Sierpinski-Dreieck]?

OK, wenn du das rekursiv zeichnest (bis zu einer bestimmten Rekursionstiefe bzw. Pixelgröße des Dreiecks), dann kannst du in der Dreieck-Methode die neuen Dreickspunkte berechnen (bedenke aber, daß du nicht die Originalparameter überschreiben solltest!).


noiiZeee - Fr 16.04.21 16:08

Ja genau so was. Wie kann ich aber jetzt in meiner Dreiecksmethode die Werte für die Berechnung des Fraktals eingeben? Wenn ich auf Wikipedia gehe steht da etwas von (x1 + x2) usw.
Damit stehe ich aber auf dem Schlauch. Kann ich I-wie sowas machen wie p1.X + p2.X oder so?
Hab mit diesen Point arrays noch nie gearbeitet und im Internet findet man auch nur schwer was dazu..

Ich danke euch für eure Hilfe
Mfg


Ralf Jansen - Fr 16.04.21 16:32

Ein Array ist ein Array.
Und ein PointF auch nur irgendeine Klasse mit Properties.
Da ist nirgendwo etwas spezielles.

Und ja die X,Y Properties eines PointF kannst du so benutzen wie die Einzelvariablen X,Y die du in den verschiedenen Lösungen, wie zum Beispiel in der Wikipedia, findest.


noiiZeee - Fr 16.04.21 16:37

Das dachte ich mir schon. Aber wie bekomme ich das in meiner Methode hin also wie ist die Syntax davon? :lol:


Ralf Jansen - Fr 16.04.21 16:47

Um das zu beantworten müßte ich wissen was du da warum zusammen rechnen willst und was am Ende herauskommen soll.
Du hattest das Codebeispiel im verlinkten Artikel von user profile iconTh69 gesehen?


Th69 - Fr 16.04.21 16:49

Du kannst die neuen Arrays genau so anlegen wie in der OnPaint-Methode

C#-Quelltext
1:
PointF[] punkte = { p1, p2, p3 };                    

nur, daß du jetzt die 3 Punkte p1, p2, p3 entsprechend der Formel aus dem übergebenen Array ermittelst (und für die 3 weiteren Dreiecke jeweils einen anderen Variablennamen anstatt punkte nimmst).

PS: @Ralf, das Codebeispiel hatte ich selber gar nicht gesehen - ist ja sogar in C#. ;-)
Nur CreateGraphics() sollte man nicht benutzen, sondern e.Graphics, aber das hat ja noiiZeee [https://entwickler-ecke.de/user_noiiZeee.html] in seinem Code richtig.


noiiZeee - Mi 21.04.21 19:33

Hey Leute! Ich stecke wieder fest... :(
Ich hab den Algorithmus soweit geschrieben aber irgendwas stimmt da nicht. Wenn ich die Tiefe in den Parametern auf 0 setze dann passt mein Dreieck. Wenn ich Tiefe = 1 mache erstellt es mir zwar das Dreieck in der Mitte aber mein "Main"-Dreieck wird gelöscht bzw. gar nicht erst aufgerufen. Hat jemand ne Idee was ich falsch gemacht habe?
Hier die Methode:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
private void SDreieck(Graphics g, Brush farbe, PointF[] punkte, int tiefe)
        {
            if (tiefe == 0)
            {
                g.FillPolygon(farbe, punkte);

            }
            else
            {
                PointF pM1 = new PointF((punkte[0].X + punkte[1].X) / 2F, (punkte[0].Y + punkte[1].Y) / 2F);
                PointF pM2 = new PointF((punkte[0].X + punkte[2].X) / 2F, (punkte[0].Y + punkte[2].Y) / 2F);
                PointF pM3 = new PointF((punkte[1].X + punkte[2].X) / 2F, (punkte[1].Y + punkte[2].Y) / 2F);

                PointF[] dreieck = { pM1, pM2, pM3 };

                SDreieck(g, farbe, dreieck, tiefe - 1);
            }
        }


zu beachten ist, dass ich die Parameter nicht ändern darf (sonst wäre ich schon längst fertig)


Th69 - Mi 21.04.21 21:02

Du mußt ja jeweils 3 Dreiecke berechnen und rekursiv aufrufen (und dafür jeweils die passenden Punkte-Arrays berechnen).

Ich habe mal aus dem Wikipedia-Artikel ein Bild im Anhang angefügt: Gegeben sind in punkte die Eckpunkte des großen Dreiecks, so mußt du daraus dann jeweils die Eckpunkte der 3 schwarzen Dreiecke berechnen.


Ralf Jansen - Mi 21.04.21 21:44

Wenn du den Algorithmus in deinem eigenen Code nicht verstehst, versuche ihn auf einem Blatt Papier nachzuvollziehen.
Denn wie user profile iconTh69 schon anmerkt jeder Schritt erzeugt drei neue Dreiecke (oder 4 aber das 4.te braucht man nicht zeichnen oder müßte in anderer Farbe gezeichnet werden) und du rufst rekursiv die Methode nur einmal auf heißt am Ende bekommst du nur 1 Dreieck nur halt um entsprechende viele Steps(bei dir tiefe) kleiner als das mit dem du angefangen hast.


Möglicherweise hilft dir mein Bild (ich habe deine Variablenbezeichner für die Punkte/Koordinaten verwendet)
Ich würde dir aber raten es selbst zu machen. Der Vorgang des Erstellens entspricht dem Algorithmus. Einmal gemacht und du weißt wie der Code auszusehen hat und auch warum.

PXL_20210421_192740772


Th69 - Mi 21.04.21 22:07

@Ralf: Kleiner Fehler in deinem Bild, es muß (natürlich) Punkte[2] (statt Punkte[3]) heißen. ;-)


Ralf Jansen - Mi 21.04.21 22:16

Mist. Ich wollte nicht noch ein Foto schießen und hatte gehofft das geht als unleserliche Sauklaue durch :lol:


noiiZeee - Fr 23.04.21 05:26

Habe es endlich hinbekommen. Danke Männer für eure Hilfe 👍🏻