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



BeitragVerfasst: Mo 09.01.17 14:33 
Hallo,

Ich habe einen Kreis, der die Eigenschaften X,Y,Radius,Width,Height,Kmx und Kmy hat.
X und Y stellt den oberen linken Punkt eines Rechteckes dar, das den Kreis beim Zeichnen umschließt. Von dem Punkt aus hat der Kreis (bzw. das umschließende Rechteck) die Breite "Width" und die Höhe "Height". Den Radius berechnete ich indem ich einfach den Durchmesser (Width) geteilt durch 2 nahm.

Radius-Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        public double Radius
        {
            get
            {
                return width / 2;
            }

            set
            {
                Height = value * 2;
                Width = value * 2;
            }
        }

Den Mittelpunkt des Kreises berechnete ich mit den Koordinaten X und Y. Ich addierte dann den Radius (ist ja die Hälfte des Durchmessers, also müsste es ja klappten) zu den X- und Y-Koordinaten hinzu.
ausblenden 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:
        public double Kmx
        {
            get
            {
                return X + Radius;
                //return X + width / 2;
            }

            set
            {
                //kmy = X + value;
                kmx = value;
            }
        }

        public double Kmy
        {
            get
            {
                return Y + Radius;
                //return Y + height / 2; 
            }

            set
            {
               
                //kmy = Y + value;
                kmy = value; 
            }
        }

Auch wenn ich den Code in den Kommentaren benutze, sieht es gleich aus.

Ist das richtig oder sollte man eine Kreismittelpunkt ganz anders gestalten?

Gruß

PS: Irgendwie bin ich zu blöd C#-Tags hinzuzufügen... :( Das macht man wie genau? :(

Moderiert von user profile iconTh69: C#-Tags hinzugefügt

Moderiert von user profile iconTh69: Beiträge zusammengefasst
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3355
Erhaltene Danke: 620

Win7
C++, C# (VS 2010/12/13/15)
BeitragVerfasst: Mo 09.01.17 14:54 
Hallo,

mir kommt eigenartig vor, daß dein Getter und Setter bei Kmx und Kmy nicht synchron sind (d.h. du setzt kmx, gibst aber im Getter etwas anderes zurück).

PS: Für C#-Tags einfach Code markieren und unter "Bereiche" auf das "+"-Symbol klicken oder aber per Hand
ausblenden Quelltext
1:
[cs]C# Code...[/cs]					
YK18415 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 09.01.17 15:15 
Hallo Th69,

was sollte ich denn lieber im Getter zurückgeben? Ich muss ja irgendwie sagen, wo die X-Koordinate des Mittelpunktes ist und da fiel mir nur das ein, was ich da stehen habe... :/ Entsprechend auch für die Y-Koordinate.

Und danke für die Erklärung! :)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3355
Erhaltene Danke: 620

Win7
C++, C# (VS 2010/12/13/15)
BeitragVerfasst: Mo 09.01.17 15:38 
Die Frage ist eher: soll es den Setter dann überhaupt geben und wenn ja, dann sollte doch beim Setzen und danach wieder auslesen der gesetzte Wert rauskommen, oder?
ausblenden C#-Quelltext
1:
2:
Kmx = 42;
Assert.AreEqual(Kmx, 42);
YK18415 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 09.01.17 16:13 
Ja genau, dieser Wert soll dann herauskommen.
Ich habe viel herumprobiert und meistens sieht es immer so aus (siehe Anhang). Die obere linke Ecke des Rechteckes soll der errechnete Mittelpunkt sein. Sieht ja zumindest passend aus...

Was genau meinst du mit deinem Code? Du schaust, ob die Werte gleich sind?
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3355
Erhaltene Danke: 620

Win7
C++, C# (VS 2010/12/13/15)
BeitragVerfasst: Mo 09.01.17 16:30 
Ja, das ist ein Unit Test, s.a. Creating Unit tests for your c# code
So kannst du dann deinen Code gut (und schnell) testen.

Ich würde erwarten, daß du bei einem Kreis als Grundeigenschaften MX,MY und Radius als Grundeigenschaften hast und die anderen Eigenschaften sich komplett draus berechnen (und setzen) lassen.
Bedenke aber auch das Kreis-Ellipse-Problem, insb. wenn man sowohl Width als auch Height setzen kann.
YK18415 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 09.01.17 16:42 
Also statt den Mittelpunk aus X und Y zu berechnen, meinst du, ich sollte lieber den Mittelpunkt am Anfang irgendwie berechnen und daraus dann X und Y?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3355
Erhaltene Danke: 620

Win7
C++, C# (VS 2010/12/13/15)
BeitragVerfasst: Mo 09.01.17 18:08 
Wie sehen denn die Konstruktoren dieser Klasse aus, d.h. mit welchen Werten initialisierst du einen Kreis und welche Member hat diese Klasse (bis jetzt sehe ich width und kmx / kmy - wobei du die beiden letzteren ja bisher nur setzt)?
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1041
Erhaltene Danke: 149

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 09.01.17 18:12 
Nicht ganz. Wenn man (M)x, (M)y und der Radius von Anfang an Werte zuweist, so lässt sich daraus alles andere errechnen. So ist der doppelte Radius, zu einem der Durchmesser des Kreises, sowie die Höhe und Breite des Kreises und des ihn umschließend Vierecks. Mx und My hingegen sind nur Werte, die einem sagen, wo genau sich dieses Objekt befindet/wohin es beim Zeichnen platziert werden soll.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
YK18415 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 10.01.17 08:30 
Wenn ich auf einen button klicke, habe ich diesen Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
 for (int i = 0; i < RndNumber2; i++)
            {
                int rndnumber1 = Rnd.Next(01600);
                Asteroid asteroids = new Asteroid() { X = rndnumber1, Radius = (int)numericUpDown1.Value };
                listBox1.Items.Add(asteroids);
                pictureBox1.Refresh();
            }


Y soll am Anfang 0 sein (Oben an der pictureBox). Den Radius füge ich zur Laufzeit hinzu.




@Frühlingsrolle: Also X und Y komplett weglassen und dafür kmx und kmy benutzen?
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1041
Erhaltene Danke: 149

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 10.01.17 08:43 
Kannst du weglassen, müssen aber nicht. Beide Eigenschaften können koexistieren, sofern sie bei Änderungen einander entsprechend anpassen.
Dazu eine kleine Demo:

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:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Graphics g;
        Kreis k;

        public Form1()
        {
            InitializeComponent();
            g = this.CreateGraphics();
            k = new Kreis();
            k.Radius = 25;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            k.Mittelpunkt = new Point(4040);
            k.Zeichnen(g, Color.Red);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            k.Position = new Point(4040);
            k.Zeichnen(g, Color.Blue);
        }
    }

    public class Kreis
    {
        private int _radius;
        private Point _position;
        private Point _mittelpunkt;
        
        public Kreis() { }

        public void Zeichnen(Graphics g, Color c)
        {
            using (Pen p = new Pen(c))
            {
                Rectangle r = new Rectangle(Position, new Size(Radius, Radius));
                g.DrawEllipse(p, r);
                g.DrawRectangle(p, r);
            }
        }

        public int Radius 
        {
            get { return _radius; }
            set { _radius = value; } 
        }
        // Mittelpunkt Position
        public Point Mittelpunkt
        {
            get { return _mittelpunkt; }
            set
            {
                _mittelpunkt = value;
                _position.X = _mittelpunkt.X - Radius;
                _position.Y = _mittelpunkt.Y - Radius;
            }
        }
        // Rechtecks-Position links oben
        public Point Position
        {
            get { return _position; }
            set
            {
                _position = value;
                _mittelpunkt.X = _position.X + Radius;
                _mittelpunkt.Y = _position.Y + Radius;
            }
        }
    }
}


PS an die erfahrenen Teilnehmer: Bitte keine Belehrung zu CreateGraphics(). Ist nur Mittel zum (Übrungs) Zweck. Danke :zustimm:

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)

Für diesen Beitrag haben gedankt: YK18415
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 19960
Erhaltene Danke: 1778

Win 10
C# (VS 2015)
BeitragVerfasst: Di 10.01.17 08:58 
Es macht keinen Sinn, die Information, wo der Kreis sich befindet, redundant zu speichern und dann Aufwand zu betreiben, dass auch beide Speicher synchron sind. Ich würde intern eine Information speichern und daraus beide veröffentlichten Eigenschaften berechnen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1041
Erhaltene Danke: 149

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 10.01.17 09:10 
Eine von vielen Möglichkeiten. So ist es ihm jedoch ersichtlicher, was genau passiert, Step-By-Step.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)

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



BeitragVerfasst: Di 10.01.17 09:48 
@Frühlingsrollen: Soweit verstehe ich das, nur habe ich zwei Probleme:

1. Wenn ich dem Rechteck neue Werte zuweise, dann sagt er, dass es kein Kontruktor mit zwei Argumenten gibt... Liegt das daran, dass ich schon woanders eins zeichne mit einer anderen Syntax?
2. Wenn ich die obere linke Ecke haben möchte, müsste es denn nicht lauten:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  public Point Position
        {
            get
            {
                return position;
            }

            set
            {
                position = value;
                mittelpunkt.X = position.X - (int)Radius;
                mittelpunkt.Y = position.Y - (int)Radius;
            }

?
YK18415 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 10.01.17 10:27 
Ach neee... ^^ die zweite Frage hat sich erledigt. :)
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1041
Erhaltene Danke: 149

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 10.01.17 10:36 
Gut, dann bleibt noch die Erste offen.
Von Haus aus bieten Klassen einen Parameter-losen Konstruktor an, wie in dem Beispiel.
Möchtest du sogleich Werte mitgeben, so muss ein entsprechender Konstruktor erstellt werden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
public class Kreis
{
    // Konstruktor ohne Parameter
    public Kreis() { }
    
    // Konstruktor mit Parameter
    public Kreis(int Mx, int My) 
    { 
        Mittelpunkt.X = Mx;
        Mittelpunkt.Y = My;
    }
}

// Initialisierung:
Kreis k = new Kreis();
//oder
Kreis k = new Kreis(4040);

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
YK18415 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 10.01.17 11:19 
Also ich hatte das bisher so, dass ich bei der Initialisierung in den runden Klammern nichts stehe hatte und die Werte anschließend in die geschweiften Klammern schrieb.
Ist das grundlegend falsch? Weil das hatte eig. immer geklappt.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1041
Erhaltene Danke: 149

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 10.01.17 11:38 
Nein, es ist nur eine andere Art der Darstellung, es kommt nur drauf an, wie man es eben braucht.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)

Für diesen Beitrag haben gedankt: YK18415
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 19960
Erhaltene Danke: 1778

Win 10
C# (VS 2015)
BeitragVerfasst: Di 10.01.17 12:34 
Nein, das ist nicht nur eine andere Darstellung.

Wenn ich das hier mache:
ausblenden C#-Quelltext
1:
2:
3:
MeineKlasse test = new MeineKlasse() {
  Foo = "bar";
};


ist das äquivalent zu:
ausblenden C#-Quelltext
1:
2:
MeineKlasse test = new MeineKlasse();
MeineKlasse.Foo = "bar";


Es wird weiterhin ein parameterloser Konstruktor aufgerufen, das heißt das Setzen der Property passiert nach jedem Initialisierungscode.

Wenn ich das hier mache
ausblenden C#-Quelltext
1:
MeineKlasse test = new MeineKlasse("bar");					

habe ich einen Konstruktor mit einem Parameter, der anhand dieses Parameters Initialisierungen ausführen kann.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
YK18415 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 10.01.17 16:15 
Ahhh, gut mal den Unterschied zu wissen @Christian S. :)


Wenn ich nun den Mttelpunkt habe und ich schauen möchte welchen Abstand dieser zu einem Rechteckspunkt hat, dann hilft es doch, den einen Punkt in den Koordinatenursprung zu "verschieben", richtig? Das heißt ich nehme "die Koordinaten von einem Punkt minus die Koordinaten vom anderen Punkt" und wende dann den Pythagoras an.

Woher weiß ich aber, welche Koordinaten ich von welchen abziehen muss? Ich meine, um zu schauen, ob der Kreis den oberen linken Rand eines Rechteckes berüht, ist ja noch ok. da weiß ich, wenn der kreis oberhalb des Rechteckes ist, dann muss ich Rechteck X/Y - Kreis X/Y (Mittelpunkt) rechnen.

Aber was mache ich wenn der kreis unterhalb des Rechteckes liegt?