PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Testen ob 2 Punkte nahe bei einander sind; Vergleich; ifthen



hypocrissy
29-08-2010, 14:40
So und damit ihr nicht auf den Gedanken kommt, dass Sonntag ein freier Tag ist,
kommen wir zum nächsten Problem: ich möchte gerne überprüfen ob zwei \pnodes ungefähr gleich sind, soll heißen: die Summe der Beträge der Differenzen der Koordinaten soll kleiner als eine vorgegebene Schranke sein.
Retorische Frage: Weiß jemand wie man die Lücke in folgendem Code stopfen kann? (natürlich wisst ihrs ;))


\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\begin{document}

\begin{pspicture}(-2,-2)(2,2)
\pnode(1,1){Q1}
\pnode(1.0001,0.9999){Q2}
\pstVerb{/DeltaXY {\psGetNodeCenter{Q1}\psGetNodeCenter{Q2}
Q1.x Q2.x sub abs Q1.y Q2.y sub abs add} def}%
%wenn DeltaXY<0.01
%dann \psline[linecolor=red](0,0)(1,0)
%sonst \psline[linecolor=red](0,0)(0,1)
\end{pspicture}

\end{document}


Christian

mechanicus
29-08-2010, 15:16
Hi,

sowas?


\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\begin{document}

\begin{pspicture}(-2,-2)(2,2)
\pnode(1,1){Q1}
\pnode(1.0001,0.9999){Q2}
\pstVerb{/DeltaXY {\psGetNodeCenter{Q1}\psGetNodeCenter{Q2}
Q1.x Q2.x sub abs Q1.y Q2.y sub abs add} def}%
\psline[linecolor=red](0,0)(!%
DeltaXY 0.1 gt {0 1}{1 0} ifelse
)
\end{pspicture}

\end{document}

Gruß
Marco

hypocrissy
29-08-2010, 15:41
Danke für die Antwort. Kannst du mir noch sagen, wie ich ifelse ausserhalb von psline benutze?
Z.B wenn ich im true Fall einen Kreis malen will und im else Fall eine Gerade?

Gruß
Christian

EDIT: oder im allegemeinen Fall: wenn wahr tue \a sonst mach \b

voss
29-08-2010, 16:01
Kannst du mir noch sagen, wie ich ifelse ausserhalb von psline benutze?
Z.B wenn ich im true Fall einen Kreis malen will und im else Fall eine Gerade?



\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\begin{document}

\begin{pspicture}(-2,-2)(2,2)
\pnode(1,1){Q1}
\pnode(1.0001,0.9999){Q2}
\psGetDistance(1,1)(1.0001,0.9999)\Abstand
\ifdim\Abstand pt<0.01pt
\psline[linecolor=red](0,0)(1,0)
\else
\psline[linecolor=red](0,0)(0,1)
\fi%
\end{pspicture}

\end{document}

Herbert

hypocrissy
29-08-2010, 16:30
Tut mir leid, ich werde es wohl nie lernen...
Da ich die Koordinaten der Punkte Q1 und Q2 nicht kenne
(diese ergeben sich über längere Rechnungen) wollte ich Herberts Vorschlag mit


\psGetDistance(\psGetNodeCenter{Q1} Q1.x Q1.y )
(\psGetNodeCenter{Q2} Q2.x Q2.y)\Abstand

meinen Wünschen anpassen. Habe alle erdenklichen Kombinationen von ! und
{} probiert ohne Erfolg.

Gruß
Christian

mechanicus
29-08-2010, 16:45
Tut mir leid, ich werde es wohl nie lernen...
Da ich die Koordinaten der Punkte Q1 und Q2 nicht kenne
(diese ergeben sich über längere Rechnungen) wollte ich Herberts Vorschlag mit


\psGetDistance(\psGetNodeCenter{Q1} Q1.x Q1.y )
(\psGetNodeCenter{Q2} Q2.x Q2.y)\Abstand

meinen Wünschen anpassen. Habe alle erdenklichen Kombinationen von ! und
{} probiert ohne Erfolg.

Gruß
Christian
Die Abstandsberechnung erfolgt auf tex-Ebene, so dass du keinen Postscript-Code nutzen kannst.

Gruß
Marco

voss
29-08-2010, 17:31
Die Abstandsberechnung erfolgt auf tex-Ebene, so dass du keinen Postscript-Code nutzen kannst.


deswegen solltest du _genau_ beschreiben, was du erreichen willst,
dann kann man das auch auf PS-Ebene erledigen. Eine Beschreibung
wie "wenn wahr eine Linie else einen Kreis" reicht hierbei nicht.

Herbert

hypocrissy
29-08-2010, 18:29
Im Moment habe/möchte ich folgendes:
Ich habe 2 \pnodes Q1,Q2, deren Koordinaten ich nicht kenne.
Wenn sie sehr nahe bei einander sind, möchte ich die Koordinaten von Q2 durch eine bereits definierte Funktion neu berechen.
Die Funktion erwartet im Stack
Q2.x und Q2.y und gibt die Koordinaten Q2neu.x Q2neu.y des neuen Punktes aus .
Als einfaches Beispiel soll

\def\Func{add dup } dienen. In Annlehnung an mechanicus Vorschlag bzgl. psline

\psline[linecolor=red](0,0)(! DeltaXY 0.1 gt {0 1}{1 0} ifelse)
Habe ich folgendes probiert:

\pnode(! DeltaXY 0.1 gt {\psGetNodeCenter Q2.x Q2.y}
{\psGetNodeCenter Q2.x Q2.y \Func} ifelse){Q2}
mit DeltaXY wie oben (ungefähr der Abstand).
Aber nicht einmal

\pnode(! DeltaXY 0.1 gt {0 1}{1 0} ifelse){Q2}
läuft fehlerfrei durch:
\stackunderflow in exch bei leerem Operand stack
Ich würde mich sehr freuen wenn ihr mir erklären könntet woran das liegt, da in meinen Augen das Prinzip das gleiche ist.
(gemeint ist: warum klappt psline s.o. aber nicht \pnode s.o.)
Ein Verweis auf ein entsprechende Anleitung wäre genauso gut
(Ihr sollt euch ja nicht totschreiben)
Hier nochmal ein Code-Schnipsel, welches ihr hoffentlich vervollständigen könnt

\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\begin{document}
\def\Func{add dup} %erwartet x,y Koord. eines Punktes im Stack,
%gibt x,y Koord eines neuen Punktes aus

\begin{pspicture}(-2,-2)(2,2)
\pnode(1,1){Q1}
\pnode(1.0001, 3.9999){Q2}
\pstVerb{/DeltaXY {\psGetNodeCenter{Q1}\psGetNodeCenter{Q2}
Q1.x Q2.x sub abs Q1.y Q2.y sub abs add} def}%
%\pnode(! DeltaXY 0.1 gt {\psGetNodeCenter Q2.x Q2.y} %funktioniert nicht
%{\psGetNodeCenter Q2.x Q2.y \Func} ifelse){Q2}
\end{pspicture}
\end{document}


Dies ist alles was ich im Moment brauche und ist sehr speziell (in beiden Fällen wird ein \pnode erzeugt).
Für allgemeinere Fälle hätte ich gern gewusst wie man zwei
(mit postscript?) errechnete Zahlen (im allgemeinen nicht integers)
vergleicht und je nach Ausgang 2 verschiedene Dinge macht.
Was ist mir egal, ich möchte es ja nur für die Zukunft wissen als Bsp. würde mir reichen, wenn man in einen Fall eine beliebige Linie malt und im anderen Fall einen Kreis.

Es tut mir leid falls meinen Fragestellungen nicht ausführlich genug sind,
ich versuche lediglich jegliche unnütze Information auszuklammern und mich aufs Wesentliche zu beschränken.

Vielen lieben Dank für eure geduldige Hilfe
Christian

mechanicus
29-08-2010, 19:22
Hi,

du hast Argumente bei psGetNodeCenter vergessen.


\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\begin{document}
\def\Func{add dup} %erwartet x,y Koord. eines Punktes im Stack,
%gibt x,y Koord eines neuen Punktes aus

\begin{pspicture}(-2,-2)(2,2)
\Cnode(1,1){Q1}
\Cnode(1.0001, 3.9999){Q2}
\pstVerb{/DeltaXY {\psGetNodeCenter{Q1}\psGetNodeCenter{Q2}
Q1.x Q2.x sub abs Q1.y Q2.y sub abs add} def}%
\Cnode[linecolor=red](!\psGetNodeCenter{Q2} DeltaXY 0.1 lt {Q2.x Q2.y}{Q2.x Q2.y add dup} ifelse){Q3}
\end{pspicture}
\end{document}

Vielleicht solltest du dir überlegen, was genau du möchtest. Wenn du wirklich eine Schleife bauen willst, solltest du listplot nutzen. So kannst du meiner Meinung nach sehr gut pstricks mit postscript kombinieren.
(Vielleicht hat Herbert ja eine bessere Idee)


Gruß
Marco

voss
29-08-2010, 19:58
Es tut mir leid falls meinen Fragestellungen nicht ausführlich genug sind,
ich versuche lediglich jegliche unnütze Information auszuklammern und mich aufs Wesentliche zu beschränken.


Das muss dir nicht leid tun, du gibst dein Bestes und wir, mehr
geht nicht ...
Marco hat dir ja schon das Problem verraten. Wenn du in die pstricks.pro
siehst, dann gibt es dort am ANfang schon einige Prozeduren, die
du verwenden kannst, beispielsweise Pyth2 für den Abstand zweier Punkte:


\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\begin{document}
\def\Func{add dup }% Keerzeichen hinten

\begin{pspicture}[showgrid](6,6)
\pnode(1,1){Q1} \qdisk(Q1){2pt}\uput[90](Q1){Q1}%
\pnode(1.0001, 3.9999){Q2}\qdisk(Q2){2pt}\uput[90](Q2){Q2}%
\pstVerb{/DeltaXY {
\psGetNodeCenter{Q1}
\psGetNodeCenter{Q2}
Q1.x Q1.y Q2.x Q2.y Pyth2 } def}%
\pnode(! DeltaXY 0.1 lt {Q2.x Q2.y}{Q2.x Q2.y \Func } ifelse){Q3}
\qdisk(Q3){2pt}\uput[90](Q3){Q3}
\end{pspicture}

\end{document}

Herbert

hypocrissy
29-08-2010, 21:43
Dankeschön, genau das hatte ich gebraucht.
Ich sehe nun meinen Fehler: ich konnte an dieser Stelle Q2 nicht einfach überschreiben.
Scheinbar geht es nicht so leicht nach der ausserhalb von \psline \pnode ect zwei (mit postsript?) gewonne Zahlen zu vergleichen
(z.B 1 1 add gt 1)
um danach beliebige Aktionen durchzuführen.
Wenn ich also wieder was konkretes brauche melde ich mich nochmal.

Gruß
Christian

voss
29-08-2010, 22:00
Scheinbar geht es nicht so leicht nach der ausserhalb von \psline \pnode ect zwei (mit postsript?) gewonne Zahlen zu vergleichen
(z.B 1 1 add gt 1)
um danach beliebige Aktionen durchzuführen.

doch das geht alles, man muss nur genau wissen, was du machen willst.

Herbert