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
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
> 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
> 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...
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, ...)
@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
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
classPrimtiv
2
{
3
...
4
5
virtualvoidDraw(...);
6
};
7
8
classLine:publicPrimitiv
9
{
10
...
11
virtualvoidDraw(...)
12
{
13
....
14
DrawLine(...);
15
}
16
};
17
18
classCircle:publicPrimitiv
19
{
20
...
21
virtualvoidDraw(...)
22
{
23
DrawEllipse(....);
24
}
25
};
26
27
classGeometry
28
{
29
....
30
31
virtualvoidDraw(...)
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.