C#WPF 如何繪製幾何圖形 圖示教程 繪製sin曲線 正弦 繪製2D座標系 有圖有代碼

來源:互聯網
上載者:User

標籤:wpf   2d   座標   sin曲線   正弦曲線   

C#WPF 如何繪製幾何圖形? 怎麼繪製座標系?

 

這離不開Path(System.Windows.Shapes)和StreamGeometry(System.Windows.Media)類。

 

一、建立WPF工程

 

 

二、添加代碼

MainWindow.xaml 中代碼

<Window x:Class="WPFDrawingTraning.MainWindow"        xmlns="<a target=_blank href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>"        xmlns:x="<a target=_blank href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>"        Title="MainWindow" Height="350" Width="525">    <Grid>        <Canvas Name="mainPanel" HorizontalAlignment="Left" Height="320" VerticalAlignment="Top" Width="517"/>    </Grid></Window> 

MainWindow.xaml.cs中代碼

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace WPFDrawingTraning{    /// <summary>    /// MainWindow.xaml 的互動邏輯    /// </summary>    public partial class MainWindow : System.Windows.Window    {        //Canvas mainPanel = new Canvas();        public MainWindow()        {            InitializeComponent();            Drawsin();//繪製2D座標系和sin曲線                Drawpentagon();        }        /// <summary>        /// 繪製一組線段        /// </summary>        protected void Drawing()        {            PathFigure myPathFigure = new PathFigure();            myPathFigure.StartPoint = new Point(10, 50);            LineSegment myLineSegment = new LineSegment();            myLineSegment.Point = new Point(200, 70);            PathSegmentCollection myPathSegmentCollection = new PathSegmentCollection();            myPathSegmentCollection.Add(myLineSegment);            myPathFigure.Segments = myPathSegmentCollection;            PathFigureCollection myPathFigureCollection = new PathFigureCollection();            myPathFigureCollection.Add(myPathFigure);            PathGeometry myPathGeometry = new PathGeometry();            myPathGeometry.Figures = myPathFigureCollection;                        Path myPath = new Path();            myPath.Stroke = Brushes.Black;            myPath.StrokeThickness = 1;            myPath.Data = myPathGeometry;            // Add path shape to the UI.            StackPanel mainPanel = new StackPanel();            mainPanel.Children.Add(myPath);            this.Content = mainPanel;        }        /// <summary>        /// 繪製線段        /// </summary>        protected void DrawingLine(Point startPt,Point endPt)        {            LineGeometry myLineGeometry = new LineGeometry();            myLineGeometry.StartPoint = startPt;            myLineGeometry.EndPoint = endPt;            Path myPath = new Path();            myPath.Stroke = Brushes.Black;            myPath.StrokeThickness = 1;            myPath.Data = myLineGeometry;            mainPanel.Children.Add(myPath);                    }        /// <summary>        /// 繪製星狀線        /// </summary>        protected void DrawingAstroid(Point center,double r)        {            double h1 = r * Math.Sin(18 * Math.PI / 180);            double h2 = r * Math.Cos(18*Math.PI/180);            double h3 = r * Math.Sin(36 * Math.PI / 180);            double h4 = r * Math.Cos(36 * Math.PI / 180); ;            Point p1 = new Point(r, 0);            Point p2 = new Point(r - h2, r - h1);            Point p3 = new Point(r - h3, r + h4);            Point p4 = new Point(r + h3, p3.Y);            Point p5 = new Point(r + h2, p2.Y);            Point[] values = new Point[] { p1, p2, p3, p4, p5 };            PathFigureCollection myPathFigureCollection = new PathFigureCollection();            PathGeometry myPathGeometry = new PathGeometry();                        for (int i = 0; i < values.Length; i++)            {                //DrawingLine(center, values[i]);                PathFigure myPathFigure = new PathFigure();                myPathFigure.StartPoint = center;                LineSegment myLineSegment = new LineSegment();                myLineSegment.Point = values[i];                PathSegmentCollection myPathSegmentCollection = new PathSegmentCollection();                myPathSegmentCollection.Add(myLineSegment);                myPathFigure.Segments = myPathSegmentCollection;                myPathFigureCollection.Add(myPathFigure);            }            myPathGeometry.Figures = myPathFigureCollection;            Path myPath = new Path();            myPath.Stroke = Brushes.Black;            myPath.StrokeThickness = 1;            myPath.Data = myPathGeometry;                        mainPanel.Children.Add(myPath);        }        /// <summary>        /// 繪製五角星        /// </summary>        private void Drawpentagon()        {            Point center = new Point(50, 50);            double r = 50;            DrawingAstroid(center, r);            double h1 = r * Math.Sin(18 * Math.PI / 180);            double h2 = r * Math.Cos(18 * Math.PI / 180);            double h3 = r * Math.Sin(36 * Math.PI / 180);            double h4 = r * Math.Cos(36 * Math.PI / 180); ;            Point p1 = new Point(r, 0);            Point p2 = new Point(r - h2, r - h1);            Point p3 = new Point(r - h3, r + h4);            Point p4 = new Point(r + h3, p3.Y);            Point p5 = new Point(r + h2, p2.Y);            Point[] values = new Point[] { p1, p3, p5, p2, p4 };            // Create a path to draw a geometry with.            Path myPath = new Path();            myPath.Stroke = Brushes.Black;            myPath.StrokeThickness = 1;            StreamGeometry theGeometry = BuildRegularPolygon(values, true, false);            // Create a StreamGeometry to use to specify myPath.            theGeometry.FillRule = FillRule.EvenOdd;            // Freeze the geometry (make it unmodifiable)            // for additional performance benefits.            theGeometry.Freeze();            // Use the StreamGeometry returned by the BuildRegularPolygon to             // specify the shape of the path.            myPath.Data = theGeometry;            // Add path shape to the UI.            mainPanel.Children.Add(myPath);        }        /// <summary>        /// 繪製連續的線段        /// </summary>        /// <param name="values"></param>        /// <returns></returns>        private StreamGeometry BuildRegularPolygon(Point[] values, bool isClosed,bool isfilled)        {            // c is the center, r is the radius,            // numSides the number of sides, offsetDegree the offset in Degrees.            // Do not add the last point.            StreamGeometry geometry = new StreamGeometry();            using (StreamGeometryContext ctx = geometry.Open())            {                ctx.BeginFigure(values[0], isfilled /* is filled */, isClosed /* is closed */);                                for (int i = 1; i < values.Length; i++)                {                                        ctx.LineTo(values[i], true /* is stroked */, false /* is smooth join */);                }            }                        return geometry;        }        /// <summary>        /// 繪製五角星        /// </summary>        private void Drawsin()        {            Point point = new Point(this.mainPanel.Width, this.mainPanel.Height);            Point xypoint = new Point(point.X / 2, point.Y / 2);//新座標原點            //x軸座標起點            Point xstartpoint = new Point(0, point.Y / 2);            //x軸座標終點            Point xendpoint = new Point(point.X, point.Y / 2);            //y軸座標起點            Point ystartpoint = new Point(point.X / 2, point.Y);            //y軸座標終點            Point yendpoint = new Point(point.X / 2, 0);            Line xline = new Line();            xline.Stroke = System.Windows.Media.Brushes.LightSteelBlue;            xline.X1 = 0;            xline.Y1 = this.mainPanel.Height / 2;            xline.X2 = this.mainPanel.Width;            xline.Y2 = this.mainPanel.Height / 2;            this.mainPanel.Children.Add(xline);            Line yline = new Line();            yline.Stroke = System.Windows.Media.Brushes.LightSteelBlue;            yline.X1 = this.mainPanel.Width / 2;            yline.Y1 = this.mainPanel.Height;            yline.X2 = this.mainPanel.Width / 2;            yline.Y2 = 0;            this.mainPanel.Children.Add(yline);            Point[] points=new Point[1000];            //繪製sin曲線,從原點(0,0)開始              Point zpoint = new Point(0, 0);            zpoint = XYTransf(zpoint, xypoint);            points[0] = zpoint;//sin曲線的起點                       for (int i = 1; i < 1000; i++)            {                //計算sin(x,y)                point.X =10 * i;//x              point.Y =10 * Math.Sin(i);//y                  //座標轉換                point = XYTransf(point, xypoint);                points[i] = point;            }            Path myPath = new Path();            myPath.Stroke = Brushes.Black;            myPath.StrokeThickness = 1;            StreamGeometry theGeometry = BuildRegularPolygon(points, true, false);            // Create a StreamGeometry to use to specify myPath.            theGeometry.FillRule = FillRule.EvenOdd;            // Freeze the geometry (make it unmodifiable)            // for additional performance benefits.            theGeometry.Freeze();            // Use the StreamGeometry returned by the BuildRegularPolygon to             // specify the shape of the path.            myPath.Data = theGeometry;            // Add path shape to the UI.            mainPanel.Children.Add(myPath);        }        //構建的XY座標系中的座標轉換為介面座標系        public Point XYTransf(Point point, Point xypoint)
        {            point.X += xypoint.X;            point.Y = xypoint.Y - point.Y;            return point;//顯示螢幕座標系的位置        }    }}

三、頁面效果

 

C#WPF 如何繪製幾何圖形 圖示教程 繪製sin曲線 正弦 繪製2D座標系 有圖有代碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.