Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 19

Thema: ifnum verändert Koordinaten im Stack

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.08.2010
    Beiträge
    22

    ifnum verändert Koordinaten im Stack

    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.

    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)
    \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

  2. #2
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    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

  3. #3
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von hypocrissy Beitrag anzeigen
    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:
    Code:
    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

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.08.2010
    Beiträge
    22
    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

  5. #5
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    Aus Interesse: was soll das Ergebnis sein?

    Gruß
    Marco

  6. #6
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von hypocrissy Beitrag anzeigen
    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    02.08.2010
    Beiträge
    22
    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

  8. #8
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    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

  9. #9
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von hypocrissy Beitrag anzeigen
    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

  10. #10
    Registrierter Benutzer
    Registriert seit
    02.08.2010
    Beiträge
    22
    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
    Geändert von hypocrissy (29-08-2010 um 11:03 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    02.08.2010
    Beiträge
    22
    Falls ich mich unverständlich ausdrücke noch mal ganz ausführlich:
    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)
    \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
    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

  12. #12
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von hypocrissy Beitrag anzeigen
    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

  13. #13
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    Das Beispiel ohne \ifnum ist nicht äquivalent zum Beispiel mit \ifnum. Ein äquivalentes Beispiel wäre
    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)
    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?

  14. #14
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    Ups, Herbert war schneller ...

  15. #15
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von hypocrissy Beitrag anzeigen
    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:

    Code:
    \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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •