public SimulationWindow() { Loaded += (sender, e) => { bool isStarted = false; DiffuseSimulation ds = new DiffuseSimulation(); Dictionary<ushort, int> nodes = new Dictionary<ushort, int>(); for (int i = 0; i < ds.numberOfNodes; i++) nodes.Add(ds.nodeInfos[i].portNumber, i); Background = Brushes.Black; DockPanel dp = new DockPanel(); Content = dp; Canvas canvas = new Canvas(); dp.Children.Add(canvas); TextBlock tbMessage = new TextBlock(); tbMessage.Foreground = Brushes.White; canvas.Children.Add(tbMessage); Ellipse ellipse = new Ellipse(); ellipse.Stroke = Brushes.White; canvas.Children.Add(ellipse); double nodeEllipseDiameter = 5.0; double nodeEllipseRadius = nodeEllipseDiameter / 2.0; Ellipse[] nodeEllipses = new Ellipse[ds.numberOfNodes]; Border[] nodeBorders = new Border[ds.numberOfNodes]; double[] nodeRadians = new double[ds.numberOfNodes]; for (int i = 0; i < nodeEllipses.Length; i++) { nodeEllipses[i] = new Ellipse(); nodeEllipses[i].Fill = Brushes.Red; nodeEllipses[i].Width = nodeEllipseDiameter; nodeEllipses[i].Height = nodeEllipseDiameter; canvas.Children.Add(nodeEllipses[i]); nodeBorders[i] = new Border(); nodeBorders[i].Visibility = Visibility.Collapsed; nodeBorders[i].Background = Brushes.Black; nodeBorders[i].BorderBrush = Brushes.White; nodeBorders[i].BorderThickness = new Thickness(3.0); canvas.Children.Add(nodeBorders[i]); StackPanel nodeSp = new StackPanel(); nodeSp.Orientation = Orientation.Vertical; nodeBorders[i].Child = nodeSp; TextBlock tbPortNumber = new TextBlock(); tbPortNumber.Text = "ポート番号:" + ds.nodeInfos[i].portNumber.ToString(); tbPortNumber.Foreground = Brushes.White; nodeSp.Children.Add(tbPortNumber); TextBlock tbId = new TextBlock(); tbId.Text = "識別子:" + ds.nodeInfos[i].Id.ToString(); tbId.Foreground = Brushes.White; nodeSp.Children.Add(tbId); int index = i; nodeEllipses[i].MouseEnter += (sender2, e2) => nodeBorders[index].Visibility = Visibility.Visible; nodeEllipses[i].MouseLeave += (sender2, e2) => nodeBorders[index].Visibility = Visibility.Collapsed; nodeRadians[i] = (double)BitConverter.ToUInt32(ds.nodeInfos[i].Id.hash.Decompose(0, 4).Reverse().ToArray(), 0) / (double)uint.MaxValue * 2.0 * Math.PI; } double[] nodeXs = new double[ds.numberOfNodes]; double[] nodeYs = new double[ds.numberOfNodes]; canvas.SizeChanged += (sender2, e2) => { double diameter = Math.Min(canvas.ActualWidth, canvas.ActualHeight) * 0.8; double radius = diameter / 2.0; ellipse.Width = diameter; ellipse.Height = diameter; double ellipseTop = (canvas.ActualHeight - diameter) / 2.0; double ellipseLeft = (canvas.ActualWidth - diameter) / 2.0; Canvas.SetTop(ellipse, ellipseTop); Canvas.SetLeft(ellipse, ellipseLeft); for (int i = 0; i < nodeEllipses.Length; i++) { nodeYs[i] = ellipseTop + radius - radius * Math.Sin(nodeRadians[i]); nodeXs[i] = ellipseLeft + radius + radius * Math.Cos(nodeRadians[i]); Canvas.SetTop(nodeEllipses[i], nodeYs[i] - nodeEllipseRadius); Canvas.SetLeft(nodeEllipses[i], nodeXs[i] - nodeEllipseRadius); Canvas.SetTop(nodeBorders[i], nodeYs[i] + nodeEllipseRadius); Canvas.SetLeft(nodeBorders[i], nodeXs[i] + nodeEllipseRadius); } if (!isStarted) { isStarted = true; this.StartTask(string.Empty, string.Empty, () => ds.Start()); } }; ds.sn.Communicated += (sender2, e2) => this.Lambda(() => { Line line = new Line(); line.X1 = nodeXs[nodes[ds.connections[e2.Item1]]]; line.Y1 = nodeYs[nodes[ds.connections[e2.Item1]]]; line.X2 = nodeXs[nodes[ds.connections[e2.Item2]]]; line.Y2 = nodeYs[nodes[ds.connections[e2.Item2]]]; line.Stroke = Brushes.Blue; line.Width = canvas.ActualWidth; line.Height = canvas.ActualHeight; canvas.Children.Add(line); }).BeginExecuteInUIThread(); ds.Received += (sender2, e2) => this.Lambda(() => tbMessage.Text = e2.ToString()).BeginExecuteInUIThread(); }; }
public SimulationWindow() { Loaded += (sender, e) => { bool isStarted = false; DiffuseSimulation ds = new DiffuseSimulation(); Dictionary <ushort, int> nodes = new Dictionary <ushort, int>(); for (int i = 0; i < ds.numberOfNodes; i++) { nodes.Add(ds.nodeInfos[i].portNumber, i); } Background = Brushes.Black; DockPanel dp = new DockPanel(); Content = dp; Canvas canvas = new Canvas(); dp.Children.Add(canvas); TextBlock tbMessage = new TextBlock(); tbMessage.Foreground = Brushes.White; canvas.Children.Add(tbMessage); Ellipse ellipse = new Ellipse(); ellipse.Stroke = Brushes.White; canvas.Children.Add(ellipse); double nodeEllipseDiameter = 5.0; double nodeEllipseRadius = nodeEllipseDiameter / 2.0; Ellipse[] nodeEllipses = new Ellipse[ds.numberOfNodes]; Border[] nodeBorders = new Border[ds.numberOfNodes]; double[] nodeRadians = new double[ds.numberOfNodes]; for (int i = 0; i < nodeEllipses.Length; i++) { nodeEllipses[i] = new Ellipse(); nodeEllipses[i].Fill = Brushes.Red; nodeEllipses[i].Width = nodeEllipseDiameter; nodeEllipses[i].Height = nodeEllipseDiameter; canvas.Children.Add(nodeEllipses[i]); nodeBorders[i] = new Border(); nodeBorders[i].Visibility = Visibility.Collapsed; nodeBorders[i].Background = Brushes.Black; nodeBorders[i].BorderBrush = Brushes.White; nodeBorders[i].BorderThickness = new Thickness(3.0); canvas.Children.Add(nodeBorders[i]); StackPanel nodeSp = new StackPanel(); nodeSp.Orientation = Orientation.Vertical; nodeBorders[i].Child = nodeSp; TextBlock tbPortNumber = new TextBlock(); tbPortNumber.Text = "ポート番号:" + ds.nodeInfos[i].portNumber.ToString(); tbPortNumber.Foreground = Brushes.White; nodeSp.Children.Add(tbPortNumber); TextBlock tbId = new TextBlock(); tbId.Text = "識別子:" + ds.nodeInfos[i].Id.ToString(); tbId.Foreground = Brushes.White; nodeSp.Children.Add(tbId); int index = i; nodeEllipses[i].MouseEnter += (sender2, e2) => nodeBorders[index].Visibility = Visibility.Visible; nodeEllipses[i].MouseLeave += (sender2, e2) => nodeBorders[index].Visibility = Visibility.Collapsed; nodeRadians[i] = (double)BitConverter.ToUInt32(ds.nodeInfos[i].Id.hash.Decompose(0, 4).Reverse().ToArray(), 0) / (double)uint.MaxValue * 2.0 * Math.PI; } double[] nodeXs = new double[ds.numberOfNodes]; double[] nodeYs = new double[ds.numberOfNodes]; canvas.SizeChanged += (sender2, e2) => { double diameter = Math.Min(canvas.ActualWidth, canvas.ActualHeight) * 0.8; double radius = diameter / 2.0; ellipse.Width = diameter; ellipse.Height = diameter; double ellipseTop = (canvas.ActualHeight - diameter) / 2.0; double ellipseLeft = (canvas.ActualWidth - diameter) / 2.0; Canvas.SetTop(ellipse, ellipseTop); Canvas.SetLeft(ellipse, ellipseLeft); for (int i = 0; i < nodeEllipses.Length; i++) { nodeYs[i] = ellipseTop + radius - radius * Math.Sin(nodeRadians[i]); nodeXs[i] = ellipseLeft + radius + radius * Math.Cos(nodeRadians[i]); Canvas.SetTop(nodeEllipses[i], nodeYs[i] - nodeEllipseRadius); Canvas.SetLeft(nodeEllipses[i], nodeXs[i] - nodeEllipseRadius); Canvas.SetTop(nodeBorders[i], nodeYs[i] + nodeEllipseRadius); Canvas.SetLeft(nodeBorders[i], nodeXs[i] + nodeEllipseRadius); } if (!isStarted) { isStarted = true; this.StartTask(string.Empty, string.Empty, () => ds.Start()); } }; ds.sn.Communicated += (sender2, e2) => this.Lambda(() => { Line line = new Line(); line.X1 = nodeXs[nodes[ds.connections[e2.Item1]]]; line.Y1 = nodeYs[nodes[ds.connections[e2.Item1]]]; line.X2 = nodeXs[nodes[ds.connections[e2.Item2]]]; line.Y2 = nodeYs[nodes[ds.connections[e2.Item2]]]; line.Stroke = Brushes.Blue; line.Width = canvas.ActualWidth; line.Height = canvas.ActualHeight; canvas.Children.Add(line); }).BeginExecuteInUIThread(); ds.Received += (sender2, e2) => this.Lambda(() => tbMessage.Text = e2.ToString()).BeginExecuteInUIThread(); }; }