<Window x:Class="WpfApplication1.PerpendicularLine" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Perpendicular Line" Height="300" Width="400"> <Viewbox Stretch="Uniform"> <Canvas Name="canvas1" Grid.Column="1" Margin="10" ClipToBounds="True" Width="270" Height="280"> <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> </Viewbox> </Window> //File:Window.xaml.cs using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace WpfApplication1 { public partial class PerpendicularLine : Window { private Line line1; private Line line2; public PerpendicularLine() { 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 = 30; pt1.Y = 300; pt2.X = 100; pt2.Y = 500; double length = 400; 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() + ")"; 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() + ")"; } } }