PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ifnum verändert Koordinaten im Stack



hypocrissy
29-08-2010, 11:19
Wie der Titel schon sagt: wenn ich ifnum verwende ändern sich Koordinaten, allerdings nur wenn ich sie in ein Stack packe. Die PS/PDF ausgabe bleibt gleich.
Folgendes Bsp. ist nicht laufähig. Ich habe ein
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}
hinzugefügt um mir die Koordinaten P2.x und P2.y anzugucken.
In der Log Datei steht dann im Operand-Stack:
-0.844687; -2.40034; 4; 4
Die beiden vieren sind vom roll Befehl. Die ersten beiden Zahlen sollten P2.x und P2.y sein. Allerdings ist P2.x per Definition 0.56121.
Entfernt man diese Test Zeile und setzt einen zweiten Punkt, sind dieser
interessanterweise deckungsgleich mit dem ersten Punkt.
Also scheinen die Koordinaten nur verändert zu werden, wenn man sie in einen Stack packt.
Entfernt man hingegen ifnum dann stehen in der Testzeile die richtigen Koordinaten.



\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-math}
\usepackage{pst-eucl}
\usepackage{pstricks-add}
\pagestyle{empty}

\begin{document}

\begin{pspicture}(-3.2,-3.5)(3.5,2.6)

\pnode(0.56121,-2.40034){P2}
\psdot(P2)
\ifnum1>2 neue Welt\else alte Welt\fi
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}
\psdot(P2) %dieser Punkt liegt genau auf dem 1. Punkt
% obwohl coords im stack anders waren

\end{pspicture}

\end{document}


Wo gehts schief?

Christian

mechanicus
29-08-2010, 11:25
Hi,

ist dir klar, was roll macht.
Auszug aus dem Bluebook:

Rotate n elements j times

Somit stehen bei dir folgende Elemente:
P.x P.y 4 4
die letzte 4 ist das j für roll. Aber was bringt dir dieses roll. Du hast ja damit ein 3 Koordinaten, welche nicht verarbeitet werden können.

Gruß
Marco

voss
29-08-2010, 11:27
Wie der Titel schon sagt: wenn ich ifnum verwende ändern sich Koordinaten, allerdings nur wenn ich sie in ein Stack packe. Die PS/PDF ausgabe bleibt gleich.
Folgendes Bsp. ist nicht laufähig. Ich habe ein
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}


Wie sollen denn 4 Werte rotiert werden, wenn nur zwei auf dem
Stack liegen??
Die Fehlermeldung sagt es doch auch:

Error: /stackunderflow in --roll--
Operand stack:
-0.844264 -2.40034 4 4

Abgesehen davon ist 4 4 roll sinnlos, da es hinterher genau denselben
Zustand hat wie vorher ...

Herbert

hypocrissy
29-08-2010, 11:29
mir ist klar was roll macht. ich hätte auch 0 div machen können. Hauptsache es produziert einen Fehler, so dass ich mir anschauen kann was im Stack ist (vielleicht gibt es auch leichtere Wege zu diesem Ziel) Jedenfalls kann man wie oben beschrieben sich auf diese weise die Koordinaten P2.x und P2.y anschauen, wobei sich die x-Koordinate von der Definition unterscheidet

mechanicus
29-08-2010, 11:32
Hi,

Aus Interesse: was soll das Ergebnis sein?

Gruß
Marco

voss
29-08-2010, 11:34
mir ist klar was roll macht. ich hätte auch 0 div machen können. Hauptsache es produziert einen Fehler, so dass ich mir anschauen kann was im Stack ist (vielleicht gibt es auch leichtere Wege zu diesem Ziel) Jedenfalls kann man wie oben beschrieben sich auf diese weise die Koordinaten P2.x und P2.y anschauen, wobei sich die x-Koordinate von der Definition unterscheidet

Dann erzähle sowas! Es macht keinen Spaß erstmal zu erraten,
was du eigentlich erreichen willst!

pstack

gibt dir den Stack aus, wenn du die PS-Datei mit ghostscript
laufen lässt, oder ps2pdf machst.

Herbert

hypocrissy
29-08-2010, 11:38
Ich möchte Tangenten an eine Hyperbel zeichen. Dafür berechne ich die Tangentenberührpunkte. In den meisten Fällen gibt es 2 davon. Nun möchte ich den "richtigen" Tangentenberührpunkt. Also nicht den den ich zuvor berechnet habe. An dieser Stelle möchte ich den gerade berechneten Berührpunkt mit dem alten mittels ifnum vergleichen. Dies hatte zu einem unbeschreiblichen Kuddelmuddel geführt.... :)
Christian

mechanicus
29-08-2010, 11:41
Hi,

kennst du das Makro \psplotTangent. Dass sollte doch für dich passen. Es ist in der Doku zu pstricks-add zu finden.

Gruß
Marco

voss
29-08-2010, 11:41
Ich möchte Tangenten an eine Hyperbel zeichen. Dafür berechne ich die Tangentenberührpunkte. In den meisten Fällen gibt es 2 davon. Nun möchte ich den "richtigen" Tangentenberührpunkt. Also nicht den den ich zuvor berechnet habe. An dieser Stelle möchte ich den gerade berechneten Berührpunkt mit dem alten mittels ifnum vergleichen. Dies hatte zu einem unbeschreiblichen Kuddelmuddel geführt.... :)
Christian

Tangenten kannst du mit \psPlotTangent zeichnen, da brauchst du
das Rad nicht neu zu erfinden.
- \ifnum kann nur ganze Zahlen vergleichen
- User-Koordinaten und PostScript-Koordinaten sind unterschiedlich
- Umrechnung mit \tx@UserCoor oder \tx@ScreenCoor

Herbert

hypocrissy
29-08-2010, 11:58
In diesem Fall hilft mir psplotTangent nicht: gegeben sind eine Hyperbel und ein Punkt P1. An Punkt P1 existieren meistens zwei Tangenten an die Hyperbel. gesucht sind nun deren Berührpunkte.

Zu User-Koordinaten und PostScript-Koordinaten:
Was mich verwundert, ist, dass mit dem Befehl \ifnum sich diese ändern:
ohne ifnum ist im bei
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}
im Stack: 0.561203; -2.40034; 4; 4

mit ifnum ist im Stack:
-0.844687; -2.40034; 4; 4

also ändert sich bei Verwendung von ifnum der 1. Stackeintrag in
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}

Wie pstack funktioniert muss erst noch ausprobieren...
Danke für eure Hilfe

hypocrissy
29-08-2010, 12:08
Falls ich mich unverständlich ausdrücke noch mal ganz ausführlich:


\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-math}
\usepackage{pst-eucl}
\usepackage{pstricks-add}
\pagestyle{empty}

\begin{document}
\begin{pspicture}(-3.2,-3.5)(3.5,2.6)
\pnode(0.56121,-2.40034){P2}
\psdot(P2)
\ifnum1>2 neue Welt\else alte Welt\fi
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}
\psdot(P2)
\end{pspicture}
\end{document}
liefert in der Fehlermeldung den Operand-Stack
-0.844687; -2.40034; 4; 4

Dieser code


\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-math}
\usepackage{pst-eucl}
\usepackage{pstricks-add}
\pagestyle{empty}

\begin{document}
\begin{pspicture}(-3.2,-3.5)(3.5,2.6)
\pnode(0.56121,-2.40034){P2}
\psdot(P2)
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}
\psdot(P2)
\end{pspicture}
\end{document}

(diesmal ohne \ifnum) liefert in der Fehlermeldung diesen Stack:
0.561203; -2.40034; 4; 4

Die Codes Unterscheiden sich nur in einem \ifnum, was zu unterschiedlichen Stackeinträgen führt

voss
29-08-2010, 12:17
In diesem Fall hilft mir psplotTangent nicht: gegeben sind eine Hyperbel und ein Punkt P1. An Punkt P1 existieren meistens zwei Tangenten an die Hyperbel. gesucht sind nun deren Berührpunkte.

Zu User-Koordinaten und PostScript-Koordinaten:
Was mich verwundert, ist, dass mit dem Befehl \ifnum sich diese ändern:
ohne ifnum ist im bei
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}
im Stack: 0.561203; -2.40034; 4; 4

mit ifnum ist im Stack:
-0.844687; -2.40034; 4; 4

also ändert sich bei Verwendung von ifnum der 1. Stackeintrag in
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}


Das Problem gibt es schon, wenn man nur irgendein Zeichen ausgibt.
Da muss ich mal sehen, was da passiert ... bzw. warum die Verschiebung des aktuellen Punktes (durch Ausgabe des Zeichens) einen Einfluss auf die Koordinaten hat, was nicht sein sollte.

Herbert

Schweinebacke
29-08-2010, 12:19
Das Beispiel ohne \ifnum ist nicht äquivalent zum Beispiel mit \ifnum. Ein äquivalentes Beispiel wäre
\documentclass{article}
\usepackage{pstricks}
\usepackage{pst-math}
\usepackage{pst-eucl}
\usepackage{pstricks-add}
\pagestyle{empty}

\begin{document}
\begin{pspicture}(-3.2,-3.5)(3.5,2.6)
\pnode(0.56121,-2.40034){P2}
\psdot(P2)
alte Welt%
\pnode(!\psGetNodeCenter{P2} P2.x P2.y 4 4 roll){test}
\psdot(P2)
\end{pspicture}
\end{document} und das gibt dasselbe in der Fehlermeldung aus wie das \ifnum-Beispiel.

BTW: Warum ignorierst Du Heberts Hinweis, wie man den sich den Stack anschauen kann?

Schweinebacke
29-08-2010, 12:19
Ups, Herbert war schneller ...

voss
29-08-2010, 12:32
Die Codes Unterscheiden sich nur in einem \ifnum, was zu unterschiedlichen Stackeinträgen führt

Die Verschiebung muss sein, da sich ja der aktuelle Punkt verschoben hat. Wie auch imemr, wenn du dennoch die alten Koordinaten haben willst, dann geht es mit folgendem Trick:


\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\makeatletter
\def\psGetNC#1{ tx@NodeDict begin /N@#1 load begin X Y end end
\tx@UserCoor /#1.y exch def /#1.x exch def}
\makeatother
\begin{document}

\begin{pspicture}(3.5,2.6)
\pnode(0.56121,-2.40034){P2}
\psdot(P2)
\pnode(!\psGetNC{P2} P2.x P2.y pstack){test}A
\pnode(!\psGetNC{P2} P2.x P2.y pstack){testB}
\psdot(P2)
\psdot(testB)
\end{pspicture}

\end{document}

Damit liegt dann aber testB nicht mehr auf P2, da die Ausgabe vom
A den aktuellen Punkt in x-Richtung ja verschoben hat. pstack nach dem Testen wieder rausnehmen.


Herbert

hypocrissy
29-08-2010, 12:37
Ich ignoriere den Hinweis mit pstack nicht, habe mich nur ein einem Post verschrieben falls du das meintest. Ich weiß nur noch nicht wie man pstack genau benutzt.
Das interessante bei der Sache:
Die Koordinaten ändern sich nur wenn man sie in einen Stack packt.
Der 2. psdot landet nämlich wieder _exakt_ auf dem ersten psdot
auch wenn Zeichen ausgegeben werden

voss
29-08-2010, 12:39
Ich ignoriere den Hinweis mit pstack nicht, habe mich nur ein einem Post verschrieben falls du das meintest. Ich weiß nur noch nicht wie man pstack genau benutzt.
Das interessante bei der Sache:
Die Koordinaten ändern sich nur wenn man sie in einen Stack packt.
Der 2. psdot landet nämlich wieder _exakt_ auf dem ersten psdot
auch wenn Zeichen ausgegeben werden

natürlich, denn die NodeMatrix sorgt ja dafür dass die Verschiebung des
aktuellen Punktes durch deine Textausgabe berücksichtigt wird.

Nebenbei: _nach_ \ifnum sollte in jedem Fall ein abschließendes % gesetzt werden

pstack gibt nur den Stack aus und amcht sonst nix ...

Herbert

voss
29-08-2010, 12:58
Ich ignoriere den Hinweis mit pstack nicht, habe mich nur ein einem Post verschrieben falls du das meintest. Ich weiß nur noch nicht wie man pstack genau benutzt.
Das interessante bei der Sache:
Die Koordinaten ändern sich nur wenn man sie in einen Stack packt.
Der 2. psdot landet nämlich wieder _exakt_ auf dem ersten psdot
auch wenn Zeichen ausgegeben werden

funtioniert die Lösung von vorhin?

Herbert

hypocrissy
29-08-2010, 13:31
Dankeschön! Euch kann man nichts aus der Ruhe bringen ... ;)
Und danke auch für das pstack