# Exemples de la distribution

En cliquant sur une imagette, vous accéderez au source et à l'image. En cliquant sur cette dernière, vous ouvrirez le fichier PDF associé.

sqrt.xp [ source ] [ fermer ]
```/* -*-ePiX-*- */
#include <stdio.h>
#include "epix.h"
using namespace ePiX;

const double MAX=1.25;
const double SQMAX=sqrt(MAX);

// fineness of mesh grid
const int N1=12*MAX;
const int N2=48;

const double du=SQMAX/N1, dv=1.0/N2; // parameter steps for solid surface
const P LIGHT(1, -3, 1); // location of light, for shading

const P VIEWPT(6,-1,5);

private:
P pt1, pt2, pt3, pt4;

double ht;
double distance;

public:
pt1=P();
pt2=P();
pt3=P();
pt4=P();

ht=0;
distance=0;
}

mesh_quad(P f(double u, double v), double u0, double v0) {
pt1=f(u0,v0);
pt2=f(u0+du,v0);
pt3=f(u0+du,v0+dv);
pt4=f(u0,v0+dv);

P center = 0.25*(pt1 + pt2 + pt3 + pt4);
P temp = camera.get_viewpt();

ht=center.x3();
distance = norm(center-temp);
}

double how_far() const { return distance; }
double height() const { return ht; }

void draw() {
P normal = (pt2 - pt1)*(pt4 - pt1);
normal *= 1 / (norm(normal)+0.00005);

double dens  = 0.125+0.8*(1-pow((normal|LIGHT), 2)/(LIGHT|LIGHT));

gray(dens);
}

}; // end of mesh_quad class

// sorting criterion
class by_distance {
public:
{
return arg1.how_far() > arg2.how_far();
}
};

// complex square root in polar coordinates
P sqrt(double u, double v)
{
return polar(u*u, v) + P(0,0,u*Cos(0.5*v));
}

// restrictions of sqrt to real axis, unit circle
P sqrt_re(double t) { return sqrt(t,0); }
P sqrt_im(double t) { return sqrt(1,t); }

main() {
bounding_box(P(-MAX, -MAX), P(MAX, MAX));
unitlength("1in");
picture(4,4);

use_pstricks();
begin();

use_pstricks(false);

revolutions();
label(P(x_min, y_max), P(2,-2), "Branches of \$\\sqrt{z}\$", br);

viewpoint(VIEWPT);
camera.range(4);

circle C1 = circle(); // unit circle

// fill list, sort by distance to the camera
for (int i=0; i<N1; ++i)
for (int j=0; j<N2; ++j)

sort(mesh.begin(), mesh.end(), by_distance());

// draw bottom half of transparent branch
pen(0.15);
green(0.7);
plot(sqrt, domain(P(0,1), P(SQMAX,1.5), Net(N1, 0.5*N2), Net(4*N1, 2*N2)));

plain();
fill();
// draw bottom half of opaque branch
for (int i=0; i<N1*N2; ++i)
if (mesh.at(i).height() < 0)
mesh.at(i).draw();

fill(false);

// boundary curve, unit circle, axes, grid, labels
pen(1.5);

red();
plot(sqrt_re, -SQMAX, 0, 30);

use_pstricks(); // for colored arrows
psset("linewidth=1pt, linecolor=blue, fillcolor=blue");
arrow(P(0,0,0), P(MAX*1.1,0,0));
arrow(P(0,0,0), P(0,MAX*1.1,0));
use_pstricks(false);

blue();
label(P(MAX*1.1,0,0), P(0,-4), "\$\\mathrm{Re}\\,z\$", b);
label(P(0,MAX*1.1,0), P(4, 0), "\$\\mathrm{Im}\\,z\$", r);

// draw top half of opaque branch
black();
plain();
fill();
for (int i=0; i<N1*N2; ++i)
if (mesh.at(i).height() >= 0)
mesh.at(i).draw();

fill(false);

pen(1.5);
yellow();
plot(sqrt_re, 0, SQMAX, 30);

pen(0.15);
green(0.7);
plot(sqrt, domain(P(0,1.5), P(SQMAX,2), Net(N1, 0.5*N2), Net(4*N1, 2*N2)));

end();
}
```