1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
/* Simple capillary surface */
#include<sstream>
#include<iostream>
#include<cmath>
using namespace std;
string mpoint(double x, double y) {
ostringstream pointstring;
pointstring.setf(ios_base::fixed,ios_base::floatfield);
pointstring.precision(5);
pointstring << '(' << x << ',' << y << ')';
return pointstring.str();
}
double arccosh(double x) {
return log(x + sqrt(x*x-1));
}
double capillary(double z, double h, double d) {
return arccosh(2.0*d/z) - arccosh(2.0*d/h)
+ sqrt(4.0 - h*h/(d*d)) - sqrt(4.0 - z*z/(d*d));
}
const double pi = 3.1415926535897932384626433832795;
int main() {
double theta = pi/6.0;
double d = 1.0;
double h = sqrt(2.0 * d*d * (1.0 - sin(theta)));
double y, z;
double zmax = h; double zmin = -0.5;
double ymax = capillary(0.03*h,h,d);
cout << "picture capillary.fplot; capillary.fplot := nullpicture;\n";
cout << "addto capillary.fplot contour " << mpoint(0.0,1.0);
for(int i=99;i>2;i--) {
z = (i/100.0) * h;
y = capillary(z,h,d);
cout << " .. " << mpoint(y/ymax,(z-zmin)/(zmax-zmin));
}
cout << " -- " << mpoint(1.0,0.0);
cout << " -- " << mpoint(0.0,0.0);
cout << " -- cycle;\n\n";
cout << "picture capillary.lplot; capillary.lplot := nullpicture;\n";
cout << "addto capillary.lplot doublepath " << mpoint(0.0,1.0);
for(int i=99;i>2;i--) {
z = (i/100.0) * h;
y = capillary(z,h,d);
cout << " .. " << mpoint(y/ymax,(z-zmin)/(zmax-zmin));
}
cout << ";\n\n";
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.precision(5);
cout << "numeric capillary.xleft; ";
cout << "capillary.xleft = 0.0;\n";
cout << "numeric capillary.xright; ";
cout << "capillary.xright = " << ymax << ";\n";
cout << "numeric capillary.ybot; ";
cout << "capillary.ybot = " << zmin << ";\n";
cout << "numeric capillary.ytop; ";
cout << "capillary.ytop = " << zmax << ";\n\n";
cout << "pair capillary.contactpoint; ";
cout << "capillary.contactpoint = (0.0, 1.0);\n";
cout << "numeric capillary.contactangle; ";
cout << "capillary.contactangle = " << theta * 180/pi << ";\n";
}
|