00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <SeExpression.h>
00011 #include <cstdlib>
00012 #include <cstdio>
00013 #include <cstring>
00017
00018 class GrapherExpr:public SeExpression
00019 {
00020 public:
00022 GrapherExpr(const std::string& expr)
00023 :SeExpression(expr)
00024 {}
00025
00027 void setX(double x_input)
00028 {x.val=x_input;}
00029
00030 private:
00032 struct SimpleVar:public SeExprScalarVarRef
00033 {
00034 double val;
00035 void eval(const SeExprVarNode* ,SeVec3d& result)
00036 {result[0]=val;}
00037 };
00038
00040 mutable SimpleVar x;
00041
00043 SeExprVarRef* resolveVar(const std::string& name) const
00044 {
00045 if(name == "x") return &x;
00046 return 0;
00047 }
00048 };
00049
00050
00051
00052 int main(int argc,char *argv[])
00053 {
00054 std::string exprStr="\
00055 $val=.5*PI*x;\
00056 7*sin(val)/val \
00057 ";
00058 if(argc == 2){
00059 exprStr=argv[1];
00060 }
00061 GrapherExpr expr(exprStr);
00062
00063 if(!expr.isValid()){
00064 std::cerr<<"expression failed "<<expr.parseError()<<std::endl;
00065 exit(1);
00066 }
00067 double xmin=-10,xmax=10,ymin=-10,ymax=10;
00068 int w=60,h=30;
00069 char *buffer=new char[w*h];
00070 memset(buffer,(int)' ',w*h);
00071
00072
00073 int j_zero=(-ymin)/(ymax-ymin)*h;
00074 if(j_zero>=0 && j_zero<h){
00075 for(int i=0;i<w;i++){
00076 buffer[i+j_zero*w]='-';
00077 }
00078 }
00079
00080 int i_zero=(-xmin)/(xmax-xmin)*w;
00081 if(i_zero>=0 && i_zero<w){
00082 for(int j=0;j<h;j++){
00083 buffer[i_zero+j*w]='|';
00084 }
00085 }
00086
00087
00088 const int samplesPerPixel=10;
00089 const double one_over_samples_per_pixel=1./samplesPerPixel;
00090 for(int i=0;i<w;i++){
00091 for(int sample=0;sample<samplesPerPixel;sample++){
00092
00093 double dx=double(sample)*one_over_samples_per_pixel;
00094 double x=double(dx+i)/double(w)*(xmax-xmin)+xmin;
00095
00096 expr.setX(x);
00097
00098 SeVec3d val=expr.evaluate();
00099 double y=val[0];
00100
00101 int j=(y-ymin)/(ymax-ymin)*h;
00102
00103 if(j>=0 && j<h)
00104 buffer[i+j*w]='#';
00105 }
00106 }
00107
00108
00109 for(int j=h-1;j>=0;j--){
00110 for(int i=0;i<w;i++){
00111 std::cout<<buffer[i+j*w];
00112 }
00113 std::cout<<std::endl;
00114 }
00115
00116 return 0;
00117 }