private void RedrawFunction(FunctionToPlot fp) { var canvasWH = new Size(mCanvas.ActualWidth, mCanvas.ActualHeight); { // 線を引きます。 var p = new Polyline(); p.Stroke = Brushes.DarkOrange; p.StrokeThickness = 1; p.FillRule = FillRule.EvenOdd; var pc = new PointCollection(); for (int i = 0; i <= canvasWH.Width; ++i) { double x = (double)i / canvasWH.Width; double y = fp(x); double yDisp = canvasWH.Height / 2 - mScale * y * canvasWH.Height / 2; pc.Add(new System.Windows.Point(i, yDisp)); } p.Points = pc; mCanvas.Children.Add(p); mElements.Add(p); } { // 点を描きます。 for (int i = 0; i <= NumGridX; ++i) { double x = (double)i / NumGridX; double y = fp(x); double xDisp = x * canvasWH.Width; double yDisp = canvasWH.Height / 2 - mScale * y * canvasWH.Height / 2; AddCircle(new Vector(xDisp, yDisp), 5.0, Brushes.Black); } } }
public void Redraw(FunctionToPlot fp, string title) { var WH = new Size(mCanvas.ActualWidth, mCanvas.ActualHeight); mCanvas.Children.Clear(); mElements.Clear(); for (int i = 1; i < NumGridX; ++i) { AddLine(new Vector(i * WH.Width / NumGridX, 0), new Vector(i * WH.Width / NumGridX, WH.Height), Brushes.LightGray); } for (int i = 1; i < NumGridY; ++i) { AddLine(new Vector(0, i * WH.Height / NumGridY), new Vector(WH.Width, i * WH.Height / NumGridY), Brushes.LightGray); } AddLine(new Vector(0, WH.Height / 2), new Vector(WH.Width, WH.Height / 2), Brushes.Gray); AddLine(new Vector(0, 0), new Vector(0, WH.Height), Brushes.Gray); RedrawFunction(fp); AddTextBlock(new Vector(0, WH.Height / 2), 10, Brushes.Black, "0"); for (int i = 1; i <= NumGridX; ++i) { double xOffs = 20; if (i == NumGridX) { xOffs = 40; } AddTextBlock(new Vector(i * WH.Width / NumGridX - xOffs, WH.Height / 2), 10, Brushes.Black, string.Format("{0}/44100", i)); } AddTextBlock(new Vector(WH.Width - 55, WH.Height / 2 + 20), 10, Brushes.Black, "Time(sec) →"); AddTextBlockV(new Vector(0, 60), 10, Brushes.Black, "Amplitude →"); AddTextBlock(new Vector(20, 12), 16, Brushes.Black, title); }