using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ciloci.Flee;
using ZedGraph;
using System.Drawing;
using NCalc;
namespace Určitý_Integrál
{
class Middle
{
public double hodnotaFunkceMiddle(string textFunkce, double sirkaObdelnikuZ, double spodniHraniceZ, int pocetObdelnikuZ, double horniHraniceZ)
{
// vytvoreni a zkopilovani vyrazu
ExpressionContext context = new ExpressionContext();
context.Imports.AddType(typeof(Math));
context.Variables["x"] = (double)0; // vytvoreni promenne, na hodnote nezalezi
IGenericExpression<double> eGeneric = context.CompileGeneric<double>(textFunkce);
/*
Expression context = new Expression(textFunkce);
context.Parameters["x"] = (double)0;
*/
double celkovyObsah = 0; // vsech obdelniku
double stredObdelniku = spodniHraniceZ + sirkaObdelnikuZ / 2; // stred prvniho obdelniku
for (int i = 0; i < pocetObdelnikuZ; i++)
{
// pro kazdy obdelnik
context.Variables["x"] = stredObdelniku; // dosazeni hodnoty
double hodnotaFunkceVeStreduObdelniku = eGeneric.Evaluate(); // hodnota v bode, kde pritona funkce stred obdelnika
double obsahObdelniku = hodnotaFunkceVeStreduObdelniku * sirkaObdelnikuZ; // obsah obdelnicku
celkovyObsah += obsahObdelniku;
stredObdelniku += sirkaObdelnikuZ; // stred dalsiho obdelniku
}
return celkovyObsah;
}
public void CreateGraphMiddle(ZedGraphControl zgc, string textFunkce, double sirkaObdelnikuZ, double spodniHraniceZ, int pocetObdelnikuZ, double horniHraniceZ)
{
zgc.GraphPane.CurveList.Clear();
// vytvoreni a zkopirovani vyrazu
ExpressionContext context = new ExpressionContext();
context.Imports.AddType(typeof(Math));
context.Variables["x"] = (double)0; // vytvoreni promenne, na hodnote nezalezi
IGenericExpression<double> eGeneric = context.CompileGeneric<double>(textFunkce);
GraphPane myPane = zgc.GraphPane;
myPane.Title.Text = "Graf funkce: " + textFunkce;
myPane.XAxis.Title.Text = "x";
myPane.YAxis.Title.Text = "y";
PointPairList list1 = new PointPairList(); // puvodni funkce
PointPairList list2 = new PointPairList(); // aproximace (obdelniky)
double stredObdelniku = spodniHraniceZ + sirkaObdelnikuZ / 2; // stred prvniho obdelniku
for (int i = 0; i < pocetObdelnikuZ; i++)
{
// pro kazdy obdelnik
context.Variables["x"] = stredObdelniku; // dosazeni hodnoty
double hodnotaFunkceVeStreduObdelniku = eGeneric.Evaluate(); // hodnota v bode, kde pritona funkce stred obdelnika
list1.Add(stredObdelniku, hodnotaFunkceVeStreduObdelniku);
list2.Add(stredObdelniku - sirkaObdelnikuZ / 2, hodnotaFunkceVeStreduObdelniku);
list2.Add(stredObdelniku + sirkaObdelnikuZ / 2, hodnotaFunkceVeStreduObdelniku);
stredObdelniku += sirkaObdelnikuZ; // stred dalsiho obdelniku
}
LineItem myCurve = myPane.AddCurve("Funkce", list1, Color.Red, SymbolType.Circle);
LineItem myCurve2 = myPane.AddCurve("Aproximace", list2, Color.Blue, SymbolType.None);
myCurve2.Line.Fill = new Fill(Color.White, Color.Red, 45F);
zgc.AxisChange();
zgc.RestoreScale(myPane);
}
}
}