matplotlib Objekte an der Oberfläche von einer Sphere

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hallo Leute,
ich will auf einer kugeligen Oberfläche an bestimmten Koordinaten kleine Zylinder erzeugen, die ortogonal zur Oberfläche stehen.

Ich hab mal damit angefangen und wollte erst mal Punkte erzeugen mit Axes3D.scatter, aber irgendwie sind die nicht immer sichtbar.
Mach ich hier etwas grundsätzliches falsch? Soll später aussehen wie kleine Pickel auf der Oberfläche :-)

Hier mal mein Code (im Moment nur zum testen)

Code: Alles auswählen

#!/usr/bin/python

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
#ax = fig.add_subplot(111, projection='3d')
ax = Axes3D(fig)

u = np.linspace(0, .5 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 5 * np.outer(np.cos(u), np.sin(v))
y = 5 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='b')
xs = [5.1 * np.sin(np.pi/180*55)]
ys = [5.1 * np.cos(np.pi/180*55)]
zs = [0]
ax.scatter(xs,ys,zs, c='r')

plt.show()
Würd mich freuen wenn Jemand eine Idee hat wie ich den Punkt bzw später meinen Zylinder immer sichtbar machen kann.
Zuletzt geändert von Anonymous am Mittwoch 9. November 2011, 14:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hübsch. Hat aber einen Nachteil: Es funktioniert. ;-) (Jedenfalls sehe ich kein Problem im Plot: Alles sichtbar.) Wie sieht denn der Code aus, wenn es nicht funktioniert?
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Also ich seh den roten Punkt auch, wenn ich an den Sphere entlang schaue. Wenn ich die aber so drehe, das ich auf die Oberfläche schaue und direkt den Punkt vor der Nase habe, verschwindet er... Und das passiert selbst, wenn ich den Punkt ein bisschen "außerhalb" hin lege...
Sobald beides in einer Reihe ist, verschindet der Punkt.

Ich benutze matplotlib 1.1.0 unter Ubuntu, vielleicht hilft das ein wenig...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ah, hier liegt der Hase im Pfeffer! Also, das ist ein Wahrnehmungsproblem: Schau mal ganz vorsichtig, auf den Punkt während er "verschwindet". Der sollte immer noch da sein, wenn auch recht schwach. Das liegt daran, daß blau und rot direkt übereinandergeplottet werden -- ich gebe aber zu, daß das keine befriedigende Antwort ist.

Eine Lösung könnte ein niedriger alpha-Wert für die Kugel sein - falls Dir das ästhetisch zusagt.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

ok, nehmen wir mal an, ich bin damit zufrieden :-) Kann ich auch meine Zylinder erzeugen? die eben wie kleine Türmchen aus der Sphere schauen? Dazu find ich irgendwie nix in der Doku... Vielleicht kann man sowas aber mit subplots oder sowas lösen...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Na ja, Du willst Top-3D-Qualität von einer 2D-Bibliothek. Kurz: Das geht. Lang: Aber nicht so ganz einfach. Es gibt Beispiele im Netz, u. a.: http://old.nabble.com/plot_surface-shad ... 54649.html - Für manches 3D-Problem ist mpl schon eine gute Lösung und es wird langsam noch besser, aber wenn Du wirklich gute 3D-Funktionalität erwartest, wirst Du nachhaltig enttäuscht sein. Vielleicht willst Du lieber frühzeitig wechseln? Z. B. zu Mayavi2? Allerdings ist das Arbeit mit Primitives dort auch nicht gerade trivial ... (und ich bin viel zu lange draussen).
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Ich antworte mal etwas spät. Hab jetzt soweit alles hin bekommen mit mayavi und äääh tvtk. Ich glaub irgendwie ist es was anderes, aber gehört doch zusammen?! Egal...
Zumindest versuch ich jetzt auf der Oberfläche meiner grauen Kugel Linien zu ziehen für Equator und ähnliches, aber ich finde keine richtige Dokumentation der Klassen und Methoden. Kann mir da noch Jemand helfen?

Der Code dafür war im Nachhinein recht einfach:

Code: Alles auswählen

from enthought.tvtk.tools import visual
from math import radians
import numpy as np

#
#bisschen code um Daten zu erzeugen...
#

myprot = visual.sphere(radius=radius)

for beta in betas.keys():
    for gamma in betas[beta].keys():
        x = np.cos(radians(beta+90)) * np.cos(radians(gamma)) * radius
        y = np.cos(radians(beta+90)) * np.sin(radians(gamma)) * radius
        z = np.sin(radians(beta+90)) * radius
        print x,y,z
        c = visual.cylinder(pos=(x,y,z),color=visual.color.red,axis=(x,y,z),length=betas[beta][gamma])
Antworten