private AxisItem GetAxisItemFromPoint(AxisType axisType, Point point, string label) { if (point == null) { return null; } AxisItem item = new AxisItem(); double markSize = 3; TextBlock tb = new TextBlock(); Line ln = new Line(); tb.Text = label; tb.TextAlignment = TextAlignment.Right; ln.Stroke = new SolidColorBrush(Colors.Black); switch (axisType) { case AxisType.X: Canvas.SetBottom(tb, 0); Canvas.SetLeft(tb, point.X); ln.Y1 = point.Y; ln.Y2 = point.Y - markSize; ln.X1 = point.X; ln.X2 = ln.X1; break; case AxisType.Y: throw new NotImplementedException(); default: break; } item = new AxisItem { Label = tb, Mark = ln }; return item; }
private void ResultCanvasPainter(CalculateMethod method) { resultCanvas.Children.Clear(); Brush fillBrush = (Brush)FindResource("ResultLineGradientBlue"); double height = resultCanvas.ActualHeight; double width = resultCanvas.ActualWidth; double dotDiameter = width * 0.05; if (dotDiameter > 20) dotDiameter = 20; double axisGap = 18; int power = 0; Polyline yLine = new Polyline(); yLine.Stroke = fillBrush; List<Ellipse> dots = new List<Ellipse>(); List<AxisItem> xAxisItems = new List<AxisItem>(); List<AxisItem> yAxisItems = new List<AxisItem>(); Polyline xAxis = new Polyline(); Polyline yAxis = new Polyline(); xAxis.Points.Add(new Point(0, height - axisGap)); xAxis.Points.Add(new Point(width, height - axisGap)); xAxis.Stroke = new SolidColorBrush(Colors.Black); yAxis.Points.Add(new Point(axisGap, 0)); yAxis.Points.Add(new Point(axisGap, height)); yAxis.Stroke = new SolidColorBrush(Colors.Black); TextBlock yHeader = new TextBlock(); TextBlock xAxisHeader = new TextBlock(); xAxisHeader.FontSize = 12; TextBlock yAxisHeader = new TextBlock(); yAxisHeader.FontSize = 12; Canvas.SetLeft(yHeader, width * 0.382); Canvas.SetLeft(yLine, axisGap); Canvas.SetBottom(xAxisHeader, axisGap + 3); Canvas.SetRight(xAxisHeader, 0); Canvas.SetTop(yAxisHeader, -axisGap); switch (method) { case CalculateMethod.Rayleigh: if (Impeller.InnerImpeller.Y.Count <= 0) return; yLine.Points = GetPointsFromY(Impeller.InnerImpeller, height - axisGap, width - axisGap); xAxisItems = GetAxisItemsFromDoubleList(Impeller.Sections.Select(sec => sec.Position).ToList(), AxisType.X, new Point(axisGap, height - axisGap), width - axisGap, showMin:false); yAxisItems = GetAxisItemsFromDoubleList(Impeller.InnerImpeller.Y, AxisType.Y, new Point(axisGap, height - axisGap), height - axisGap, showMax:false); yHeader.Text = "振型曲线"; xAxisHeader.Text = "Position(m)"; yAxisHeader.Text = "Y(m)"; break; case CalculateMethod.Iteration: if (Impeller.InnerImpeller.Y.Count <= 0) return; yLine.Points = GetPointsFromY(Impeller.InnerImpeller, height - axisGap, width - axisGap); xAxisItems = GetAxisItemsFromDoubleList(Impeller.Sections.Select(sec => sec.Position).ToList(), AxisType.X, new Point(axisGap, height - axisGap), width - axisGap, showMin: false); yAxisItems = GetAxisItemsFromDoubleList(Impeller.InnerImpeller.Y, AxisType.Y, new Point(axisGap, height - axisGap), height - axisGap); yHeader.Text = "振型曲线"; xAxisHeader.Text = "Position(m)"; yAxisHeader.Text = "Y(1)"; break; case CalculateMethod.Prohl: if (Impeller.InnerImpeller.VibrationFrequency.Count <= 0) return; double heightScale = (height - axisGap - dotDiameter) / (Impeller.State.CheckToOmega / (2 * Math.PI)); List<double> freqRange = new List<double>(100); for (int i = 0; i <= 100; i++) { freqRange.Add(Impeller.State.CheckFromOmega / (2 * Math.PI) + i * (Impeller.State.CheckToOmega - Impeller.State.CheckFromOmega) / (2 * Math.PI * 100)); } yAxisItems = GetAxisItemsFromDoubleList(freqRange, AxisType.Y, new Point(axisGap, height - axisGap), height - axisGap); yHeader.Text = "各阶固有频率分布"; xAxisHeader.Text = "阶数"; yAxisHeader.Text = "频率(Hz)"; foreach (var freq in Impeller.InnerImpeller.VibrationFrequency) { var freqDot = new Ellipse(); var axisItem = new AxisItem(); double xPosition = 0; freqDot.Height = dotDiameter; freqDot.Width = dotDiameter; freqDot.Fill = fillBrush; freqDot.ToolTip = "第" + (++power) + "阶\n" + freq + " Hz"; freqDot.MouseEnter += new MouseEventHandler(freqDot_MouseEnter); freqDot.MouseLeave += new MouseEventHandler(freqDot_MouseLeave); xPosition = axisGap + (width - axisGap - dotDiameter) * power / (Impeller.InnerImpeller.VibrationFrequency.Count + 1); Canvas.SetLeft(freqDot, xPosition); Canvas.SetBottom(freqDot, freq * heightScale + axisGap); xAxisItems.Add(GetAxisItemFromPoint(AxisType.X, new Point(xPosition + dotDiameter / 2, height - axisGap), power.ToString())); dots.Add(freqDot); } break; default: break; } resultCanvas.Children.Add(xAxis); resultCanvas.Children.Add(yAxis); resultCanvas.Children.Add(xAxisHeader); resultCanvas.Children.Add(yAxisHeader); resultCanvas.Children.Add(yHeader); resultCanvas.Children.Add(yLine); foreach (var item in xAxisItems) { resultCanvas.Children.Add(item.Label); resultCanvas.Children.Add(item.Mark); } foreach (var item in yAxisItems) { resultCanvas.Children.Add(item.Label); resultCanvas.Children.Add(item.Mark); } foreach (var dot in dots) { resultCanvas.Children.Add(dot); } }