Forum: PC-Programmierung .NET: 2D-Grafikelemente als Objekte?


von Ralf (Gast)


Lesenswert?

Hallo,

in Windows.Forms kann man auf dem Graphics-Objekt Linien, etc. zeichnen. 
Allerdings sind die Elemente keine Objekte, d.h. nach dem Zeichnen ist 
Schluss. Ich suche nun eine Möglichkeit, Linien, Kreise etc. als Objekte 
behandeln und z.B. auch ermitteln zu können, ob sich die einzelnen 
Objekte schneiden.
Momentan fehlt mir die Zeit mich in XAML einzuarbeiten, sonst würd ich's 
mit WPF versuchen. Ich würd gern bei Windows.Forms bleiben.

Gibt's in den weiten des Frameworks etwas, das ich übersehen habe?

Ralf

von Karl H. (kbuchegg)


Lesenswert?

Ralf schrieb:
> Hallo,
>
> in Windows.Forms kann man auf dem Graphics-Objekt Linien, etc. zeichnen.
> Allerdings sind die Elemente keine Objekte, d.h. nach dem Zeichnen ist
> Schluss. Ich suche nun eine Möglichkeit, Linien, Kreise etc. als Objekte
> behandeln und z.B. auch ermitteln zu können, ob sich die einzelnen
> Objekte schneiden.
> Momentan fehlt mir die Zeit mich in XAML einzuarbeiten, sonst würd ich's
> mit WPF versuchen. Ich würd gern bei Windows.Forms bleiben.
>
> Gibt's in den weiten des Frameworks etwas, das ich übersehen habe?

Musst du dir selbst machen.
Das ist genauso, wie ein Buchstabe kein Objekt ist, sondern erst ein 
String. Oder ein Pixel kein eigenes Objekt ist, sondern erst eine 
Sammlung von Pixel (ein Bild).

Je nachdem was man machen will, ist eine Linie für jeden was anderes und 
wird  in Form einer Datenstruktur anders dargestellt.
Hier gibt es normalerweise eine Trennung zwischen interner Datenstruktur 
und deren Darstellung. Windows (bzw. .Net) stellt dir Möglichkeiten zur 
Darstellung zur Verfügung aber um die geometrische Datenhaltung musst du 
dich selbst kümmern. Da gibts einfach zu viele unterschiedliche 
Möglichkeiten, je nachdem was man macht und was das Ziel ist.

Man könnte zwar mit Metafiles da was machen. Ich denke allerdings nicht, 
dass sich das wirklich lohnt, da groß zu investieren. Ausser für ganz 
einfache Zeichenprogramme, ist das alles zu schwach auf der Brust.

http://msdn.microsoft.com/de-de/library/system.drawing.graphics.aspx

von Ralf (Gast)


Lesenswert?

> Das ist genauso, wie ein Buchstabe kein Objekt ist, sondern erst ein
> String. Oder ein Pixel kein eigenes Objekt ist, sondern erst eine
> Sammlung von Pixel (ein Bild).
Ansichtssache. Für mich sind beides Objekte :)
Aber ich weiss was du meinst. Dadurch dass es sich bei Pixeln, Linien 
etc. um die grundlegendsten Elemente handelt bin ich davon ausgegangen 
dass diese eben auch als Objekte abgebildet wurden.

> Je nachdem was man machen will, ist eine Linie für jeden was anderes und
> wird in Form einer Datenstruktur anders dargestellt.
> Hier gibt es normalerweise eine Trennung zwischen interner Datenstruktur
> und deren Darstellung.
Du meinst ob z.B. eine Linie aus den absolut notwendigen Daten (P1/P2) 
oder mehr (z.B. Linienstärke, -farbe) besteht?

> Windows (bzw. .Net) stellt dir Möglichkeiten zur Darstellung zur Verfügung
> aber um die geometrische Datenhaltung musst du dich selbst kümmern. Da
> gibts einfach zu viele unterschiedliche Möglichkeiten, je nachdem was man
> macht und was das Ziel ist.
Auch klar, jeder braucht andere "Features" - wäre ja durch Vererbung 
kein Problem.

Im Prinzip heisst das aber, wenn jemand z.B. vektororientiert mit .NET 
zeichnen (nicht malen) will, dann muss er sich das alles selbst 
schreiben? Hätt ich nicht gedacht...

Ralf

von Sharping (Gast)


Lesenswert?

> Im Prinzip heisst das aber, wenn jemand z.B. vektororientiert mit .NET
> zeichnen (nicht malen) will, dann muss er sich das alles selbst
> schreiben? Hätt ich nicht gedacht...

Wieso musst du da was selbst schreiben? Es gibt reichlich 
Grafikbibliotheken (GDI, GDI+, Direct2D, OpenGL) die du verwenden 
kannst...

von Karl H. (kbuchegg)


Lesenswert?

Ralf schrieb:

>> Hier gibt es normalerweise eine Trennung zwischen interner Datenstruktur
>> und deren Darstellung.
> Du meinst ob z.B. eine Linie aus den absolut notwendigen Daten (P1/P2)
> oder mehr (z.B. Linienstärke, -farbe) besteht?

Zum Beispiel. Ja

Oder aber
Ob ich die Linie durch Angabe ihrer Endpunktskoordinaten angebe
Oder durch Startpunkt und Offset
Oder parameterisch in Form von y = k*x + d
Oder als Schnittgerade zweier Ebenen
Oder ...
Ist es eine 2D Linie oder reden wir überhaupt von 3D Grafik (deren 2D 
Projektion dargestellt wird).
Oder ist die Linie überhaupt eine Kante in einem Polyeder?
Welcher Polyeder? In Form eines BREP beschrieben oder parameterisch? 
Rotationskörper oder Extrusionskörper?

Du siehst schon. Man kommt da vom hundersten ins tausendste. Allen 
gemeinsam ist: Irgendwann muss eine Linie in einer bestimmten Farbe auf 
den Bildschirm gepinselt werden. Das ist dann der kleinste gemeinsame 
Nenner.

>> Windows (bzw. .Net) stellt dir Möglichkeiten zur Darstellung zur Verfügung
>> aber um die geometrische Datenhaltung musst du dich selbst kümmern. Da
>> gibts einfach zu viele unterschiedliche Möglichkeiten, je nachdem was man
>> macht und was das Ziel ist.
> Auch klar, jeder braucht andere "Features" - wäre ja durch Vererbung
> kein Problem.

Du kannst deine geometrischen Primtiva Speichern in Form von Listen. Du 
kannst aber zb auch einen Quadtree benutzen. Was ist mit Gruppierungen 
(4 Linien bilden zusammen ein Rechteck)? Soll es Layer geben? Wie 
verhalten sich Layer? etc. etc.

> Im Prinzip heisst das aber, wenn jemand z.B. vektororientiert mit .NET
> zeichnen (nicht malen) will, dann muss er sich das alles selbst
> schreiben? Hätt ich nicht gedacht...

Irgendwo wirds sicherlich auch ein fertiges Framework geben.
Ich hab meine immer selbst gemacht. Geht einfach am schnellsten und ich 
hab das was ich brauche.

Dann ist ja auch noch die Frage, in welcher Form soll das auf eine Datei 
gespeichert werden, wie kommt es ins Clipboard, etc. (Themenkreis 
Datenformate - DXF, OBJ, ...)

von Edson (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Irgendwo wirds sicherlich auch ein fertiges Framework geben.

Zum Beispiel XNA. Gibts frei zum Download.

XNA 3.1 für VS2008:

http://www.microsoft.com/en-us/download/details.aspx?id=39

XNA 4.0 ab VS2010:

http://www.microsoft.com/en-us/download/details.aspx?id=23714

von Ralf (Gast)


Lesenswert?

@Sharping:
> Wieso musst du da was selbst schreiben? Es gibt reichlich
> Grafikbibliotheken (GDI, GDI+, Direct2D, OpenGL) die du verwenden
> kannst...
GDI war doch auch mit XAML, dachte ich? Die beiden anderen werd ich 
gleich mal suchen, danke.

@Karl Heinz Buchegger:
> Du kannst deine geometrischen Primtiva Speichern in Form von Listen.
Wobei ich die Liste mit den "wichtigen" Sachen fülle? Also für ne Linie 
mit P1/P2, für ein (nicht rotiertes) Rechteck ebenfalls mit P1/P2, etc. 
Oder meintest du direkt die Geometrie abspeichern?

> Ich hab meine immer selbst gemacht. Geht einfach am schnellsten und ich
> hab das was ich brauche.
Klar, aber das von der Pike auf selbst zu machen erfordert m.E. ein 
größeres Grundwissen, oder? Ich stehe nur selten vor der Notwendigkeit 
eine GUI bzw. überhaupt ein PC-Programm erstellen zu müssen, daher 
mangelt es mir an einigen Stellen an Wissen. NET verwende ich 
hauptsächlich wegen der einfachen GUI-Erstellung, aber solche Sachen wie 
"im GAC registrieren", strong name, weak name, etc. sagen mir alles 
nichts. Wenn mir ein professioneller NET-Programmierer über meine 
Mini-Tools gucken würde kämen da sicherlich noch ein paar "du musst aber 
noch..." heraus.

> Dann ist ja auch noch die Frage, in welcher Form soll das auf eine Datei
> gespeichert werden, wie kommt es ins Clipboard, etc. (Themenkreis
> Datenformate - DXF, OBJ, ...)
Das stimmt, aber primär geht's erstmal drum, überhaupt etwas angezeigt 
zu bekommen, dann mach ich mir Gedanken drum, ob ich's speichern muss 
und wenn ja wie.

@Edson:
> Zum Beispiel XNA. Gibts frei zum Download.
Danke, ich schau's mir an.

Ralf

von Arc N. (arc)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Ralf schrieb:

> @Karl Heinz Buchegger:
>> Du kannst deine geometrischen Primtiva Speichern in Form von Listen.
> Wobei ich die Liste mit den "wichtigen" Sachen fülle? Also für ne Linie
> mit P1/P2, für ein (nicht rotiertes) Rechteck ebenfalls mit P1/P2, etc.
> Oder meintest du direkt die Geometrie abspeichern?

Ich dachte eigentlich mehr an eine Liste von Primitiva

in C++
1
class Primtiv
2
{
3
   ...
4
5
  virtual void Draw( ... );
6
};
7
8
class Line : public Primitiv
9
{
10
  ...
11
  virtual void Draw( ... )
12
  {
13
    ....
14
    DrawLine( ... );
15
  }
16
};
17
18
class Circle : public Primitiv
19
{
20
  ...
21
  virtual void Draw( ... )
22
  {
23
    DrawEllipse( .... );
24
  }
25
};
26
27
class Geometry
28
{
29
  ....
30
31
  virtual void Draw( ... )
32
  {
33
    // LIste durchgehen und alle Primitive zeichnen lassen
34
  }
35
36
  std::list< Primitiv* > geometry_;
37
};

tob dich aus und ergänze zu den Linien was du brauchst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.