Mathematische Funktion (3D) als hochauflösendes Bild rendern

martinibook

martinibook

Aktives Mitglied
Thread Starter
Dabei seit
20.08.2005
Beiträge
8.730
Reaktionspunkte
350
Hallo,

Ich habe eine schöne mathematische Formel, die ich gerne als hochauflösendes Bild, min. 1280*1024, gerendert hätte. Ich habe es schon mit dem Grapher ausprobiert, dieser gibt bei 1200 dpi eine 200mb Tiff-Datei raus, allerdings ist die bei 100% total pixelig, also hätte man schon 10x gezoomt.

Liegt das am Programm oder einfach an der Fließkommagenauigkeit eines G4 Prozessors?

Kann ich ein solches Bild vielleicht besser mit Maple erstellen?

Martin
 
hast du schonmal LaTeXIT probiert oder ist es komplett verkehrt für deine Ansprüche?
 
mir fällt jetzt auch nur was TeX-basiertes ein. Matlab kann beispielsweise auch TeX rendern, aber, man kommt eigentlich nicht an das Endergebnis müsste also via screenshot sich das Teil zusammenbasteln ran...

Keine Ahnung woran das geschilderte Problem liegt, aber, irgendwas mit float klingt immer gut...
 
also man kann via LaTeXIT die "Ergebnisse" als PDF exportieren...
 
Ich hätte gerne die Formel aus Bild, PDF ist ja kein wirkliches Pixel-Bild in dem Sinne.

Im Grapher lässt sich das auch überhaupt nicht Zoomen, das finde ich auch net so doll.
 
octave oder gnuplot

Wenn du schöne Graphen haben möchtest versuch es einmal mit gnuplot oder octave (opensource matlab clone).

Beide benutzen die selbe Engine zum rendern der Graphen und bieten die möglichkeit zum Export in eps und pdf - also als Vektorgraphiken die du beliebieg vergrößern kannst.

Für beides musst du AQUATERM installieren
 
also, wenn es "nur" um die Terme an sich geht, wird man wohl zu Tex greifen müssen.

Der AdobeReader übernimmt bei pdf ja das rendern für Dich. Das Pixelbild würde man beim screenshot (gibts da kein deutsches Wort dafür??) bekommen...
 
martinibook schrieb:
Ich hätte gerne die Formel aus Bild, PDF ist ja kein wirkliches Pixel-Bild in dem Sinne.

Im Grapher lässt sich das auch überhaupt nicht Zoomen, das finde ich auch net so doll.
Du kannst aber nur bei gleichbleibender Qualität zoomen wenn du ein Vektorformat nimmst, pdf eben. Das ist logisch, dass tiffs beim Zoomen verpixeln, ist ja auch ein Bitmapformat.
 
Solltest du ein wenig Programmieren können und diech vielleicht ein bißchen mit Blender auskennen, kannst du das mit Blender machen. Dann kannst du Licht, Farben und Textur setzen wie du willst und es in fast jeder Auflösung rendern.

(Anhang ist nocht schön, ging aber schnell) EDIT: Die Funktion sollte nat. eigentlich z = sin(x) * cos(y) heissen :rolleyes:
 

Anhänge

  • test.jpg
    test.jpg
    13,9 KB · Aufrufe: 125
Zuletzt bearbeitet:
Okay, um das Missverständnis aufzuräumen: Es geht um den Graphen, nicht um den Term. Für den Term ist LaTeX wirklich das richtige.

Ich habe es jetzt mit Maple versucht, ist auch was recht nettes bei rausgekommen, allerdings ist das noch nicht so "glatt", wie ich es mit vorgestellt habe.

Martin
 

Anhänge

  • Welle.jpg
    Welle.jpg
    40 KB · Aufrufe: 121
ok, das Aliasing bei den Kanten macht auch Matlab. Die Kanten lassen sich allerdings nachher glätten. Wenn man nach der Kantenglättung verkleinert, hat man trotzdem ein scharfes Bild:

matlab.jpg
 
Bin ja immer noch für Blender :nervi: :D

EDIT: Farbverlauf verbessert (türkis und gelb hinzu) und mal noch ein Wireframe um die Dichte der Daten darzustellen.

EDIT: Zur Info:
Die Daten für die Form kommen aus einem kleinen Pythonskript das die Daten als Rohdaten einfach in ein ASCII-File rausschreibt - pro Zeile ein Viereck. In diesem Beispiel ist das file 14MB groß, da ich eine Schrittweite von 0.02 gewählt habe während x und y von -3 bis +3 laufen. So bekommt man eine glatte Oberfläche mit denke ich hinreichend genauer Annäherung an den Graphen. Das File kann man dann in Blender importieren und damit machen was man will. Hier ist einfach ne kleine Farbverlauftextur drauf. Theoretisch kann man das Skript auch so schreiben, daß es in Blender läuft und sofort das Objekt erzeugt, aber da weiß ich nicht genau wie's geht.

Nochmaledit: Hier mal noch das Skript
Code:
import math

def zValue(x, y):
    #return math.sin(x) * math.cos(y)
    r = math.sqrt(x * x + y * y)
    a = math.sin(x * x + 3 * y * y) / ( 0.1 + r * r)
    b = (x * x + 5 * y * y)
    c = math.exp(1 - r * r) / 2
    return a + b * c
    

def doPoint(x, y):
    return [x, y, zValue(x, y)]


def generate(outFile, xStart, xWidth, yStart, yWidth, xStep, yStep):
    
    xCount = int(xWidth / xStep)
    yCount = int(yWidth / yStep)
    
    for xPos in range(1, xCount + 1):
        for yPos in range(1, yCount + 1):
            p1 = doPoint(xStart + (xPos - 1) * xStep, yStart + (yPos - 1) * yStep)
            p2 = doPoint(xStart + (xPos - 1) * xStep, yStart + yPos * yStep)
            p3 = doPoint(xStart + xPos * xStep, yStart + yPos * yStep)
            p4 = doPoint(xStart + xPos * xStep, yStart + (yPos - 1) * yStep)
            temp = "%.10f %.10f %.10f %.10f %.10f %.10f %.10f %.10f %.10f %.10f %.10f %.10f\n" % (p1[0], p1[1], p1[2], p2[0], p2[1], p2[2], p3[0], p3[1], p3[2], p4[0], p4[1], p4[2])

            outFile.write(temp)
            
outFile = open("test.raw", "w")
generate(outFile, -3.0, 6.0, -3.0, 6.0, 0.02, 0.02)
outFile.close()
 

Anhänge

  • testw.jpg
    testw.jpg
    37,1 KB · Aufrufe: 104
  • test.jpg
    test.jpg
    24,9 KB · Aufrufe: 102
Zuletzt bearbeitet:
Blender ist sehr lustig! Schade, dass ich mich damit überhaupt nicht auskenne...
 
Schreib doch mal den Term auf um den es geht. Dann kann ich ja mal was machen.
 
Es geht um:

Matlab schrieb:
-0.10e2 * sin(-sqrt(x ^ 2 + y ^ 2) + p) * (x ^ 2 + y ^ 2) ^ (-0.1e1 / 0.2e1);
C++ schrieb:
-0.10e2 * sin(-sqrt(x * x + y * y) + p) * pow(x * x + y * y, -0.1e1 / 0.2e1);
Java schrieb:
-0.10e2 * Math.sin(-Math.sqrt(x * x + y * y) + p) * Math.pow(x * x + y * y, -0.1e1 / 0.2e1);
LaTeX schrieb:
-10\,{\frac {\sin \left( -\sqrt {{x}^{2}+{y}^{2}}+p \right) }{\sqrt {{x}^{2}+{y}^{2}}}}

Wenn es geht in Wasseroptik, oben etwas heller als unten. Auflösung wäre perfekt mit 1280*1024 und 1024*768.

Martin
 

Anhänge

  • formel.png
    formel.png
    2,4 KB · Aufrufe: 110
Wie groß ist p?
 
P habe ich in Maple eingefügt, damit die Welle schwingt, also im Bereich zwischen 0 und 2*Pi. Aber p sollte für ein stehendes Bild 0 sein, also es fällt weg.
 
Zeig mal einen Malpescreenshot um zuzeigen, was von dem Graphen du sehen willst und gib mir die Bereiche für x und y.
 
Für X und Y jeweils -5 bis 20, die höchste Spitze steht also in der Ecke.

Einmal gerne so in Wasseroptik mit passendem Licht, ich habe noch nicht herausgefunden, wie ich das in Maple setzen kann.

Und einmal so in technisch-mathematischer Optik, auf jeden Fall mit dem Gitter, Farbe nach Höhe ist vielleicht nicht schlecht.

Danke für deine Mühe, Martin
 

Anhänge

  • maple1.png
    maple1.png
    39,9 KB · Aufrufe: 94
  • maple2.png
    maple2.png
    18,6 KB · Aufrufe: 85
Zuletzt bearbeitet:
Hier mal eine Version für den Wireframe und den Wasserlook. Mit dem Wasserlook bin ich aber nicht zufrieden ist zu dunkel geworden.
 

Anhänge

  • Wire500.jpg
    Wire500.jpg
    39,2 KB · Aufrufe: 94
  • Water500.jpg
    Water500.jpg
    16,1 KB · Aufrufe: 89
Zurück
Oben Unten