-
WPF 2D Creating Perpendicular Lines.NET/WPF 2D 2013. 6. 27. 23:11반응형
<Viewbox Stretch="Uniform"> <Grid Width="730" Height="600" HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid.ColumnDefinitions> <ColumnDefinition Width="250" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid Margin="5,10,5,5" > <Grid.ColumnDefinitions> <ColumnDefinition Width="39" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="0" Margin="5,5,10,5">X1</TextBlock> <Slider Name="tbX1" Grid.Column="1" Grid.Row="0" Value="50" Minimum="-1000" Maximum="1000"
ValueChanged="tbX1_ValueChanged" ></Slider>
<TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="1" Margin="5,5,10,5">Y1</TextBlock> <Slider Name="tbY1" Grid.Column="1" Grid.Row="1" Value="200" Minimum="-1000" Maximum="1000"
ValueChanged="tbX1_ValueChanged" ></Slider> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="2" Margin="5,5,10,5">X2</TextBlock> <Slider Name="tbX2" Grid.Column="1" Grid.Row="2" Value="150" Minimum="-1000" Maximum="1000"
ValueChanged="tbX1_ValueChanged" ></Slider>
<TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="3" Margin="5,5,10,5">Y2</TextBlock> <Slider Name="tbY2" Grid.Column="1" Grid.Row="3" Value="100" Minimum="-1000" Maximum="1000"
ValueChanged="tbX1_ValueChanged"></Slider> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="4" Margin="5,5,10,5">Length</TextBlock> <Slider Name="tbLength" Grid.Column="1" Grid.Row="4" Value="100" Minimum="-1000" Maximum="1000" ValueChanged="tbX1_ValueChanged"></Slider> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="6"
Margin="5,5,10,5">Line2</TextBlock> <CheckBox Grid.Column="1" Grid.Row="6" Content="Visible" x:Name="chk2"
IsChecked="True" Click="chk2_Click"></CheckBox> <Button Click="BtnApply_Click" Margin="15,20,15,5" Grid.Row="7" Height="25" Grid.ColumnSpan="2" Grid.Column="0">Apply</Button> <Button Click="BtnClose_Click" Margin="15,0,15,5" Grid.Row="8" Height="25" Grid.ColumnSpan="2" Grid.Column="0">Close</Button> </Grid> <Border Grid.Column="1" BorderThickness="1" BorderBrush="Blue"> <Canvas Name="canvas1" Grid.Column="1" Margin="10" ClipToBounds="True"> <TextBlock Name="tbPoint1" Canvas.Top="10">Point1</TextBlock> <TextBlock Name="tbPoint2" Canvas.Top="25">Point2</TextBlock> <TextBlock Name="tbPoint3" Canvas.Top="40">Point3</TextBlock> <TextBlock Name="tbPoint4" Canvas.Top="55">Point4</TextBlock> </Canvas> </Border> </Grid> </Viewbox>
private Line line1; private Line line2; public MainWindow() { InitializeComponent(); Rectangle rect = new Rectangle(); rect.Stroke = Brushes.Black; rect.Width = canvas1.Width; rect.Height = canvas1.Height; canvas1.Children.Add(rect); line1 = new Line(); line2 = new Line(); AddLines(); } private void AddLines() { Point pt1 = new Point(); Point pt2 = new Point(); pt1.X = Convert.ToDouble(tbX1 == null ? 200 : tbX1.Value); pt1.Y = Convert.ToDouble(tbY1 == null ? 150 : tbY1.Value); pt2.X = Convert.ToDouble(tbX2 == null ? 100 : tbX2.Value); pt2.Y = Convert.ToDouble(tbY2 == null ? 100 : tbY2.Value); double length = 0.5 * Convert.ToDouble(tbLength == null ? 100 : tbLength.Value); line1 = new Line(); line1.X1 = pt1.X; line1.Y1 = pt1.Y; line1.X2 = pt2.X; line1.Y2 = pt2.Y; line1.Stroke = Brushes.Gray; line1.StrokeThickness = 4; canvas1.Children.Add(line1); Canvas.SetLeft(tbPoint1, pt1.X); Canvas.SetTop(tbPoint1, pt1.Y); Canvas.SetLeft(tbPoint2, pt2.X); Canvas.SetTop(tbPoint2, pt2.Y); tbPoint1.Text = "Pt1(" + pt1.ToString() + ")"; tbPoint2.Text = "Pt2(" + pt2.ToString() + ")"; ////////////////////////////////////////////////////////////////////////// if (chk2.IsChecked == true) { Vector v1 = pt1 - pt2; Matrix m1 = new Matrix(); Point pt3 = new Point(); Point pt4 = new Point(); m1.Rotate(-90); v1.Normalize(); v1 *= length; line2 = new Line(); line2.Stroke = Brushes.Gray; line2.StrokeThickness = 4; line2.StrokeDashArray = DoubleCollection.Parse("3, 1"); pt3 = pt2 + v1 * m1; m1 = new Matrix(); m1.Rotate(90); pt4 = pt2 + v1 * m1; line2.X1 = pt3.X; line2.Y1 = pt3.Y; line2.X2 = pt4.X; line2.Y2 = pt4.Y; canvas1.Children.Add(line2); Canvas.SetLeft(tbPoint3, pt3.X); Canvas.SetTop(tbPoint3, pt3.Y); Canvas.SetLeft(tbPoint4, pt4.X); Canvas.SetTop(tbPoint4, pt4.Y); pt3.X = Math.Round(pt3.X, 0); pt3.Y = Math.Round(pt3.Y, 0); pt4.X = Math.Round(pt4.X, 0); pt4.Y = Math.Round(pt4.Y, 0); tbPoint3.Text = "Pt3(" + pt3.ToString() + ")"; tbPoint4.Text = "Pt4(" + pt4.ToString() + ")"; } } private void BtnApply_Click(object sender, RoutedEventArgs e) { if (line1 != null) canvas1.Children.Remove(line1); if (line2 != null) canvas1.Children.Remove(line2); AddLines(); } private void BtnClose_Click(object sender, RoutedEventArgs e) { this.Close(); } private void tbX1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (canvas1 != null) { if (line1 != null) canvas1.Children.Remove(line1); if (line2 != null) canvas1.Children.Remove(line2); AddLines(); } } private void chk2_Click(object sender, RoutedEventArgs e) { if (line1 != null) canvas1.Children.Remove(line1); if (line2 != null) canvas1.Children.Remove(line2); AddLines(); }
reference : Practical WPF Graphics Programming
반응형'.NET > WPF 2D' 카테고리의 다른 글
WPF 2D RotateTransform (0) 2013.07.04 WPF 2D TranslateTransform (0) 2013.07.03 WPF 2D Scale Transforms (0) 2013.06.28 WPF 2D Object Matrix Transforms (0) 2013.06.28 WPF 2D Transformations Matrix Transforms (0) 2013.06.27 WPF Basic 2D Graphics Shapes (0) 2013.06.19 WPF 2D 차트에 대한 사용자 정의 좌표 (0) 2013.06.18 WPF 2D RenderTransform ScaleTransform Slider 바인딩 Canvas.ClipToBounds (0) 2013.06.18