diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pst-intersect/pst-intersect.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pst-intersect/pst-intersect.tex | 80 |
1 files changed, 66 insertions, 14 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-intersect/pst-intersect.tex b/Master/texmf-dist/tex/generic/pst-intersect/pst-intersect.tex index 74c6fafc7f3..25ef91c07fd 100644 --- a/Master/texmf-dist/tex/generic/pst-intersect/pst-intersect.tex +++ b/Master/texmf-dist/tex/generic/pst-intersect/pst-intersect.tex @@ -55,13 +55,8 @@ }% \def\pssavebezier@ii{% \addto@pscode{% - % only 10 points allowed, remove the rest counttomark 20 gt { counttomark 20 sub { pop } repeat } if - % reverse the point order - counttomark -2 4 { 2 roll } for - %\addto@pscode{% - %counttomark 2 add -1 roll pop % remove the path name - counttomark 2 idiv 1 sub dup 9 gt { pop 9 } if + counttomark 2 idiv 1 sub \psk@plotpoints\space exch \txFunc@BezierCurve \ifshowpoints \txFunc@BezierShowPoints \else pop \fi @@ -73,6 +68,20 @@ [ count 1 sub 1 roll ] ArrayToPointArray def }% \ignorespaces}% +\def\psGetIsectCenter#1#2#3{% + \pst@intersectdict + \PIT@name{#1} /\PIT@name{#2@t} get #3 1 sub get + \PIT@name{#1} /\PIT@name{#2} get + dup IsPath { + PreparePath exch dup 3 1 roll cvi get + } if + PointArrayToArray + tx@FuncDict begin 2 dict begin + dup length 2 idiv 1 sub /BezierType exch def /Points exch def GetBezierCoor + end end + end + \tx@UserCoor /#2#3.y exch def /#2#3.x exch def +}% \define@key[psset]{intersect}{tstart}{% \pst@checknum{#1}\PIT@key@tstart } @@ -116,9 +125,7 @@ \PIT@pst@stroke@orig \addto@pscode{% clear mark - { /movetype counttomark 3 roll } - { /linetype counttomark 3 roll } - { /curvetype counttomark 7 roll }{} pathforall + \pst@intersectdict GetFullPath end counttomark 1 add -1 roll pop count }% }% \def\PIT@name@default{@tmp}% @@ -152,15 +159,38 @@ \PIT@checkname{#1}% \addto@pscode{% \pst@intersectdict + \PIT@key@tstop\space dup 0 lt { pop \PIT@name{#1} GetSegmentCount } if + \PIT@key@tstart\space dup 0 lt { pop 0 } if exch + \PIT@name{#1} GetSegmentCount + 2 copy exch dup 3 1 roll + lt exch 0 lt or { exch } if pop \PIT@name{#1} dup IsPath { - \PIT@key@tstart\space\PIT@key@tstop\space + 3 1 roll 2 copy gt { + exch 3 -1 roll dup 4 1 roll GetSegmentCount + dup 4 1 roll exch sub 3 1 roll sub exch + gsave newpath + [ 4 -1 roll aload pop InitTracing + { counttomark 0 eq { exit } if + load exec + } loop + reversepath + GetFullPath ] 3 1 roll + grestore + } if ShowPathPortion }{ - [exch dup - \PIT@key@tstart\space\PIT@key@tstop\space - dup 0 lt { pop 1 } if + [ exch dup 5 -2 roll + 2 copy gt { + exch + 2 copy gt { exch } if + [ 5 -2 roll pop PointArrayToArray aload pop + counttomark -2 4 { 2 roll } for ] ArrayToPointArray dup + 4 2 roll + } if ToUnitInterval Portion { aload pop } forall + % reverse the point order + counttomark -2 4 { 2 roll } for counttomark 2 sub 2 idiv \psk@plotpoints exch @@ -198,6 +228,7 @@ } { \PIT@key@tstart } ifelse + dup 0 lt { pop 0 } if exch % [curve] t_istart|tstart [ts] % dup length \PIT@key@istop\space ge 0 \PIT@key@istop\space lt and { @@ -205,14 +236,35 @@ } { pop \PIT@key@tstop } ifelse - 2 copy 2 copy gt 3 1 roll -1 gt exch -1 gt and and { exch } if + 3 -1 roll dup 4 1 roll GetSegmentCount + 2 copy exch dup 3 1 roll % [curve] tstart tstop cnt tstop cnt tstop + lt exch 0 lt or { exch } if pop % (tstop < 0 | cnt < tstop) 3 -1 roll dup IsPath { 3 1 roll + 2 copy gt { + exch 3 -1 roll dup 4 1 roll GetSegmentCount + dup 4 1 roll exch sub 3 1 roll sub exch + gsave newpath + [ 4 -1 roll aload pop InitTracing + { counttomark 0 eq { exit } if + load exec + } loop + reversepath + GetFullPath ] 3 1 roll + grestore + } if ShowPathPortion }{ [ exch dup 5 -2 roll + exch dup 0 lt { pop 0 } if exch dup 0 lt { pop 1 } if + 2 copy gt { + exch + [ 5 -2 roll pop PointArrayToArray aload pop + counttomark -2 4 { 2 roll } for ] ArrayToPointArray dup + 4 2 roll + } if ToUnitInterval Portion { aload pop } forall counttomark 2 sub 2 idiv |