|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
/*
* This file:
* http://anggtwu.net/myqdraw/mydraw3d.mac.html
* http://anggtwu.net/myqdraw/mydraw3d.mac
* (find-angg "myqdraw/mydraw3d.mac")
* Author: Eduardo Ochs <eduardoochs@gmail.com>
*
* (defun e () (interactive) (find-angg "myqdraw/mydraw3d.mac"))
*
* Introduction
* ============
* `qdraw' is a front-end for `draw2d'. Its main part is a translator,
* `qdraw1', that is implemented as a big `case' - look:
*
* (find-myqdrawfile "qdraw.mac" "qdraw1([qda]) :=")
* (find-myqdrawfile "qdraw.mac" "qdraw1([qda]) :=" "local (goodargs,")
* (find-myqdrawfile "qdraw.mac" "case lw")
* (find-myqdrawfile "qdraw.mac" "case lw" "if qtop = lw then")
*
* `myqdraw' is my front-end for `qdraw'. Look:
*
* (find-myqdrawfile "myqdraw3.mac")
* (find-myqdrawfile "myqdraw3.mac" "but it flattens its arguments")
*
* This file, `mydraw3d.mac' is an attempt to implement something
* similar to `qdraw'/`mywdraw', but for `draw3d', and using an
* associative array - `mydraw3d_translate_op' - instead of a big
* `case'.
*
* «.array» (to "array")
* «.array-tests» (to "array-tests")
* «.core» (to "core")
* «.core-tests» (to "core-tests")
* «.options» (to "options")
* «.numerozinhos» (to "numerozinhos")
* «.numerozinhos-tests» (to "numerozinhos-tests")
* «.addz» (to "addz")
* «.addz-tests» (to "addz-tests")
* «.surface» (to "surface")
* «.surface-tests» (to "surface-tests")
* «.squares» (to "squares")
* «.squares-tests» (to "squares-tests")
* «.topdf» (to "topdf")
* «.topdf-test» (to "topdf-test")
* «.flipbook-anim» (to "flipbook-anim")
*/
/* «array» (to ".array")
* (find-maximanode "arrayinfo")
*/
array_keys(a) := map('first,rest(rest(apply('arrayinfo,[a]))));
array_has (a,k) := member(k, array_keys(a));
array_get (a,k) := subvar(a,k);
/* «array-tests» (to ".array-tests")
*
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
aa['bb] : "bbb";
aa['cc] : "ccc";
array_keys( aa);
array_keys('aa);
array_has ('aa, 'bb);
array_has ('aa, 'dd);
array_get ('aa, 'bb);
array_get ('aa, 'dd);
*/
/* «core» (to ".core")
*/
mydraw3d ([os]) := apply('draw3d, mydraw3d_translate(os));
mydraw3d_translate ([os]) := flatten([map('mydraw3d_translate_1, flatten([os]))]);
mydraw3d_translate_1 (o) :=
if array_has(mydraw3d_translate_op,op(o))
then apply(mydraw3d_translate_op[op(o)], args(o))
else error(format("mydraw3d_translate_op[~a] failed", string(op(o))));
mydraw3d_equal (a,b) := a=b;
mydraw3d_transpose0 (m) := args(transpose(apply('matrix, m)));
mydraw3d_polyline (xyzs) :=
[points_joined = true,
point_type = -1,
apply('points, mydraw3d_transpose0(xyzs))];
mydraw3d_translate_op["="] : 'mydraw3d_equal;
mydraw3d_translate_op['polyline] : 'mydraw3d_polyline;
/* «core-tests» (to ".core-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
array_keys( mydraw3d_translate_op);
array_keys('mydraw3d_translate_op);
mydraw3d_equal(a,b) := b=a;
mydraw3d_equal(a,b) := a=b;
mydraw3d_equal (4,5);
mydraw3d_translate_op["="];
mydraw3d_translate_op["="](4,5);
mydraw3d_translate_1 (4=5);
mydraw3d_translate (4=5);
mydraw3d_translate (2=3, [4=5], [[6=7, 8=9]]);
mydraw3d_polyline ([[1,2,3],[4,5,6]]);
mydraw3d_translate_op['polyline];
mydraw3d_translate (polyline([[1,2,3],[4,5,6]]));
*/
/* «options» (to ".options")
* (find-maximanode "proportional_axes" "xyz")
* (find-maximanode "axis_3d")
* (find-maximanode "surface_hide")
*/
mydraw3d_prop () := 'proportional_axes='xyz;
mydraw3d_noaxes() := 'axis_3d=false;
mydraw3d_hide () := 'surface_hide=true;
mydraw3d_translate_op['prop] : 'mydraw3d_prop;
mydraw3d_translate_op['noaxes] : 'mydraw3d_noaxes;
mydraw3d_translate_op['hide] : 'mydraw3d_hide;
/* «numerozinhos» (to ".numerozinhos")
*/
numerozinhos(expr) ::=
apply(matrix,
makelist(makelist(ev(expr), x, xmin,xmax),
y, seqby(ymax,ymin,-1)))$
/* «numerozinhos-tests» (to ".numerozinhos-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
[xmin,ymin, xmax,ymax] : [0,0, 4,3];
numerozinhos([x,y]);
*/
/* «addz» (to ".addz")
*/
mydraw3d_z (x,y) := 0; /* dummy */
mydraw3d_addz (xy) := [xy[1],xy[2],mydraw3d_z(xy[1],xy[2])];
mydraw3d_addzs (xys) := map('mydraw3d_addz, xys);
mydraw3d_polyline_xy (xys) := mydraw3d_polyline(mydraw3d_addzs(xys));
mydraw3d_polyline_xy_3(P,v,ts) := mydraw3d_polyline_xy(makelist(P+t*v, t, ts));
mydraw3d_translate_op['polyline_xy] :
'mydraw3d_polyline_xy;
mydraw3d_translate_op['polyline_xy_3] :
'mydraw3d_polyline_xy_3;
/* «addz-tests» (to ".addz-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
q(t) := max(0, t-2);
r(t) := min(q(t), 2);
S(x,y) := max(r(x), r(y));
mydraw3d_z(x,y) := S(x,y);
mydraw3d_addz([3,4]);
mydraw3d_addzs([[1,2],[3,4]]);
mydraw3d_polyline_xy([[1,2],[3,4]]);
line_at_x(x) := polyline_xy_3([x,0], [0,1], seq(0,6));
line_at_y(y) := polyline_xy_3([0,y], [1,0], seq(0,6));
lines_at_xs() := map('line_at_x, seq(0,6));
lines_at_ys() := map('line_at_y, seq(0,6));
lines_diag() := polyline_xy_3([2,2], [1,1], seq(0,2));
drawing : [lines_at_xs(), lines_at_ys(), lines_diag()];
mydraw3d(drawing);
mydraw3d(drawing, axis_3d=false, proportional_axes=xyz);
*/
/* «surface» (to ".surface")
* (find-maximanode "explicit")
* (find-maximanode "xu_grid")
*/
mydraw3d_surface () := explicit(mydraw3d_z(x,y), x,xmin,xmax, y,ymin,ymax);
mydraw3d_translate_op['surface] :
'mydraw3d_surface;
/* «surface-tests» (to ".surface-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
[xmin,ymin, xmax,ymax] : [0,0, 6,6];
q(t) := max(0, t-2);
r(t) := min(q(t), 2);
S(x,y) := max(r(x), r(y));
mydraw3d_z(x,y) := S(x,y);
mydraw3d(surface());
mydraw3d(surface(), surface_hide=true);
mydraw3d(surface(), surface_hide=true, xu_grid=10, yv_grid=50);
numerozinhos(S(x,y));
*/
/* «squares» (to ".squares")
*/
mydraw3d_square(xy_sw) := block(
[xy_nw,xy_ne,xy_se, xy_m, z_nw,z_ne,z_sw,z_se, z_m, good_se,good_ne],
xy_nw : xy_sw + [0,1],
xy_ne : xy_sw + [1,1],
xy_se : xy_sw + [1,0],
xy_m : xy_sw + [1/2,1/2],
z_nw : apply('mydraw3d_z, xy_nw),
z_ne : apply('mydraw3d_z, xy_ne),
z_sw : apply('mydraw3d_z, xy_sw),
z_se : apply('mydraw3d_z, xy_se),
z_m : apply('mydraw3d_z, xy_m),
good_se : is((z_nw-z_m) = (z_m-z_se)),
good_ne : is((z_ne-z_m) = (z_m-z_sw)),
[z_nw, z_ne, z_sw, z_se, z_m, good_se, good_ne],
if good_se and good_ne then polyline_xy([xy_nw,xy_ne,xy_se,xy_sw,xy_nw])
elseif good_ne then [polyline_xy([xy_nw,xy_ne,xy_sw,xy_nw]),
polyline_xy([xy_ne,xy_se,xy_sw,xy_ne])]
elseif good_se then [polyline_xy([xy_nw,xy_ne,xy_se,xy_nw]),
polyline_xy([xy_nw,xy_sw,xy_se,xy_nw])]
else []
);
mydraw3d_squares() :=
create_list(mydraw3d_square([x,y]),
x,seq(xmin,xmax-1),
y,seq(ymin,ymax-1));
/* «squares-tests» (to ".squares-tests")
** (find-es "maxima" "2024.2-C3-piramide")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
[xmin,ymin, xmax,ymax] : [0,0, 10,10];
p(t) := min(t-2,8-t);
q(t) := max(0,p(t));
R(x,y) := min(q(x),q(y));
mydraw3d_z(x,y) := R(x,y);
mydraw3d(mydraw3d_squares(), noaxes(), prop());
mydraw3d(surface(), noaxes(), prop());
W(x,y) := max(-6+x+y, 1);
S(x,y) := min(R(x,y), W(x,y));
mydraw3d_z(x,y) := S(x,y);
mydraw3d(mydraw3d_squares(), noaxes(), prop());
mydraw3d(mydraw3d_squares(), noaxes(), prop(), view=[40,19]);
mydraw3d(surface(), noaxes(), prop());
mydraw3d(surface(), noaxes(), prop(), hide());
*/
/* «topdf» (to ".topdf")
* (find-myqdraw "topdf2.mac" "myqdrawp")
* (find-myqdraw "topdf2.mac" "myqdrawp" "myqdrawp ([qargs])")
* (find-myqdraw "topdf2.mac" "more")
*/
mydraw3dp ([drargs]) := (topdf_incr(), topdf_ret(mydraw3d(topdf_more_body(), drargs)));
/* «topdf-test» (to ".topdf-test")
* (find-sh0 "ls -lAF /tmp/frame*")
* (find-sh0 "rm -v /tmp/frame*")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
load("topdf2.mac");
mydraw3dp ([drargs]) := (topdf_incr(), topdf_ret(mydraw3d(topdf_more_body(), drargs)));
[topdf_a,topdf_b,topdf_c,topdf_n] : ["/tmp/", "", "frame", 0];
[xmin,ymin, xmax,ymax] : [0,0, 6,6];
q(t) := max(0, t-2);
r(t) := min(q(t), 2);
S(x,y) := max(r(x), r(y));
mydraw3d_z(x,y) := S(x,y);
drawing() := [mydraw3d_squares(), noaxes(), prop()];
myqdrawp_to_screen();
myqdrawp_to_new_pdf();
mydraw3dp(drawing(), view=[40,19]);
mydraw3dp(drawing(), view=[40,20]);
mydraw3dp(drawing(), view=[40,21]);
mydraw3dp(drawing(), view=[40,22]);
** «flipbook-anim» (to ".flipbook-anim")
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
add_1zs () { for i in $*; do echo $i 1-z; done; }
cutext () { echo $1 | rev | cut -f2- -d. | rev; }
jpgtogif () { echo convert $1 $(cutext $1).gif;
convert $1 $(cutext $1).gif; }
jpgstogifs () { for i in $*; do jpgtogif $i; done; }
rm -fv /tmp/frame_*.jpg
rm -fv /tmp/frames*.pdf
rm -fv /tmp/frame*.gif
ls -lAF /tmp/frame*
add_1zs /tmp/frame_*.pdf
qpdf --empty --pages $(add_1zs /tmp/frame_*.pdf) -- /tmp/frames.pdf
pdftoppm -jpeg -jpegopt quality=80 -r 150 -sep _ /tmp/frames.pdf /tmp/frame
jpgstogifs /tmp/frame*.jpg
gifsicle --colors 256 --loop --delay 20 /tmp/frame_*.gif > /tmp/frames.gif
rm -fv /tmp/frame_*.jpg
rm -fv /tmp/frame_*.gif
ls -lAF /tmp/frame*
# (find-pdf-page "/tmp/frames.pdf")
# (brg "file:///tmp/frames.gif")
*/