PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Komplexes Zeigerdiagramm mit PSTricks?



4nndee
10-12-2010, 13:36
Hallo,

ich habe mich in letzter Zeit etwas intensiver mit PSTricks beschäftigt, was nach einigen Startschwierigkeiten jetzt auch richtig gut klappt.

Jetzt habe ich folgende Frage:

Ich möchte gerne ein Zeigerdiagramm für einen Stromwandler zeichnen. Theoretisch geht das in dem ich einfach jede Menge Pfeile aneinander setze. Ich wollte allerdings mal fragen, ob es dafür eventuell eine elegantere Lösung, spirch ein Paket gibt. Beispielsweise wo nur noch länge und Winkel definiert werden müssen. Auch wäre es praktisch wenn man sich direkt den Winkel zu den Pfeilen mit einzeichnen lassen könnte.

Gibt es sowas oder muss ich das manuell machen?

mechanicus
10-12-2010, 14:12
Hi,

du kannst doch auch Länge und Winkel angeben:

\documentclass{article}

\usepackage{pstricks-add}

\begin{document}
\begin{pspicture}(0,0)(2,2)
\psaxes{->}(0,0)(2,)
\psline(2;30)
\end{pspicture}


\end{document}

Gruß
Marco

voss
10-12-2010, 16:06
Ich möchte gerne ein Zeigerdiagramm für einen Stromwandler zeichnen. Theoretisch geht das in dem ich einfach jede Menge Pfeile aneinander setze. Ich wollte allerdings mal fragen, ob es dafür eventuell eine elegantere Lösung, spirch ein Paket gibt. Beispielsweise wo nur noch länge und Winkel definiert werden müssen. Auch wäre es praktisch wenn man sich direkt den Winkel zu den Pfeilen mit einzeichnen lassen könnte.

Gibt es sowas oder muss ich das manuell machen?

Hier als neuer Befehl, was Marco schon gezeigt hat:

\documentclass{article}
\usepackage{pstricks} \SpecialCoor
\makeatletter
\def\psStartPunkt(#1){\pst@getcoor{#1}\pst@tempA
\pstVerb{\pst@tempA
\pst@number\psyunit div /cp.Y exch def
\pst@number\psxunit div /cp.X exch def }}
\def\psVektor{\pst@object{psVektor}}
\def\psVektor@i(#1){%
\pst@killglue%
\pst@getcoor{#1}\pst@tempA%
\begin@SpecialObj%
\rput(! cp.X cp.Y ){\psline[arrowsize=6pt]{->}(0,0)(#1)%
\psarc[arrows=->,arrowsize=4pt](0,0){1}{0}{!\pst@tempA exch atan}%
\psline[linestyle=dotted](1.5,0)}%
\end@SpecialObj%
\pstVerb{tx@Dict begin \pst@tempA \pst@number\psyunit div
cp.Y add /cp.Y exch def
\pst@number\psxunit div
cp.X add /cp.X exch def end}
\ignorespaces%
}
\makeatother
\begin{document}

\begin{pspicture}[showgrid](10,10)
\psStartPunkt(1,1)
\psVektor(3;30)\psVektor(4;60)\psVektor[linecolor=red](3;10)\psVektor(4;110)
\end{pspicture}

\end{document}

Herbert

4nndee
13-12-2010, 13:45
Erstmal Danke an Marco, das mit den Winkeln hab ich entweder nicht gelesen oder überlesen. Für ein einfaches Zeigerdiagramm reicht das völlig aus.

Ich möchte jedoch ein etwas komplexeres zeichnen, bei dem auch mal ein Vektor direkt an einem anderen dran hängt. Dafür ist die Lösung von Herbert perfekt.
Könntest du mir eventuell ein wenig erläutern was du da genau gemacht hast?! Ich versuch das grad zu verstehen, blick es aber noch nicht ganz. Ich würd auch gerne selbts mal vereuchen noch ein paar Modifizierungen einzubauen.

voss
13-12-2010, 14:33
Erstmal Danke an Marco, das mit den Winkeln hab ich entweder nicht gelesen oder überlesen. Für ein einfaches Zeigerdiagramm reicht das völlig aus.

Ich möchte jedoch ein etwas komplexeres zeichnen, bei dem auch mal ein Vektor direkt an einem anderen dran hängt. Dafür ist die Lösung von Herbert perfekt.
Könntest du mir eventuell ein wenig erläutern was du da genau gemacht hast?! Ich versuch das grad zu verstehen, blick es aber noch nicht ganz. Ich würd auch gerne selbts mal vereuchen noch ein paar Modifizierungen einzubauen.

Das ist jetzt auch als \psStartPoint und \psVector in pstricks-add vorhanden. Ab morgen im
TeXLive-UPdate.

\def\psStartPunkt(#1){\pst@getcoor{#1}\pst@tempA

Hole Koordinaten und speichere sie in pt in \pst@tempA

\pstVerb{\pst@tempA
\pst@number\psyunit div /cp.Y exch def
\pst@number\psxunit div /cp.X exch def }}

rechne sie in User-Koordinaten um und speichere sie auf PostScript-Ebene
in cp.X und cp.Y

\def\psVektor{\pst@object{psVektor}}

Als PSTricks-Object wird automatisch das optrionale Argument [..] eingelesen
und mit \psVector@i weitergemacht

\def\psVektor@i(#1){%
\pst@killglue%
\pst@getcoor{#1}\pst@tempA%

siehe oben

\begin@SpecialObj%

setzt auomatisch optionale Argument und beginnt eine lokale Gruppe

\rput(! cp.X cp.Y ){\psline[arrowsize=6pt]{->}(0,0)(#1)%
\psarc[arrows=->,arrowsize=4pt](0,0){1}{0}{!\pst@tempA exch atan}%
\psline[linestyle=dotted](1.5,0)}%
\end@SpecialObj%

Setze Linie und eventuell Winkel an die Stelle cp.X,cp.Y, was dem letzten
Ende des letzten Vektors entspricht.

\pstVerb{tx@Dict begin \pst@tempA \pst@number\psyunit div
cp.Y add /cp.Y exch def
\pst@number\psxunit div
cp.X add /cp.X exch def end}
\ignorespaces%
}

Addiere auf PostScript-Ebene die x-y-Werte des neuen Vektors zu den
alten und speichere sie wieder in cp.X und cp.Y. Das ganze wird im
Dictionary tx@Dict erledigt, damit es außerhalb des MAkros \psVector
auch bekannt ist. tx@Dict ist die oberste PSTricks-Ebene.

Herbert

Thorbenz
08-12-2011, 08:49
Als Ergänzung dazu habe ich überlegt Zeigerdiagramme automatisch erstellen zu lassen nach Betrag und Winkel, wie es bereits oben angegeben ist.
Das Problem ist nun, dass bei der pspicture Umgebung der Wertebereich angegeben werden muss. Es wäre von Vorteil, wenn aus den eingegebenen Vektoren der Maximale sowie der Minimale x bzw. y -Wert bestimmt werden würde um damit den Wertebereich der pspicture-Umgebung zu bestimmen.
Gibt es da vielleicht eine Funktion die das erledigt.
Des weiteren ist es bei Zeigerdiagrammen nun so, dass nur Zeiger einer Masche zusammengehören. Beginnt eine neue Masche starten die Zeiger wieder im Startpunkt. Bei wiederholtem aufrufen von \psStartPunkt geschiet dies jedoch nicht.

Ich bedanke mich im vorraus für evtl Hilfe oder Anregungen.

Thorben