public void DrawIntegr(ref Grid gr, Fraction a, Fraction b, int res = 100) { int por = this.NCol - 2; int row = 1; Fraction xfrMin = new Fraction(); Fraction yfrMin = new Fraction(); Fraction xfrMax = new Fraction(); Fraction yfrMax = new Fraction(); //Fraction xfr0 = new Fraction((int)((gr.Width - 20) / 2), 1); //Fraction yfr0 = new Fraction((int)((gr.Height - 20) / 2), 1); xfrMin = this.matr.A[1, 0].CopyFr; //yfrMin.FractTxt = this.txtBxs[1, 1].Text; //double yMin = yfrMin.ToDouble(); Fraction h = new Fraction(); xfrMax = this.matr.A[this.NRow - 1, 0].CopyFr; //double xMax = xfrMax.ToDouble(); yfrMax = this.matr.A[this.NRow - 1, 1].CopyFr; yfrMin = this.matr.A[1, 1].CopyFr; for (Fraction i = xfrMin; i <= xfrMax; i += (xfrMax - xfrMin) / 50) { if (GetPolyNewtonVal(i, por, row) >= yfrMax) { yfrMax = GetPolyNewtonVal(i, por, row); } } for (Fraction i = xfrMin; i <= xfrMax; i += (xfrMax - xfrMin) / 50) { if (GetPolyNewtonVal(i, por, row) < yfrMin) { yfrMin = GetPolyNewtonVal(i, por, row); } } CoordAxis axis = new CoordAxis(ref gr, xfrMin.ToDouble(), xfrMax.ToDouble(), yfrMin.ToDouble(), yfrMax.ToDouble(), 10); //Fraction yMult = new Fraction((int)((gr.Height - 20) * 1000), 1000); h = (b - a) / res; PointCollection pc = new PointCollection(); for (Fraction i = a; i <= b; i += h) { //pc.Add(new System.Windows.Point((xfr0 + i*xMult).ToDouble(), (yfr0 - GetPolyNewtonVal(i, por, row)*yMult).ToDouble())); pc.Add(axis.ConvertCoord(i.ToDouble(), GetPolyNewtonVal(i, por, row).ToDouble())); } //double wdt = gr.Width - 20; //double hgt = gr.Height - 20; PointCollection pgPt = new PointCollection(); pgPt.Add(axis.ConvertCoord(a.ToDouble(), 0)); foreach (Point pt in pc) { pgPt.Add(pt); } pgPt.Add(axis.ConvertCoord(b.ToDouble(), 0)); Polygon pg = new Polygon(); pg.Points = pgPt; pg.Fill = Brushes.Pink; gr.Children.Add(pg); }
public void DrawPolynom(ref Grid gr, int por, Fraction x, int row = 1, int res = 100) { Fraction xfrMin = new Fraction(); Fraction yfrMin = new Fraction(); Fraction xfrMax = new Fraction(); Fraction yfrMax = new Fraction(); xfrMin = this.matr.A[1, 0].CopyFr; yfrMin = this.matr.A[1, 1].CopyFr; //double yMin = yfrMin.ToDouble(); Fraction h = new Fraction(); xfrMax = this.matr.A[this.NRow - 1, 0].CopyFr; //double xMax = xfrMax.ToDouble(); yfrMax = this.matr.A[this.NRow - 1, 1].CopyFr; for (Fraction i = xfrMin; i <= xfrMax; i += (xfrMax - xfrMin) / res) { if (GetPolyNewtonVal(i, por, row) >= yfrMax) { yfrMax = GetPolyNewtonVal(i, por, row); } } for (Fraction i = xfrMin; i <= xfrMax; i += (xfrMax - xfrMin) / res) { if (GetPolyNewtonVal(i, por, row) < yfrMin) { yfrMin = GetPolyNewtonVal(i, por, row); } } CoordAxis axis = new CoordAxis(ref gr, xfrMin.ToDouble(), xfrMax.ToDouble(), yfrMin.ToDouble(), yfrMax.ToDouble(), 10); axis.DrawAxis(); //Fraction xMult = new Fraction((int)((gr.Width - 20)*1000), 1000); //xMult /= xfrMax*2; //Fraction yMult = new Fraction((int)((gr.Height - 20)*1000), 1000); //yMult /= yfrMax*2; h = (xfrMax - xfrMin) / res; Polyline pl = new Polyline(); Ellipse el = new Ellipse(); el.HorizontalAlignment = HorizontalAlignment.Left; el.VerticalAlignment = VerticalAlignment.Top; el.Width = 8; el.Height = 8; Point valXY = axis.ConvertCoord(x.ToDouble(), (GetPolyNewtonVal(x, por, row).ToDouble())); System.Windows.Thickness th = new System.Windows.Thickness(valXY.X - el.Width / 2, valXY.Y - el.Height / 2, 0, 0); el.Margin = th; el.Stroke = Brushes.Red; el.Fill = Brushes.Red; PointCollection pc = new PointCollection(); for (Fraction i = xfrMin; i <= xfrMax; i += h) { //pc.Add(new System.Windows.Point((xfr0 + i*xMult).ToDouble(), (yfr0 - GetPolyNewtonVal(i, por, row)*yMult).ToDouble())); pc.Add(axis.ConvertCoord(i.ToDouble(), GetPolyNewtonVal(i, por, row).ToDouble())); } pl.Points = pc; pl.Stroke = Brushes.Blue; pl.StrokeThickness = 4; double wdt = gr.Width - 20; double hgt = gr.Height - 20; Line xVal = new Line(); //xVal.X1 = (xfr0 + x * xMult).ToDouble(); xVal.X1 = axis.ConvertCoord(x.ToDouble(), GetPolyNewtonVal(x, por, row).ToDouble()).X; xVal.Y1 = axis.ConvertCoord(x.ToDouble(), GetPolyNewtonVal(x, por, row).ToDouble()).Y; xVal.X2 = xVal.X1; xVal.Y2 = axis.crossAxis.Y; xVal.Stroke = Brushes.Red; xVal.StrokeDashArray = new DoubleCollection() { 8, 4 }; Line yVal = new Line(); yVal.X1 = axis.ConvertCoord(x.ToDouble(), GetPolyNewtonVal(x, por, row).ToDouble()).X; yVal.Y1 = axis.ConvertCoord(x.ToDouble(), GetPolyNewtonVal(x, por, row).ToDouble()).Y; yVal.X2 = axis.crossAxis.X; yVal.Y2 = yVal.Y1; yVal.Stroke = Brushes.Red; yVal.StrokeDashArray = new DoubleCollection() { 8, 4 }; gr.Children.Add(pl); gr.Children.Add(xVal); gr.Children.Add(yVal); TextBox valX = new TextBox(); valX.Text = "" + x.ToDouble(); valX.Width = 100; valX.Height = 25; valX.HorizontalAlignment = HorizontalAlignment.Left; valX.VerticalAlignment = VerticalAlignment.Top; TextBox valY = new TextBox(); valY.Text = "" + GetPolyNewtonVal(x, por, row).ToDouble(); valY.Width = 200; valY.Height = 25; valY.HorizontalAlignment = HorizontalAlignment.Left; valY.VerticalAlignment = VerticalAlignment.Top; TextBox polyErr = new TextBox(); TextBox diff1 = new TextBox(); TextBox diff2 = new TextBox(); TextBox diff1Err = new TextBox(); TextBox diff2Err = new TextBox(); polyErr.Text = "погр. интерполирования равна " + GetPolyNewtonErr(x, por, row).ToDouble(); diff1.Text = "первая производная равна " + GetPolyNewtonDiff1Val(x, por, row).ToDouble(); diff1Err.Text = "ошибка первой производной " + GetPolyNewtonDiff1Err(x, por, row).ToDouble(); diff2.Text = "вторая производная равна " + GetPolyNewtonDiff2Val(x, por, row).ToDouble(); diff2Err.Text = "ошибка второй производной " + GetPolyNewtonDiff2Err(x, por, row).ToDouble(); polyErr.Width = 300; polyErr.Height = 25; diff1.Width = 300; diff1.Height = 25; diff2.Width = 300; diff2.Height = 25; diff1Err.Width = 300; diff1Err.Height = 25; diff2Err.Width = 300; diff2Err.Height = 25; SolidColorBrush br = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)); valY.BorderBrush = br; valX.BorderBrush = br; polyErr.BorderBrush = br; diff1.BorderBrush = br; diff2.BorderBrush = br; diff1Err.BorderBrush = br; diff2Err.BorderBrush = br; valX.Background = br; valY.Background = br; polyErr.Background = br; diff1.Background = br; diff2.Background = br; diff1Err.Background = br; diff2Err.Background = br; valX.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Center; diff1.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left; diff2.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left; polyErr.Margin = new System.Windows.Thickness(0, 0, wdt - diff1.Width, hgt - diff1.Height); diff1.Margin = new System.Windows.Thickness(0, 0, wdt - diff1.Width, hgt - 3 * diff1.Height); diff1Err.Margin = new System.Windows.Thickness(0, 0, wdt - diff1.Width, hgt - 5 * diff1.Height); diff2.Margin = new System.Windows.Thickness(0, 0, wdt - diff2.Width, hgt - 7 * diff2.Height); diff2Err.Margin = new System.Windows.Thickness(0, 0, wdt - diff2.Width, hgt - 9 * diff2.Height); if (valXY.Y <= axis.crossAxis.Y) { valX.Margin = new System.Windows.Thickness(valXY.X - valX.Width / 2, axis.crossAxis.Y - valY.Height, 0, 0); } else { valX.Margin = new System.Windows.Thickness(valXY.X - valX.Width / 2, axis.crossAxis.Y + valY.Height, 0, 0); } if (valXY.X <= axis.crossAxis.X) { valY.Margin = new System.Windows.Thickness(axis.crossAxis.X - axis.bord - valY.Width, valXY.Y - valY.Height, 0, 0); valY.TextAlignment = axis.taY; } else { valY.Margin = new System.Windows.Thickness(axis.crossAxis.X + axis.bord, valXY.Y - valY.Height, 0, 0); //valY.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left; valY.TextAlignment = axis.taY; } gr.Children.Add(el); gr.Children.Add(valX); gr.Children.Add(valY); gr.Children.Add(polyErr); gr.Children.Add(diff1); gr.Children.Add(diff2); gr.Children.Add(diff1Err); gr.Children.Add(diff2Err); }