Entwickler-Ecke

Multimedia / Grafik - Grafiken Zeichnen CSharp


Romano - Mo 03.12.07 12:52
Titel: Grafiken Zeichnen CSharp

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. - Mo 03.12.07 15:56

Hallo und :welcome:!

Wenn ich das richtig sehe, macht der Code folgendes (siehe Kommentare im Quelltext):

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


Romano - 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. - Mo 03.12.07 16:43

Hallo!

Der Kreis in Deinem Programm ist so definiert:

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:

C#-Quelltext
1:
struKreis k = m_kreise[i];                    


Grüße
Christian