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") */