Autor Beitrag
Romano
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 03.12.07 12:52 
ausblenden volle Höhe C#-Quelltext
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:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Kombinationsübung_Aufgabe1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //ButtonClick
        private void cmdFarbe_Click(object sender, EventArgs e)
        {
            ColorDialog cdlg = new ColorDialog();
            if (DialogResult.OK == cdlg.ShowDialog())
                lblFarbe.BackColor = cdlg.Color;
        }
        //Die eigene Struktur, welche die zu speichernden Daten eines Kreises repräsentiert
        struct struKreis
        {
            public int x;               //X-Wert des MittelPunktes
            public int y;               //Y-Wert des MittelPunktes
            public int Durchmesser;     //Durchmesser des Kreises
            public Color farbe;         //Farbe des Kreises
        }

        //Dynamisches Datenfeld, das Variablen der Struktur struKreis aufnehmen kann
        List<struKreis> m_kreise = new List<struKreis>();

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {

                struKreis aktkreis; //= new struKreis();
                aktkreis.x = e.X;
                aktkreis.y = e.Y;
                aktkreis.farbe = lblFarbe.BackColor;  //Hintergrundfarbe des Labels als Kreisfarbe verwenden 
                Random r = new Random();
                aktkreis.Durchmesser = r.Next(100);     //Zufallswert der kleiner als 100 ist
                m_kreise.Add(aktkreis);
            }
--------------------------------------------------------------
            else if (e.Button == MouseButtons.Right)
            {
                for (int i = 0; i < m_kreise.Count; i++)
                {
                    struKreis k = m_kreise[i];
                    int dx = Math.Abs(e.X - k.x);

                    int dy = Math.Abs(e.Y - k.y);
                    double Abstand = Math.Sqrt(dx * dx + dy * dy);
                    if (k.Durchmesser / 2 >= Abstand)
                    {
                        m_kreise.RemoveAt(i);
                        i--;
-----------------------------------------------------------------
                    }
                }
            }
            this.Invalidate(); //Veranlasst das Neuzeichnen
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
            for (int i = 0; i < m_kreise.Count; i++)
            {
                struKreis k = m_kreise[i];
                Pen myPen = new Pen(k.farbe);
                g.DrawEllipse(myPen, k.x - k.Durchmesser / 2, k.y - k.Durchmesser / 2, k.Durchmesser, k.Durchmesser);
            }
        }
    }
}

Kann mir jemand den Code erklären der zwischen der gestrichelten Linie ist. Ich kapier den einfach nicht!

Thx

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Allgemeine .NET-Fragen verschoben am Mo 03.12.2007 um 14:02
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 03.12.07 15:56 
Hallo und :welcome:!

Wenn ich das richtig sehe, macht der Code folgendes (siehe Kommentare im Quelltext):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
if (e.Button == MouseButtons.Right) //rechte Maustaste gedrückt?
            {
                for (int i = 0; i < m_kreise.Count; i++) //alle Kreise durchgehen
                {
                    struKreis k = m_kreise[i]; //i-ten Kreis in Variabel schreiben, wohl um weniger zu tippen ;-)
                    int dx = Math.Abs(e.X - k.x); //e.X ist die x-Koordinate wo geklickt wurde, k.x der Mittelpunkt des Kreises
                                                  //dx ist dann der Abstand in x-Richtung zwischen Mittelpunkt und "Klickpunkt"

                    int dy = Math.Abs(e.Y - k.y); //dasselbe für y
                    double Abstand = Math.Sqrt(dx * dx + dy * dy); //"richtiger" Abstand ("Luftlinie") zwischen Mittelpunkt und "Klickpunkt"
                    if (k.Durchmesser / 2 >= Abstand) //ist der Abstand kleiner als der Radius (= Durchmesser / 2),
                                                      //dann wurde IN den Kreis geklickt
                    {
                        m_kreise.RemoveAt(i); //es wurde in den Kreis geklickt, entferne ihn aus der Liste
                        i--; //die anderen Kreise rutschen auf, also müssen wir die Schleife um 1 zurückstellen
                             //(kann man sich übrigens sparen, wenn man die Schleife rückwärts laufen lässt)

                    }
                }
            }


Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Romano Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 03.12.07 16:38 
Titel: thx
Danke vielmals, dass du mir gholfen hast!

Eine Frage noch, warum ist k.x der Mittelpunkt des Kreises?

Danke
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 03.12.07 16:43 
Hallo!

Der Kreis in Deinem Programm ist so definiert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        //Die eigene Struktur, welche die zu speichernden Daten eines Kreises repräsentiert
        struct struKreis
        {
            public int x;               //X-Wert des MittelPunktes
            public int y;               //Y-Wert des MittelPunktes
            public int Durchmesser;     //Durchmesser des Kreises
            public Color farbe;         //Farbe des Kreises
        }

Die Kommentare sagen ja schon, dass x,y der Mittelpunkt ist. Genauer hätte es bei mir wohl heissen müssen, dass k.x die x-Koordinate des Mittelpunktes ist.

Und direkt in der ersten Zeile der Schleife wird ja k der i-te Kreis zugewiesen:
ausblenden C#-Quelltext
1:
struKreis k = m_kreise[i];					


Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".