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  

meanvaluefunction.cpp

00001 /***************************************************************************
00002                           meanvaluefunction.cpp  -  description
00003                              -------------------
00004     begin                : Sun Dec 29 2002
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 "meanvaluefunction.h"
00019 
00020 #include <qpainter.h>
00021 #include <qpoint.h>
00022 #include <qobject.h>
00023 
00024 #include "basicgraph.h"
00025 #include "fungparser.h"
00026 
00027 MeanValueFunction::MeanValueFunction(BasicGraph *graph,int expressions) : MathFunction(graph,expressions)
00028 {
00029 }
00030 MeanValueFunction::~MeanValueFunction()
00031 {
00032 }
00033 
00034 void MeanValueFunction::calculate_and_draw(QPainter* painter)
00035 {
00036     if ( lowerBounds.x() > upperBounds.x() ) //bounds check
00037     {
00038         QString s( QObject::tr("Invalid bounds") );
00039         setResult( s );
00040         return;
00041     }
00042 
00043     found = false;
00044     double slope = (toGraphYCoord(upperBounds.y()) - toGraphYCoord(lowerBounds.y())) / (toGraphXCoord(upperBounds.x()) - toGraphXCoord(lowerBounds.x()));
00045     for(int i=lowerBounds.x(); i<=upperBounds.x(); i++)
00046     {
00047         double x = toGraphXCoord(i);
00048         double x_next = toGraphXCoord(i+1);
00049 
00050         double d[] = {x,animatorValue()};
00051         double d_next[] = {x_next,animatorValue()};
00052 
00053         double y = expression->Eval(d);
00054         double y_next = expression->Eval(d_next);
00055 
00056         double slope_search = (y - y_next) / (x - x_next);
00057         if ( (slope_search <= slope + 0.1) && (slope_search >= slope - 0.1) )
00058         {
00059             point_x = x;
00060             point_y = y;
00061             found = true;
00062             break;
00063         }
00064     }
00065 
00066     double b = -(slope * point_x - point_y);
00067 
00068     double _x1 = toGraphXCoord(0);
00069     double _y1 = _x1*slope + b;
00070 
00071     double _x2 = toGraphXCoord(basicgraph->width());
00072     double _y2 = _x2*slope + b;
00073 
00074     x1 = toPixelXCoord(_x1);
00075     y1 = toPixelYCoord(_y1);
00076     x2 = toPixelXCoord(_x2);
00077     y2 = toPixelYCoord(_y2);
00078 
00079     if (found)
00080     {
00081         QString s = QString(QObject::tr("Mean Value = %1")).arg(point_x);
00082         setResult(s);
00083     }
00084     else
00085     {
00086         QString s = QObject::tr("None found");
00087         setResult(s);
00088     }
00089 
00090     draw_stored(painter);
00091 }
00092 
00093 void MeanValueFunction::draw_stored(QPainter* painter)
00094 {
00095     if (found)
00096     {
00097         painter->drawLine(x1,y1,x2,y2); //draw a line tangent to the point found
00098         drawSelectedPoint(point_x,point_y,painter);
00099     }
00100 }