Autor Beitrag
noiiZeee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 16.04.21 11:18 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 16.04.21 12:26 
Hallo,

dazu kannst du einfach per Index zugreifen, z.B.:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 16.04.21 15:36 
Danke für eure Antworten. Ich soll aus dem Dreieck ein Fraktal erstellen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 16.04.21 15:52 
Meinst du so etwas wie das 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!).

Für diesen Beitrag haben gedankt: noiiZeee
noiiZeee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 16.04.21 16:49 
Du kannst die neuen Arrays genau so anlegen wie in der OnPaint-Methode
ausblenden 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 in seinem Code richtig.
noiiZeee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: noiiZeee
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: noiiZeee
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 23.04.21 05:26 
Habe es endlich hinbekommen. Danke Männer für eure Hilfe 👍🏻