Home

Download

Features

Screenshots

Handbook

Browse Source

Authors

SourceForge.net Logo
Hosted by SourceForge.net

OSI Certified


Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   Related Pages   Search  

mathfunction.cpp

00001 /***************************************************************************
00002                           mathfunction.cpp  -  description
00003                              -------------------
00004     begin                : Mon Nov 11 2002-03
00005     copyright            : (C) 2002 by Fungmeista
00006     email                : mizunoami44@users.sourceforge.net
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #include "mathfunction.h"
00019 
00020 #include <qapplication.h> //used to continue processing events while waiting for the points
00021 #include <qpoint.h>
00022 #include <qpainter.h>
00023 
00024 #include "expressiongraph.h"
00025 #include "fungparser.h"
00026 
00027 MathFunction::MathFunction(BasicGraph *graph, int expressions) : expression_count(expressions), expression(0), expression2(0)
00028 {
00029     mouseClicks = 0;
00030     resultString = QString();
00031     _active = false;
00032 
00033     basicgraph = graph;
00034     
00035     upperBounds = QPoint();
00036     lowerBounds = QPoint();
00037 }
00038 
00039 MathFunction::~MathFunction()
00040 {
00041 }
00042 
00043 void MathFunction::setResult( QString & s )
00044 {
00045     resultString = s;
00046 }
00047 
00048 int MathFunction::toPixelXCoord(double x_coordinate)
00049 {
00050     return basicgraph->toPixelXCoord(x_coordinate);
00051 }
00052 
00053 int MathFunction::toPixelYCoord(double y_coordinate)
00054 {
00055     return basicgraph->toPixelYCoord(y_coordinate);
00056 }
00057 
00058 double MathFunction::toGraphXCoord(double x_coordinate)
00059 {
00060     return basicgraph->toGraphXCoord(x_coordinate);
00061 }
00062 
00063 double MathFunction::toGraphYCoord(double y_coordinate)
00064 {
00065     return basicgraph->toGraphYCoord(y_coordinate);
00066 }
00067 
00068 double MathFunction::animatorValue()
00069 {
00070     return static_cast<ExpressionGraph*>(basicgraph)->animatorValue();
00071 }
00072 
00073 
00074 void MathFunction::getTwoPoints()
00075 {
00076     qApp->processOneEvent();
00077     if (mouseClicks == CANCEL){return;}
00078     if (mouseClicks == GETLOWERBOUND){getTwoPoints();return;}
00079     if (mouseClicks == GOTLOWERBOUND)
00080     {
00081         lowerBounds.setX( lastClick.x());
00082         lowerBounds.setY( lastClick.y());
00083         arg1 = beta;
00084 
00085         arg1x = beta;
00086         arg2y = beta2;
00087 
00088         basicgraph->repaint(false);
00089         mouseClicks++;
00090     }
00091     if (mouseClicks == GETUPPERBOUND){getTwoPoints();return;}
00092     if (mouseClicks == GOTUPPERBOUND)
00093     {
00094         upperBounds.setX(lastClick.x());
00095         upperBounds.setY(lastClick.y());
00096         arg2 = beta;
00097         
00098         arg2x = beta;
00099         arg2y = beta2;
00100         
00101         //if (upperBounds.x() <= lowerBounds.x()){basicgraph->repaint(false); return;}
00102         if (expression){basicgraph->setTrace(false);}
00103         basicgraph->repaint(false); mouseClicks++;
00104     }
00105     if (mouseClicks == CALCULATE){basicgraph->repaint(false); mouseClicks++;}
00106     if (mouseClicks == CLICKTOCONTINUE){getTwoPoints(); return;}
00107 
00108     basicgraph->repaint(false);
00109 }
00110 
00111 void MathFunction::sendClick(QMouseEvent *, double arg, double arg2)
00112 {
00113     lastClick = basicgraph->getMousePoint();
00114 
00115     beta = arg;
00116     beta2 = arg2;
00117     mouseClicks++;
00118 }
00119 
00120 void MathFunction::drawFunction(QPainter *painter)
00121 {
00122     painter->setPen(QPen(QColor(255,0,0),2));
00123 
00124     if (mouseClicks == 0){painter->drawText(30,basicgraph->height()-20,QObject::tr("Select Lower Bounds"));}
00125     if (mouseClicks == 1 || mouseClicks == 2){drawLeftArrow(painter); painter->drawText(30,basicgraph->height()-20,QObject::tr("Select Upper Bounds"));}
00126     if (mouseClicks == 4)
00127     {
00128         calculate_and_draw(painter);
00129 
00130         drawLeftArrow(painter);
00131         drawRightArrow(painter);
00132 
00133         painter->drawText(LEFTOFFSET,basicgraph->height()-24,resultString);
00134         painter->drawText(LEFTOFFSET,basicgraph->height()-10,QObject::tr("Click to continue..."));
00135     }
00136     if (mouseClicks == 5)
00137     {
00138         draw_stored(painter);
00139 
00140         drawLeftArrow(painter);
00141         drawRightArrow(painter);
00142 
00143         painter->drawText(LEFTOFFSET,basicgraph->height()-24,resultString);
00144         painter->drawText(LEFTOFFSET,basicgraph->height()-10,QObject::tr("Click to continue..."));
00145     }
00146 }
00147 
00148 void MathFunction::exec(FungParser *fp, FungParser *fp2)
00149 {
00150     bool tmpTrace = false;
00151     if (fp)
00152     {
00153         expression = fp;
00154         tmpTrace = basicgraph->isTracing();
00155         basicgraph->setTrace(true);
00156     }
00157 
00158     if (fp2)
00159     {
00160         qDebug("is fp2");
00161         expression2 = fp2;
00162     }
00163 
00164     _active = true;
00165     mouseClicks = GETLOWERBOUND;
00166     basicgraph->repaint(false);
00167     getTwoPoints();
00168 
00169     if (fp)
00170         basicgraph->setTrace(tmpTrace);
00171 
00172     _active = false;
00173     
00174     expression = 0;
00175     expression2= 0;
00176 }
00177 
00178 void MathFunction::cancel()
00179 {
00180     mouseClicks = CANCEL;
00181 }
00182 
00183 void MathFunction::drawSelectedPoint(double x, double y, QPainter *painter)
00184 {
00185     painter->save();
00186     painter->setPen(QPen(QColor(100,200,0),1,Qt::DotLine));
00187     painter->drawLine(toPixelXCoord(x),0,toPixelXCoord(x),basicgraph->height());
00188     painter->drawLine(0,toPixelYCoord(y),basicgraph->width(),toPixelYCoord(y));
00189     painter->fillRect(toPixelXCoord(x)-3,toPixelYCoord(y)-3,6,6,QBrush(QColor(0,100,255),Qt::SolidPattern));
00190     painter->restore();
00191 }
00192 
00193 void MathFunction::drawLeftArrow(QPainter *painter)
00194 {
00195     int x = lowerBounds.x();
00196     int y = lowerBounds.y();
00197 
00198     QPointArray points(3);
00199     points.setPoint(0,x,y);
00200     points.setPoint(1,x-BOUNDS_TRIANGLE*2,y-BOUNDS_TRIANGLE);
00201     points.setPoint(2,x-BOUNDS_TRIANGLE*2,y+BOUNDS_TRIANGLE);
00202 
00203     painter->save();
00204     painter->setPen(QPen(QColor(0,100,255),2));
00205     painter->setBrush(QBrush(QColor(0,100,255),Qt::SolidPattern));
00206     painter->drawPolygon(points);
00207     painter->restore();
00208 }
00209 
00210 void MathFunction::drawRightArrow(QPainter *painter)
00211 {
00212     int x = upperBounds.x();
00213     int y = upperBounds.y();
00214 
00215     QPointArray points(3);
00216     points.setPoint(0,x,y);
00217     points.setPoint(1,x+BOUNDS_TRIANGLE*2,y-BOUNDS_TRIANGLE);
00218     points.setPoint(2,x+BOUNDS_TRIANGLE*2,y+BOUNDS_TRIANGLE);
00219 
00220     painter->save();
00221     painter->setPen(QPen(QColor(0,100,255),2));
00222     painter->setBrush(QBrush(QColor(0,100,255),Qt::SolidPattern));
00223     painter->drawPolygon(points);
00224     painter->restore();
00225 }