Entwickler-Ecke

Basistechnologien - Zahlen Array in Point Array


ffprogramming - Mo 08.02.10 16:59
Titel: Zahlen Array in Point Array
Ich habe zwei Zahlenarrays und muss diese in ein Pointarray umwandeln.
Das eine Zahlenarray enthält die X Koordinaten, das andere die Y-Koordinaten.
1.) Jetzt weiß ich nicht wie man dieses Zahlenarray in das Pointarray umwandeln kann.
2.) Das Point Array kann doch nur aus ganzen Zahlen (1,2,3) bestehen oder sind auch Kommazahlen erlaubt(1,1 1,2...)?


danielf - Mo 08.02.10 17:10

Hallo,

es gibt zum einen die Klasse Point, welche nur integer Werte verarbeiten kann. Die Klasse PointF kann aber auch floats nehmen. Das brauchst du wahrscheinlich :D

Gruß Daniel


ffprogramming - Mo 08.02.10 17:15

Nehmen wir mal an ich habe zwei float arrays: float[] x, float[] y
Nun würde ich die gerne beide als PointF Array haben:
Wie sieht dann der Quellcode aus?

C#-Quelltext
1:
PointF[] points = new PointF[x.Length];                    

Und weiter?


Christian S. - Mo 08.02.10 17:41

Stichwort: Schleife


danielf - Mo 08.02.10 17:48

Überlege doch was du machen willst. Formuliere es in Schritte und dann implementiere diese Schritte.

Wenn es dann bei der spezifischen Umsetzung hapert, kannst du gerne nochmal im Forum fragen. Aber zumindest die Theorie sollte einleuchten... sonst wird es total schwer.

Gruß Daniel


ffprogramming - Mo 08.02.10 17:50


C#-Quelltext
1:
2:
3:
4:
5:
for (int i = 0; i < x.Length; i++)
{
point[i][0] = x[i];
point[0][i] = y[i];
}



Ich dachte an so etwas aber dann bekomme ich den Fehler:

Indizierung mit [] kann nicht auf einen Ausdruck vom Typ "System.Drawing.PointF" angewendet werden.


Christian S. - Mo 08.02.10 17:52

Schau Dir bitte mal die Eigenschaften der Point-Klasse an, dann siehst Du, wie Du die Koordinaten setzen kannst / musst.


danielf - Mo 08.02.10 17:53

Wie kommst du den auf point[i][0] ? wie ist point deklariert?

Vom Ansatz her richtig (über die SChleife der vorhanden zu iterieren und dann die Points erstellen). Die Frage ist halt wie du point instantiierst und dann nachher die Werte zuweißt. Denk daran PointF ist ein objekt und muss dementsprechend instantiiert (da kann man dann gleich die Werte aus den x/y-Array nehmen) werden.

Gruß Daniel


Christian S. - Mo 08.02.10 17:55

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Denk daran PointF ist ein objekt und muss dementsprechend instantiiert
Point und PointF sind Structs und müssen daher nicht instanziert werden.


danielf - Mo 08.02.10 18:17

Danke für den Hinweis.... und das heißt genau? Ich mein

C#-Quelltext
1:
2:
System.Drawing.PointF p;
            p.X = 4;

Meckert der Kompilier... in wie weit muss ich es dann nicht instanziiert?

Danke&Gruß
Daniel


Christian S. - Mo 08.02.10 18:40

Hm. Interessant. C# meckert da tatsächlich, in Delphi Prism funktioniert das einfach so :gruebel:


Kha - Mo 08.02.10 20:12

In C# kann ein nicht initialisiertes Struct nur benutzt werden, nachdem jedem Feld ein Wert zugewiesen wurde. Sind die private, wird das natürlich nicht so einfach ;) .
Aber zuweisbare Properties bei Structs, also Mutable Structs, sind sowieso ein Designfehler [http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil]. Einfach ignorieren und stattdessen immer über den Konstruktor gehen.


ffprogramming - Di 09.02.10 18:45

Ich komme leider immer noch nicht weiter (obwohl ich mich damit beschäftigt habe).
Es wäre nett, wenn jemand mir helfen könnte.


Christian S. - Di 09.02.10 18:49

Was hast Du denn seit Deinem letzten Posting versucht und wo kamst Du nicht weiter?


ffprogramming - Di 09.02.10 18:57

Habe auf msdn gelesen. Dort finde ich allerdings nur implementationen wie:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    PointF point1 = new PointF(50.0F, 50.0F);
    PointF point2 = new PointF(100.0F, 25.0F);
    PointF point3 = new PointF(200.0F, 5.0F);
    PointF point4 = new PointF(250.0F, 50.0F);
    PointF point5 = new PointF(300.0F, 100.0F);
    PointF point6 = new PointF(350.0F, 200.0F);
    PointF point7 = new PointF(250.0F, 250.0F);
    PointF[] curvePoints = {point1, point2, point3, point4, point5, point6, point7};


Ich habe allerdings die Punkte in einem float Array, dass zur Laufzeit erstellt wird.


Christian S. - Di 09.02.10 18:59

Aha. Du scheinst doch aber zu wissen, wie man auf ein Array zugreift. Wie man einen PointF erstellt, weißt Du ja jetzt auch. Und wo hakt es nun?


ffprogramming - Di 09.02.10 19:01

Ich bekomme es nicht in die Schleife.

C#-Quelltext
1:
2:
3:
4:
 for (int i = 0; i < xr.Length; i++)
{

}


Christian S. - Di 09.02.10 19:08

Du musst doch nur mir der Scheife die Elemente durchgehen und für jedes Element ein PointF erstellen und dem Element zu weisen.

Elementzuweisung kennst Du doch und wie man einen PointF erstellt auch. Dein Quelltext hier [http://www.c-sharp-forum.de/viewtopic.php?p=594844#594844] ist doch gar nicht so schlecht, Du hast halt nur einen "normalen" Array-Zugriff und nicht so ein "Doppelding".


ffprogramming - Di 09.02.10 19:15

Ich verstehe nicht warum

C#-Quelltext
1:
pointd[i,i] = {xr[i],yr[i]};                    

Nicht funktioniert?

Ein 2d Array erhält man ja so:

C#-Quelltext
1:
int[,] array = { { 12 }, { 34 }};                    

Erzeuge ich PointF falsch?:

C#-Quelltext
1:
PointF[,] pointd = new PointF[xr.Length , yr.Length];                    


Das Point Array soll nachher zum Zeichnen dienen. Aber so kann man glaube ich es auch nicht zeichnen:
2-Argument: kann nicht von "System.Drawing.PointF[*,*]" in "System.Drawing.Point[]" konvertiert werden.


Christian S. - Di 09.02.10 19:23

Wieso willst denn überhaupt ein 2D-Array? Das ist doch irgendwie doppelt dann, denn die Kooordinationinformation ist doch in den Punkten selber hinterlegt, da müsste doch ein 1D-Array reichen?

(Dass Du ein 2D-Array haben willst, ist mir auch irgendwie erst jetzt klar geworden)


ffprogramming - Di 09.02.10 19:29

xr[] beinhaltet die x Koordinaten
yr[] beinhaltet die y Variabeln.
Jetzt müssen die in ein Point Array:
Stimmt ein Point Array besteht ja ehe immer aus zwei Werten (x,y). (Denkfehler)


Christian S. - Di 09.02.10 19:33

Und wie man das 1D-Pointarray erstellt, hast Du selber schon geschrieben. Die Schleife hast Du. Wie man auf einzelne Elemente zugreift, weißt Du auch.

Also mal ehrlich: Versuch doch bitte mal, ein bisschen Eigeninitiative zu zeigen. Im Moment habe ich den Eindruck, Du willst so lange auf stur schalten, bis es jemand für Dich macht.


ffprogramming - Di 09.02.10 20:01

Es tut mir leid schon wieder Posten zu müssen aber ich verstehe einfach nicht, warum man nicht arrayname[Index] anwenden kann.


C#-Quelltext
1:
2:
3:
4:
5:
                for (int i = 0; i < xr.Length; i++)
                {
                    PointF ur = new PointF(xr[i], yr[i]);
                    pointd[i] = ur;
                }

Das ist Falsch. Da kommt wieder:
Indizierung mit [] kann nicht auf einen Ausdruck vom Typ "System.Drawing.PointF" angewendet werden.

Ich habe irgendetwas mit get und sonstigen gelesen verstehe es aber leider nicht.
Noch einmal entschuldigung. Ich bedanke mich auch schonmal für die Hilfe bis hierhin.


Christian S. - Di 09.02.10 20:07

Zeig mal bitte, wie Du pointd deklarierst und initialisierst. Die Fehlermeldung hört sich für mich nicht so an, als wäre das als Array deklariert.


ffprogramming - Di 09.02.10 20:10


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
PointF[] pointd = new PointF[xr.Length];

                for (int i = 0; i < xr.Length; i++)
                {
                    PointF ur = new PointF(xr[i], yr[i]);
                    pointd[i] = ur;
                }


Kha - Di 09.02.10 20:15

Dein Code stimmt so und kompiliert auch, an pointd liegt es jedenfalls nicht :nixweiss: .


ffprogramming - Di 09.02.10 20:17

Ich hätte den Kompiler mal ausführen sollen. Dann ist der Fehler weggegangen. :autsch:
Danke noch einmal.
Liebe Grüße
Filip