From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- graphics/epix/samples/extract.xp | 109 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 graphics/epix/samples/extract.xp (limited to 'graphics/epix/samples/extract.xp') diff --git a/graphics/epix/samples/extract.xp b/graphics/epix/samples/extract.xp new file mode 100644 index 0000000000..b061df18db --- /dev/null +++ b/graphics/epix/samples/extract.xp @@ -0,0 +1,109 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +// a benign function +double phi(double x) +{ + return x*x; +} + +// and its derivative +Deriv dphi(phi); + +// parameters defining an arbitrary line ell +const double slope(-2); +const double beta(0.5); + +const double ht(phi(beta)); +const double alpha(slope-dphi.eval(beta)); + +const double eps(0.02); // size of extraction + +// a small perturbation to adjust the derivative +double f(double x) +{ + return x/(1+16384*x*x); +} + +double gn(double x) +{ + return f(alpha*(x-beta)); +} + +// phi's Evil Twin +double psi(double x) +{ + return phi(x) + gn(x); +} + +// inset parameters +const P mag_ctr(P(0.75, 0.2)); +const double mag_sz(0.125); + +int main() +{ + picture(P(0,0), P(1,0.75), "4x3in"); + + begin(); + set_crop(); + + // two nearly-equal graphs, and the tangent to one of them + plain(Blue()); + plot(psi, xmin(), beta-eps, 60); + plot(psi, beta+eps, xmax(), 60); + plot(psi, beta-eps, beta+eps, 60); + + pen(Green(0.6)); + Line(P(beta,phi(beta)), slope); + + bold(Red()); + plot(phi, xmin(), xmax(), 60); + plain(); + + // cut out a small neighborhood and magnify it + screen mag(canvas().extract_ellipse(P(beta-eps, psi(beta)-eps), + P(beta+eps, psi(beta)+eps))); + mag.backing(Yellow(0.05)); + mag.border(Black(), "0.4pt"); + + inset(mag, mag_ctr - mag_sz*P(1,1), mag_ctr + mag_sz*P(1,1)); + + pen(Black()); + // axes + line(P(xmin(),0), P(xmax(),0)); + line(P(0,ymin()), P(0,ymax())); + + // indicators + line(P(beta,0), P(beta,phi(beta)), -20); // shorten slightly + line(P(0,phi(beta)), P(beta,phi(beta)), -10); + + // zoom lines + line(P(beta, phi(beta)), mag_ctr + polar(mag_sz, 2*M_PI/3), -20); + line(P(beta, phi(beta)), mag_ctr + polar(mag_sz, 5*M_PI_4), -20); + + font_size("footnotesize"); + label(P(beta,0), P(0,-4), "$\\beta$", b); + label(P(0,phi(beta)), P(-4,0), "$b$", l); + + // use mag_ctr to place inset labels + red(); + label(P(beta+0.1,phi(beta+0.1)), P(-2,2), "$\\varphi$",tl); + label(mag_ctr, P(0,6), "$\\varphi$",tr); + + blue(); + label(P(beta+0.1,psi(beta+0.1)), P(2,-2), "$\\psi$",br); + label(mag_ctr, P(8,-2), "$\\psi$",br); + + green(0.6); + label(P(beta-0.1,ht-0.1*slope), P(2,2), "$\\ell$",tr); + label(mag_ctr, P(-12,20), "$\\ell$", bl); + + black(); + // a large label + label_border(Blue(), "0.2pt"); + masklabel(P(0.5*(xmin()+xmax()), ymax()), P(0,0), + "\\begin{minipage}{2.25in}A graph with unexpected tangent line\\end{minipage}", b); + + end(); +} -- cgit v1.2.3