summaryrefslogtreecommitdiff
path: root/metapost
diff options
context:
space:
mode:
Diffstat (limited to 'metapost')
-rw-r--r--metapost/context/base/mpiv/mp-node.mpiv2
-rw-r--r--metapost/context/base/mpiv/mp-tool.mpiv19
-rw-r--r--metapost/context/base/mpiv/mp-tres.mpiv170
3 files changed, 181 insertions, 10 deletions
diff --git a/metapost/context/base/mpiv/mp-node.mpiv b/metapost/context/base/mpiv/mp-node.mpiv
index c84377da1..834a5a01d 100644
--- a/metapost/context/base/mpiv/mp-node.mpiv
+++ b/metapost/context/base/mpiv/mp-node.mpiv
@@ -78,7 +78,7 @@ vardef nodeboundingpoint@#(text t) =
enddef ;
vardef fromto@#(expr d,f)(text t) =
- fromtopaths(d,nodepath,f,nodepath,t)
+ fromtopaths@#(d,nodepath,f,nodepath,t)
enddef ;
% returns a pair suffix if the path is unknown
diff --git a/metapost/context/base/mpiv/mp-tool.mpiv b/metapost/context/base/mpiv/mp-tool.mpiv
index 478680d5e..36d6f1743 100644
--- a/metapost/context/base/mpiv/mp-tool.mpiv
+++ b/metapost/context/base/mpiv/mp-tool.mpiv
@@ -1197,7 +1197,7 @@ vardef perpendicular expr t of p =
enddef ;
def istextext(expr p) =
- (path p and ((substring(0,3) of prescriptpart p) = "tx_"))
+ (picture p and ((substring(0,3) of prescriptpart p) = "tx_"))
enddef ;
primarydef p paralleled d = (
@@ -1714,7 +1714,9 @@ def mfun_with_arrow_picture (text t) =
mfun_arrow_count := 0 ;
mfun_arrow_snippets := stroked_paths(mfun_arrow_picture) ;
for i within mfun_arrow_picture :
- if stroked i :
+ if istextext(i) :
+ draw i
+ else :
mfun_arrow_count := mfun_arrow_count + 1 ;
mfun_arrow_path := pathpart i ;
t
@@ -1743,13 +1745,12 @@ def mfun_draw_arrow_picture_double text t =
fi
mfun_with_arrow_picture (
draw
- if mfun_arrow_count = 1 :
- arrowpath reverse
- fi
- if mfun_arrow_count = mfun_arrow_snippets :
- arrowpath
- fi
- mfun_arrow_path mfun_decoration_i i t ;
+ if mfun_arrow_count = 1 :
+ arrowpath reverse
+ elseif mfun_arrow_count = mfun_arrow_snippets :
+ arrowpath
+ fi
+ mfun_arrow_path mfun_decoration_i i t ;
if mfun_arrow_count = 1 :
fillup arrowhead reverse mfun_arrow_path mfun_decoration_i i t ;
fi
diff --git a/metapost/context/base/mpiv/mp-tres.mpiv b/metapost/context/base/mpiv/mp-tres.mpiv
new file mode 100644
index 000000000..bd8a085a7
--- /dev/null
+++ b/metapost/context/base/mpiv/mp-tres.mpiv
@@ -0,0 +1,170 @@
+%D \module
+%D [ file=mp-tres.mpiv,
+%D version=2017.11.08,
+%D title=\CONTEXT\ \METAPOST\ graphics,
+%D subtitle=Pseudo 3D,
+%D author=Alan Braslau,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
+%C details.
+
+%D This module provides simple 3D->2D projections. The code is an adaption of code
+%D by Urs Oswald, Dr.sc.math.\ ETH as presented in:
+%D
+%D \starttyping
+%D http://www.ursoswald.ch/metapost/tutorial.html.
+%D \stoptyping
+%D
+%D We need a bit more so it got extended.
+
+if known context_three : endinput ; fi ;
+
+boolean context_three ; context_three := true ;
+
+pair mfun_three_xy ; % this avoids the costly save and allocate
+pair mfun_three_yz ;
+pair mfun_three_zx ;
+
+transform Txy ;
+
+def setTxy(expr ori, ang) =
+ begingroup
+ save P, t ;
+ pair P[] ;
+ transform t ;
+
+ P0 = ori ; % origin in MetaPost coordinates (bp)
+ P1 = (left rotated ang) scaled (cosd ang) ; % x axis (in mathematical coordinates)
+
+ % A sort of "cavalier projection".
+
+ % t: maps mathematical 2D coordinates onto MetaPost coordinates.
+
+ t := identity shifted P0 ; % Note: no shift when P0 = origin!
+
+ % Txy: maps the x-y plane of 3D space onto MetaPost coordinates,
+ % z is the vertical (MetaPost y).
+
+ % Txy:=identity
+ % reflectedabout((0,0), (1,1))
+ % yscaled ypart P1
+ % slanted (xpart P1/ypart P1)
+ % transformed t ;
+
+ % Alternatively, defined via Pxy:
+
+ % Pxy is the projection of the 3D plane z=0 onto the mathematical 2D coordinates.
+ % Pxy is determined by 3 e q u a t i o n s describing
+ % how (1,0), (0,1), and (0,0) are mapped
+
+ save Pxy ;
+ transform Pxy ;
+ P1 = (1,0) transformed Pxy ; % Pxy: (1,0) --> P1
+ (1,0) = (0,1) transformed Pxy ; % (0,1) --> (1,0)
+ (0,0) = (0,0) transformed Pxy ; % (0,0) --> (0,0)
+
+ % mathematical 2D coordinates --> MetaPost coordinates
+
+ Txy := Pxy transformed t ;
+ endgroup
+enddef ;
+
+setTxy(origin,60) ;
+
+%D We already define triplet (as rgbcolor synonym) in in \type {mp-tool.mpiv}:
+
+let Xpart = redpart ;
+let Ypart = greenpart ;
+let Zpart = bluepart ;
+
+vardef projection expr t =
+ if triplet t :
+ (Xpart t, Ypart t) transformed Txy shifted (0,Zpart t)
+ elseif pair t :
+ t transformed Txy
+ else :
+ origin transformed Txy
+ fi
+enddef ;
+
+%D This overloads the plain macro \type {abs} (being \type {length}):
+
+vardef abs primary p =
+ if triplet p :
+ sqrt((Xpart p)**2+(Ypart p)**2+(Zpart p)**2)
+ else :
+ length p
+ fi
+enddef ;
+
+primarydef p dotproduct q =
+ ((Xpart p)*(Xpart q) + (Ypart p)*(Ypart q) + (Zpart p)*(Zpart q))
+enddef ;
+
+primarydef p crossproduct q =
+ (
+ (Ypart p)*(Zpart q) - (Zpart p)*(Ypart q),
+ (Zpart p)*(Xpart q) - (Xpart p)*(Zpart q),
+ (Xpart p)*(Ypart q) - (Ypart p)*(Xpart q)
+ )
+enddef ;
+
+primarydef p rotatedaboutX q =
+ hide (
+ mfun_three_yz := (Ypart p, Zpart p) ;
+ mfun_three_yz := mfun_three_yz rotated q ;
+ )
+ (Xpart p, xpart yz, ypart yz)
+enddef ;
+
+primarydef p rotatedaboutY q =
+ hide(
+ mfun_three_zx := (Zpart p, Xpart p) ;
+ mfun_three_zx := mfun_three_zx rotated q ;
+ )
+ (ypart zx, Ypart p, xpart zx)
+enddef ;
+
+primarydef p rotatedaboutZ q =
+ hide (
+ mfun_three_xy := (Xpart p, Ypart p) ;
+ mfun_three_xy := mfun_three_xy rotated q ;
+ )
+ (xpart xy, ypart xy, Zpart p)
+enddef ;
+
+%D We can use a rotation about an arbitrary direction t ... (easy)
+
+% primarydef p rotatedabout(expr t, a) =
+% enddef ;
+
+vardef draw_vector@# (expr v, s) text t =
+ if triplet v :
+ drawarrow projection(Origin) -- projection(v) t ;
+ if string s :
+ label@#(s, projection(v)) t ;
+ fi
+ fi
+enddef ;
+
+%D Some constants...
+
+triplet Origin, Xunitvector, Yunitvector, Zunitvector ;
+
+Origin := (0,0,0) ;
+Xunitvector := (1,0,0) ;
+Yunitvector := (0,1,0) ;
+Zunitvector := (0,0,1) ;
+
+%D We could do but don't:
+
+% let normalxpart = xpart ;
+% let normalypart = ypart ;
+
+% vardef xpart expr p = if triplet p : redpart else : normalxpart fi p enddef ;
+% vardef ypart expr p = if triplet p : greenpart else : normalypart fi p enddef ;
+% vardef zpart expr p = bluepart p enddef ;
+