summaryrefslogtreecommitdiff
path: root/graphics/epix/samples/extract.xp
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/epix/samples/extract.xp
Initial commit
Diffstat (limited to 'graphics/epix/samples/extract.xp')
-rw-r--r--graphics/epix/samples/extract.xp109
1 files changed, 109 insertions, 0 deletions
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();
+}