Autor |
Beitrag |
Apuch
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Fr 16.10.09 17:54
Hallo,
Mathematica hat es, Matlab hat es, gnuplot hat es und ich will es auch;)
Für alle die, die nicht wissen was ich meine: Ein Contourplot ist eine Art Höhenkarte von z=f(x,y). Dabei werden in der xy-Ebene die Punkte gleicher Höhe verbunden. Das Ergebniss ist dann so etwas ähnliches wie das hier
Ich berechne etwas ähnliches wie auf dieser Seite. Nur sind es bei mir nicht Doppelsternsysteme sondern die magnetische Flussdichte bei Stromdurchflossenen Leitern. Der Funktionale Zusammenhang ist zunächst der selbe
Im 2D-Fall (Stromleiter durchstößt die Ebene) fällt die Flussdichte mit 1/r (r = Abstand Raumpunkt <-> Leiter). In der Leiternähe (r_min) wird auf eine andere Näherung umgesattelt. Der Übergang ist stetig, aber nicht stetig Differenzierbar. Das ganzte soll später noch auf 3D erweitert werden (beliebige Lage von Leitersegmenten in 3D, Contour in 2D als Schnittebene).
Ich kann für beliebige Punkte die Flussdichte `relativ' einfach berechnen (Superposition sei dank, aber immer noch Rechenaufwändig). In 3D wird das nicht besser. Der Algo sollte also mit möglichst wenigen, frei wählbaren Datenpunkten auskommen.
Hat jemannd einen magischen Link zur Hand, wo es um eine solche Problematik geht oder kann mir ein paar Schlagworte an den Kopf werfen?
MfG
_________________ DasLebenIstZuKurzFürWhitespaces!
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Fr 16.10.09 20:44
Hallo,
IL-Numerics hat es auch und das kann mit C# verwendet werden. Das ist einfacher als selbst den Algo für den Countor-Plot zu implementieren.
Zitat: | Der Algo sollte also mit möglichst wenigen, frei wählbaren Datenpunkten auskommen. |
Implementiert wird das i.d.R. so dass die Daten bereits vorliegen. Ob sich die Algorithme die dafür existieren auf Live-Berechnung umstellen lassen weiß ich nicht.
Mathematisch korrekt werden die Isolinien durch die Level-Set Methode berechnet. Dies führt zu einer partiellen Differentialgleichung welche die Aufgabe auch nicht erleichtert
Daher wird in der Praxis der Countour-Plot mit Hilfe von Dreiecken erstellt. Damit ich nicht beschreiben muss wie es geht -> siehe CONREC - A countouring subroutine. Dort gibts auch Codes \{C#} aber es sollte somit kein Problem sein.
mfG Günther
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 17.10.09 13:26
Wenn du das selbst machen willst: Ich könnte mir vorstellen, dass NURBS da helfen: de.wikipedia.org/wik...rm_Rational_B-Spline
Die Farben kannst du dann ja einfach berechnen, wenn du nur Anfangs- und Endfarbe hast. Ansonsten könnten da auch Splines helfen (oder zur not auch eine 'lineare Verbindung' der Farbwerte).
EDIT: OK, NURBS sind doch nicht passend. Aber man wird trotzdem mit Splines weiterkommen. Skizze kommt gleich.
EDIT: Und da die R, G, und B Werte, die du ja vorher schon für die gegebenen Werte eintragen kannst, auch nur Höhen repräsentieren, kannst du auch hinterher horizontal und dann vertikal (oder andersherum) die Zwischentöne berechnen, indem du virtuell Splines dadurch legst.
EDIT3: Bin gerade am Überlegen, ob das nicht auch ohne Splines, sondern mit einfachen Bézierkurven geht. Bzw. geht auf jeden Fall, aber die Frage ist, ob es schön aussieht.
EDIT4: Sieht gar nicht mal so schlecht aus. Wenn man faul ist, kann man dazu sogar die Canvas-Methoden missbrauchen:

Einloggen, um Attachments anzusehen!
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Sa 17.10.09 14:22
Hallo,
wie erstellst du daraus einen Contour-Plot?
BTW: Ich glaube bikubische Interpolation liefert ausreichend gute Ergebnisse und ist weniger aufwändig als Splineinterpolation. Die meisten Visualisierungstool verwenden auch "nur" bikubisch
mfG Günther
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 17.10.09 16:16
Wie man das interpoliert, sei mal dahin gestellt. Ich habe mir das so gedacht, dass man erstmal die Höhenwerte entlang einer Achse interpoliert. Dann hat man zwischenpunkte. Das kann man dann auch noch entlang der anderen Achse machen (unter Verwendung der neu-gewonnenen Punkte) und man hat die Punkte dazwischen.
Ich weiß nicht, wie vielen es aufgefallen ist, dass meine erste Grafik schief war. Bei der zweiten habe ich dann einfach Bézierkurven genommen, Kontrollpunkte (ich glaube, so hießen die  ) hab ich dann einfach dazugemogelt, und zwar zwischen zwei Punkten jeweils zwei gleichmäßig verteilt, so wie unten dargestellt. Wenn man Lust hat, kann man aber auch noch die Regressionsgerade "zeichnen" und "parrallel-verschieben" (natürlich nur gedacht) und dass auf die Kontrollpunkte übertragen. Das wäre dann etwas realistischer.
Ich mache schnell ein Programm dazu.
EDIT: OK, so schnell geht es wohl doch nicht. Das heißt, es könnte etwas länger dauern. Hätte ich Canvas missbraucht, wäre ich längst fertig, aber so dauert es wohl etwas länger. Das Konzept ist aber fertig.
Nochmal zur Erklärung: Rote Flächen: Entlang einer Achse werden die Punkte interpoliert. Dadurch gewinnt man neue Punkte (blau und rot), die entlang der anderen Achse interpoliert werden können. Eine Höhe wandelt man beispielsweise direkt in einen Farbwert (R ~ h, G = 0, B ~ [1 - h]) um. Der muss dann nur noch abgestuft werden. Das sollte das geringste Problem sein.
EDIT: Und was spricht dagegen, einfach sowas wie einen Weichzeichner zu implementieren? Das würde schnell programmiert sein, würde schnell arbeiten und würde imho brauchbare Ergebnisse liefern. Bevor ich mich meinen Bézierkurven wieder zuwende, versuche ich erstmal das.
OK, das dauert auch ganz schön lange... Eigentlich für meinen PC unzumutbar. Entfällt also.
Einloggen, um Attachments anzusehen!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Sa 17.10.09 19:47
Hast du dir das hier mal angeguckt? mysite.verizon.net/~vze2vrva/thesis.html
Basiert wohl hauptsächlich auf einer verbesserten Interpolation und variiert die Zellengröße 
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Sa 17.10.09 19:50
Hallo,
das ist schön und interessant was du da machst - hat aber mit eine Contour-Plot nichts zu tun (oder ich übersehe etwas).
Ein Contour-Plot stellt Isolinien dar, und somit sind dies Punkte (x,y) für welche der Funktionswert z = f(x,y) konstant ist -> z = c = f(x,y). Das ist eine implizite Darstellung und die lässt sich allgemein nicht geschlossen lösen.
Bezierkurven haben damit nichts zu tun.
mfG Günther
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 18.10.09 11:51
Dabei ging es auch nur um die Berechnung der Zwischenwerte. Wenn man alle Werte hat (also jedem Pixel einen Höhenwert zuordnen kann), kann man das direkt in eine Farbe umrechnen, welche dann abgestuft wird. Das sollte ziemlich genau das sein, was ein Contour-Plot ist.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function CalculateColor(Altitude, MaxAltitude: Single; Steps: Byte): TColor; var portion: Single; begin portion := Altitude / MaxAltitude; Result := RGB( trunc(altitude * 255 / Steps) * Steps, 0, trunc((1 - altitude) * 255 / Steps) * Steps ); end; |
So wie ich das verstanden habe, war aber das Problem, an die Zwischenwerte zu kommen:
Zitat: | Der Algo sollte also mit möglichst wenigen, frei wählbaren Datenpunkten auskommen. |
Da wären sowohl Splines als auch Bézierkurven als auch irgendein Interpolationsalgorithmus eine Möglichkeit.
Um letztendlich die Konturen zu haben, kann man auch einfach, wie beschrieben, jedes Pixel auf Gleichheit mit seinen Nachbarpixeln prüfen und, falls ein Pixel aus der Reihe tanzt, wird es schwarz gefärbt.
Zusammenfassend: Die Bézierkurven waren nur zur Interpolation gedacht! Und auch ein Weichzeichner sollte prinzipiell nichts anderes machen.
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: So 18.10.09 13:16
Hm ich glaube eigentlich ist nur nach einer Möglichkeit gesucht, darzustellen an welchen Stellen die Flussdichte 0.1H beträgt, wo 0.2H, etc. pp...
Mal eine Idee, keine Ahnung ob das hinhaut:
Wenn man es schafft einen Punkt dieser Höhenlinie zu erwischen, könnte man dann den Gradienten berechnen und in die Richtung gehen, wo der 0 ist?
Was für Daten stehen eigentlich zur Verfügung? Die Position des Leiters (bzw. der Leiter) und der jeweilige Strom dadurch?
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: So 18.10.09 23:52
Zitat: | Wenn man es schafft einen Punkt dieser Höhenlinie zu erwischen, könnte man dann den Gradienten berechnen und in die Richtung gehen, wo der 0 ist? |
Das wäre ja das Prinzip der Level-Set-Methode welche dann zu einer partiellen Differentialgleichung führt. Allerdings wird in die Richtung gegangen die Normal auf den Gradienten steht -> dort ist keine Änderung des Funktionswerts.
mfG Günther
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: Mo 19.10.09 12:32
gfoidl hat folgendes geschrieben : |
Das wäre ja das Prinzip der Level-Set-Methode welche dann zu einer partiellen Differentialgleichung führt. Allerdings wird in die Richtung gegangen die Normal auf den Gradienten steht -> dort ist keine Änderung des Funktionswerts.
mfG Günther |
Stimmt
Wir haben also eine Funktion
f: QxQ -> Q, f(x, y) = |H(x, y)| oder sowas, oder?
Dann entsprechen die Höhenlinien ja den Schnitten zwischen der Funktion und einer verschobenen x-y-Ebene, bzw. den Nullstellen der Funktionen
f_k (x, y) = f(x, y) - k , k € {0H, 0,1H, 0,2H, ...}
Und die ließen sich dann über Newton finden?
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Mo 19.10.09 18:07
Zitat: | Dann entsprechen die Höhenlinien ja den Schnitten zwischen der Funktion und einer verschobenen x-y-Ebene, bzw. den Nullstellen der Funktionen |
Das mit der verschobenen x-y-Ebene stimmt, aber welche Nullstellen von welcher Funktion? Und vor allem welcher Newton (es gibt ja viele Verfahren die mit Newton beginnen).
Einfaches Beispiel bei dem als Funktion ein ellyptisches Paraboloid verwendet wird. z := f(x,y) = x²+y²
(Bild angehängt).
Die Höhenlinien für den Contour-Plot ergeben sich somit zu:
c = f(x,y) = x²+y² | c € R+ (in diesem Fall für eine reelle Abbildung ist nur R+ interessant)
Es ist also eine implizite Darstellung einer Funktion und diese muss in die explizite Darstellung übergeführt werden. Für dieses Beispiel einfach: y = +- sqrt(x)
Im allgemeinem Fall aber nicht so einfach durchführbar.
Daher verwenden (fast) alle Algorithmen eine Approximation der Funktion wie dies Links in diesem Thema bereits zeigen.
mfG Günther
Einloggen, um Attachments anzusehen!
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Di 20.10.09 13:50
Interessant wäre auch mal wieder was vom Fragesteller zu hören...so was er davon hält und ob wir auf dem richtigen Weg sind, oder er was anderes gemeint hat.
mfG Günther
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Apuch 
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Do 29.10.09 03:12
Okay, jetzt hab ich ein schlechtes Gewissen.
Viele Antworten mit viel Inhalt und ich hab mich nicht gemeldet. 'tschuldigung an alle, die sich gemeldet haben. Die letzten Tage war es mir leider nicht möglich, hier vorbei zu schauen (Gründe.. lassen wir mal lieber). Morgen/ Heute werde ich mir die Antworten genauer Ansehen und kann direkt Antworten. 2:00 Morgens ist dann aber doch zu spät für ein solches Thema.
Bis morgen und sry nochmal an alle.
MfG
_________________ DasLebenIstZuKurzFürWhitespaces!
|
|
Apuch 
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Fr 30.10.09 17:27
Nochmal 'tschuldigung das ich mich so lange nicht gemeldet habe:?
Etwas mehr zum eigentlichen Problem: im vorliegenden Fall handelt es sich um N unendlich lange, zueinander parallele Leiter. Es wird eine Ebene orthogonal zu den Leitern als Darstellungsebene eingeführt.
Die Flussdichte B ergibt sich allgemein aus
B = int ( I dL x r / ||r||^2 ) [Vektor!]
(Biot Savart, r -> Abstand betrachteter Punkt <-> Leiter). Im 2D-Fall geht das ganze über in:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| H_x := 0; H_y := 0; for i in Leiteranzahl do begin r := P - P_L[i] h := Konstante / r^2 H_x := h * r_y H_y := h * r_x end; H := sqrt(H_x^2 + H_y^2); |
Das Magnetfeld entsteht also aus der Überlagerung mehrerer Magnetfelder. Interessant ist nicht der Vektor selbst sondern dessen Betrag. Das Feld ist so also stetig und unendlich of stetig differenzierbar. In der Nähe des Leiters (r < r_min) wird eine andere Näherung verwendet (bzw. ist umschaltbar):
- Equal (Setze r := r_min)
- Proximity On ( h := r / r_min^2)
An der stelle r = r_min ist die Funktion also immer noch stetig aber nicht mehr stetig differenzierbar.
Das ganze wird später auf den 3D-Fall erweitert (Leitersegmente im Raum und eine Schnittebene). Die Berechnung wird komplexer, die Vorraussetzungen sind jedoch identisch.
@ Jakob_Ullmann : Splines halte ich persönlich für übertrieben. Bikubischie Interpolation läuft auf lineare Gleichungen hinaus, bei Splines sind es in der Regel wurzeln oder schlimmeres.. dürfte ziemlich der Overkill sein
btw: Mit was machst du die Grafiken? Sieht getext aus.. PSTricks?, Tikz?
@ jfheins : Das sieht mal interessant aus. Werde ich mir mal genauer zur Gemüte führen
@ Thorsten83 :
Zitat: |
Hm ich glaube eigentlich ist nur nach einer Möglichkeit gesucht, darzustellen an welchen Stellen die Flussdichte 0.1H beträgt, wo 0.2H, etc. pp...
Mal eine Idee, keine Ahnung ob das hinhaut:
Wenn man es schafft einen Punkt dieser Höhenlinie zu erwischen, könnte man dann den Gradienten berechnen und in die Richtung gehen, wo der 0 ist?
Was für Daten stehen eigentlich zur Verfügung? Die Position des Leiters (bzw. der Leiter) und der jeweilige Strom dadurch?
|
Es geht um eine ansprechende, visuelle Darstellung der Kurven H(x,y) = c. Mit numerischer Integration kann man da sicher auch was machen. Der Aufwand wird aber vergleichsweise hoch sein, da nach jeden Rechenschritt die Position korrigiert werden muss
Zur Verfügung steht:
- Position der Leiter (x,y)
- der Strom I (100A .. 10kA)
- Phase (Jepp, Wechselstrom. Ändert aber nichts an der Theorie/ nichts wesentliches an der Berechnung)
Ein Lösen mittels numerischer Lösungsverfahren ist sicher auch möglich ( B(x,y) = c mit verschiedenen Startpunkten x0, y0). Läuft auf das selbe hinaus wie mit dem Gradienten -> extremer Aufwand.
Im Prinzip kommt es auf eine " ansprechende, nicht irreführende" Darstellung an. Übermäßige Exaktheit bringt in der Regel nix. Literatur hatte ich auch schon gesucht (Uni-Bibo). Findet sich aber kaum was oder mir sind nicht die richtigen Schlüsselwörter eingefallen. Ich werde mich mal näher mit der Thesis beschäftigen.. wird sicher was sinnvolles abfallen.
MfG
_________________ DasLebenIstZuKurzFürWhitespaces!
|
|
|