Laden...

Wie ermittelt man die Pixel, die C# beim Zeichnen einer Linie oder eines Splines verwendet?

Erstellt von PowerTower vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.841 Views
PowerTower Themenstarter:in
8 Beiträge seit 2010
vor 13 Jahren
Wie ermittelt man die Pixel, die C# beim Zeichnen einer Linie oder eines Splines verwendet?

Hallo,

ich möchte ein kleines Programm zum Simulieren von Strahlenverläufen durch beliebige optische Systeme schreiben.
Folgendes Problem: Wie ermittelt man genau, welche Pixel C# beim Zeichnen eines Graphikobjekts in einer Form setzt. Angenommen, man benutzt z. B. DrawLine(p, 5,5,20,27) oder Circle(...) oder Splines... Dann werden vom Programm bestimmte Pixelkooordinaten berechnet und diese ausgegeben.

Gibt es eine Möglichekeit, diese Pixel anzufragen? Wenn das Programm z. B. die Linie intern rendert, dann müssen auch irgendwo die Pixelkoordinaten berechnet werden. Genau diese Koordinaten möchte ich abfragen.

Wie geht das?

Vielen Dank schon mal und weiterhin frohes Ostereier suchen.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo PowerTower,

Wie ermittelt man genau, welche Pixel C# beim Zeichnen eines Graphikobjekts in einer Form setzt.

ich meine, die Frage hatten wir schon mal und wenn ich mich recht entsinne, war die einzige Möglichkeit, die Linie in eine Bitmap zu zeichnen und dann zu schauen, welche Pixel eingefärbt sind.

Wenn das Programm z. B. die Linie intern rendert, dann müssen auch irgendwo die Pixelkoordinaten berechnet werden.

Ja, natürlich, aber nur intern in der Methode. Es gibt keine Möglichkeit, die Koordinaten direkt abzufragen.

herbivore

32 Beiträge seit 2010
vor 13 Jahren

Hi PowerTower

Im Sinne deiner Idee würde ich dir raten, die Phsyikberechnungen (Linien etc.) von der Oberfläche selbst zu trennen und einfach einen Linienalgorithmus, eine Kreisfunktion oder sonstwas zu verwenden, das dir alle Punkte zurückliefert.

In Frage kommen würde hierfür zum Beispiel der Bresenham-Algorithmus. Dieser ist allerdings ein wenig kompliziert. Eine Linie berechnen funktioniert auch einfacher, allerdings ist dies der schnellste Weg.

lg, Emiswelt

#define struct union[

PowerTower Themenstarter:in
8 Beiträge seit 2010
vor 13 Jahren

Hmm, das kann ich mir eigentlich nicht vorstellen, daß es nicht möglich sein sollte die Koordinaten, die Windows ja selber ausrechnet, auch irgendwie abzufragen. Besonders bei den Splines wird es interessant, da ich gerne die C# eigenen Methoden dazu benutzen möchte.

Hier ist zum Beispiel eine Methode, um die Farbe eines Pixels in einer Form zu bekommen:

http://www.csharp411.com/c-getpixel-and-setpixel/

Es muß doch eine Möglichkeit geben, daß man auch irgendwie eine Art Array oder so von Windows zurückbekommt, in dem die Koordinaten des zuletzt gezeichneten Graphikobjekts drinstehen.
Kann mir nicht vorstellen, daß das nicht gehen soll.

herbivore schrieb:

Ja, natürlich, aber nur intern in der Methode. Es gibt keine Möglichkeit, die Koordinaten direkt abzufragen.

Sicher? --> Das wäre bitter.

************************************

Oder machen wir es ganz anders:

Wie simuliert man den Strahlenverlauf durch beliebige Linsen?
Ich habe da schon seit Tagen gesucht, aber habe noch keine wirklich brauchbaren Resultate gefunden, wie man es für allgemeine Linsen macht.
Klar, es gibt diese Fälle für sphärische Linsen. Da wird dann getrickst mit der einfachen Linsengleichung oder es werden die Schnittpunkte von Strahl und Kreis berechnet. Ne ne, das will ich nicht, das ist zu billig.
Ziel ist ein Programm, in dem es beliebig viele beliebig parametriesierte Linsen gibt, durch die man Lichtstrahlen schickt. (Der Einfachhalt wegen "nur" in 2D ggg)
Sieht Jemand eine Möglichkeit, daß nicht über die Pixel zu machen? Wenn ja, wie?

C
63 Beiträge seit 2010
vor 13 Jahren

Hey,

Es muß doch eine Möglichkeit geben, daß man auch irgendwie eine Art Array oder so von Windows zurückbekommt, in dem die Koordinaten des zuletzt gezeichneten Graphikobjekts drinstehen.

Ich denke das ist nicht sinnvoll; überleg mal wie viel auf deinem Bildschirm gezeichnet werden muss, da würde es schwierig das zu bekommen was du gezeichnet hast. Läuft wie gesagt Methodenintern. Das einfachst ist wohl deine eigenen Methoden für diese Zwecke zu schreiben.

es gibt diese Fälle für sphärische Linsen. Da wird dann getrickst mit der einfachen Linsengleichung oder es werden die Schnittpunkte von Strahl und Kreis berechnet. Ne ne, das will ich nicht, das ist zu billig.
Ziel ist ein Programm, in dem es beliebig viele beliebig parametriesierte Linsen gibt

Vielleicht solltest du erst einmal sphärischen Linsen versuchen. Das hab ich auch einmal gemacht. Nja war nich so berauschend ich finds nur grad nich. Dann stellt sich mir die Frage wie willst du denn deine Asphärischen Linsen beschreiben?

Mfg Campac

32 Beiträge seit 2010
vor 13 Jahren

@PowerTower

Wie Herbivore schon sagte: zeiche auf den Graphics-Context einer Bitmap und frag dann die Pixel ab. Eine Bitmap ist ja nichts anderes als ein Array.

Du solltest villeicht dieses Problem für sphärische Linsen programmiertechnisch sauber lösen, bevor du es als zu billig abtust.
Eine saubere Lösung wäre berechnen, nicht zeichnen und dann die Pixel abfragen.

Frage am Rande: Wenn du die Strahlenverläufe nicht eh schon berechnet hast, wie willst du dann überhaupt Formen zeichnen?

#define struct union[

PowerTower Themenstarter:in
8 Beiträge seit 2010
vor 13 Jahren

Die Idee ist folgende:

a) Lichtstrahl geht läuft los. Der Lichtstrahl hat Orts- und Richtungsvektor
b) Wenn Lichtstrahl auf Bildschirmrand trifft, tut sich nix
c) Wenn Lichtstrahl auf optische Fläche trifft, finden statt:
--> Brechung --> generiert neuen Lichtstrahl mit neuen Ort- und Richtungsvektoren. Der Richtungsvektor ergibt sich aus dem Brechungsgesetz und Normalen- und Tangentialvektor des Pixels des getroffenen optischen Objekts. Jeder Pixel jedes optischen Objekt wird hierzu in einem Array gespeichert. Dieses Array beinhaltet auch die Information über den dazugehörigen Tangential/Normalenvektor. Die Berechnung dieser Vektoren ergibt sich aus der jeweiligen Parameterdarstellung des optischen Objekts. x=x(t), y=y(t) {Das ist für mich kein Problem und darf als bekannt angenommen werden}

--> Reflektion --> ebenfalls neuer Lichtstrahl ... wie oben

Das ist eigentlich schon "fast alles".

Ich brauche hierzu aber die Pixelinformationen der optischen Flächen. Wenn ich ich nun eine Linse durch irgendeine Parametrisierung angebe, dann ... ja klar, dann muß ich mir die Linse ebenfalls aus Pixel aufbauen. ... hmmm, deswegen wäre es einfacher, wenn man diese Pixelinformationen (z. B. für die Splines...) aus der Methode über Windows rausbekommen würde.
Vielleicht irgendwie über unsafe code oder so?
Aber dazu habe ich bisher noch zu wenig Erfahrung mit C#. (Ich bin ja quasi ein fortgeschrittener Anfänger und sehe das hier als eine Projektaufgabe)

Es geht mir um beliebige Flächen, ob die nun irgendeinen praktischen Nutzen haben, ist vollkommen egal.
Die Parametriesierung erfolgt über {x(t),y(t)} - that's it.

Also wirklich schwierig ist das mathematisch nicht....

Es sei denn, man wollte den Strahlenverlauf berechnen. Dann muß man die Schnittpunkte und damit den Strahlenverlauf über Nullstellensuche iterativ berechnen. Das halte ich hier nicht für sinnvoll, da es mir nur auf eine "Bildschirmspielerei" ankommt.
(Ich bin zu dem Schluß gekommen, daß nun doch über iterative Schnittpunktberechnung zu machen.)

Mir fallen noch zwei Stichworte ein: Raytracing und Kollisionserkennung. Habe da in dem Zusammenhang auch schon gesucht, jedoch nix passendes dazu gefunden.

C
63 Beiträge seit 2010
vor 13 Jahren

kann man denn eine asphärische linse sauber durch eine reihe von funktionen beschreiben?

PowerTower Themenstarter:in
8 Beiträge seit 2010
vor 13 Jahren

Ja!

eine "asphärische Linse" ist alles, was nicht "sphärisch" ist.
In meinem Projekt interessieren mich irgendwelche konkreten praktisch-einschränkende Restriktionen nicht.
Das, was da auf Wikipedia steht: http://de.wikipedia.org/wiki/Linse_(Optik)#Asph.C3.A4rische_Linsen bezieht sich wahrscheinlich auf technische Beschreibungen für Ingenieure. Ich betrachte das Ganze eher aus Sicht der Differentialgeometrie und kümmere mich nicht um praktische Belange ggg
Deswegen braucht's da auch etwas im Sinne der Strahlverfolgung. Viel berechnet wird, außer dem Brechungsgesetz, nicht. Wozu auch?

Ok, man könnte auch die Schnittpunkte berechnen (Das machen vermutlich professionelle Programme zumOptikdesign und ist nicht mein Ziel). Mir reicht hier die einfache Strahlverfolgung.
Schließlich wird alles auch interaktiv sein. Man kann an beliebiger Position Lichtquellen und optische Flächen setzen. Die optischen Flächen können dynamisch verändert werden. Die Wellenlängenabhängigkeit des Brechungsindex ist auch einfach zu implementieren.

Aber dazu brauche ich einen flotten Zugang zu den gesetzten Pixeln der Objekte....

C
63 Beiträge seit 2010
vor 13 Jahren

Vielleicht erfüllt die LineDDA aus der WinAPI einen Teil deiner Probleme laut diesem Post?

PowerTower Themenstarter:in
8 Beiträge seit 2010
vor 13 Jahren

Jau, das scheint so in die Richtung zu gehen. Ich habe es noch nicht ausprobiert. Es wäre schön, wenn es so etwas auch für die Splines geben würde.