1. 程式人生 > >C#WPF 如何繪製幾何圖形 圖示教程 繪製sin曲線 正弦 繪製2D座標系 有圖有程式碼

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

C#WPF 如何繪製幾何圖形? 怎麼繪製座標系?繪製sin曲線(正弦曲線)?

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

完成該工程,我們首先要建立並繪製一個座標系,然後在該座標系中繪製sin曲線的點(x,y),最後,把曲線的點轉換為螢幕座標並連線;這樣座標系和sin曲線就繪製完成了。

如果有幫助,別忘了給評價!

一、建立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>
        /// 繪製座標系和sin曲線
        /// </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;//顯示螢幕座標系的位置
        }
    }
}

三、頁面效果

四、介紹

private void Drawsin()  函式中完成:座標系繪製,sin曲線繪製;

point是繪圖座標系中的點,xypoint(maincanvas.Width/2,maincanvas.Height/2)是繪圖螢幕座標的幾何中心點( 圖 座標點轉換,中x軸和y軸原點)的座標。

public Point XYTransf(Point point, Point xypoint)函式返回值是在螢幕座標繪製點的座標。

        //轉換為介面座標系
        public Point XYTransf(Point point, Point xypoint)

        {
            point.X += xypoint.X;
            point.Y = xypoint.Y - point.Y;

            return point;//顯示螢幕座標系的位置
        }

1.mainPanel  是一個Canvas面板,我們在該面板繪製圖形。

2.繪製座標系,以mainPanel 的圖形中心為座標原點;

                                                                                           圖 座標點轉換

 3.計算sin(x,y)並轉換為螢幕座標點,取1000個座標點,並存在points陣列中

            for (int i = 1; i < 1000; i++)
            {
                //計算sin(x,y)
                point.X =10 * i;//sin x
              point.Y =10 * Math.Sin(i);//sin y
  
                //座標轉換
                point = XYTransf(point, xypoint);
              points[i] = point;

            }

4.連線1000個sin(x,y)的螢幕座標點,並顯示在Canvas中

StreamGeometry theGeometry = BuildRegularPolygon(points, true, false);   通過該函式連線points中所有的點;

            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);

5.執行顯示效果

點選“啟動”或按鍵盤“F5”執行工程,顯示介面。


相關推薦

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

C#WPF 如何繪製幾何圖形? 怎麼繪製座標系?繪製sin曲線(正弦曲線)? 這離不開Path(System.Windows.Shapes)和StreamGeometry(System.Windows.Media)類。 完成該工程,我們首先要建立並繪製一個座標系,然後在該座

C/S C# WPF銳浪報表教程

前言:銳浪報表是一種中國式報表的報表開發工具。博主使用銳浪報表有一段時間了,積累了一些經驗希望能幫助你快速掌握並使用 第一章:整合專案 首先我們先去銳浪報表官網下載並安裝銳浪報表。 建立WPF應用程式。(C/S端使用銳浪報表基本都一樣)  新增銳浪報表的引用,在資源管理器目錄中找到引用並右鍵,點

以太坊(ETH)顯示卡挖礦教程總結,新手教程真相

以太幣(ETH)是以太坊(Ethereum)的一種數字代幣,被視為"比特幣2.0版",採用與比特幣不同的區塊鏈技術"以太坊"(Ethereum),開發者們需要支付以太幣(ETH)來支撐應用的執行。和其他數字貨幣一樣,可以在交易平臺上進行買賣。 以太坊ETH採用Ethash(Dagger-Ha

一步步教你搭建Android開發環境(真相)--“自吹自擂:史上最詳細、最囉嗦、最新的搭建教程

宣告:轉摘請註明http://blog.csdn.net/longming_xu/article/details/28241045 前言:為什麼要寫這麼一篇文章?網上介紹Android開發環境搭建的文章一片一片的,我為什麼要自己”重複的去造輪子“呢?原因有三個:第一個

淺談C++之冒泡排序、希爾排序、快速排序、插入排序、堆排序、基數排序性能對比分析(好戲在後面,真相)

棧溢出 分享圖片 隨機數 函數 大根堆 oschina 共同學習 時間復雜度 還原 由於沒考慮到一些情況,對以上一些算法做了改進和對比!以及昨晚把希爾排序寫錯而誤以為其效率高過快速排序的糗事,今天一一做了更正和說明,如果你絕得本隨筆不是很妥可以嘗試看看這http://www

qt下bezier曲線繪製C++)

bezier曲線在程式設計中的難點在於求取曲線的係數,如果係數確定了那麼就可以用微小的直線段畫出曲線。bezier曲線的係數也就是bernstein係數,此係數的性質可以自行百度,我們在這裡是利用bernstein係數的遞推性質求取 簡單舉例 兩個點p0,p1  

C# WPF 基礎教程 視訊學習筆記(一)

1.[STAThread()] 代表單執行緒 2.using語句允許程式設計師指定使用資源的物件應當何時釋放資源 3.Border 一般用於裝載面板   Padding 邊框和內部內容中間新增空間   CornerRadius可以使邊框具有一個圓角     4.DockP

C# WPF 基礎教程 視訊學習筆記(四)

1.文字控制元件 普通文字框控制元件 TextBox VerticalScrollBarVisibility 是否顯示滾動條 選中字元開始 this.TxtSelection.SelectionStart 選中字元開始 this.TxtSelection.SelectionE

PS教程:手把手教你繪製一個復古風格的舊電檢視標

今天,帶大家來臨摹一個電視機圖示。圖示的教程相對來說,總是比較受歡迎的,應用最多的當屬圖層樣式。這裡再次強調一點,圖層樣式中的引數設定是對應其相應圖層的,受圖層大小尺寸影響,在不同尺寸下,效果呈現是不同的。 比如說,同樣一個5畫素的描邊的圖層樣式,在10畫素的圓和100畫素的圓下,其表現效果肯定是不一樣的。

PS+AI教程:手把手教你繪製酷炫多彩的動態霓虹燈字效

用Photoshop+Illustrator 製作一個酷炫的動態霓虹燈字效,用AI繪製火箭、星球、做字型變形,以及用Photoshop新增霓虹效果、讓畫面動起來的技巧,非常適合進階學習的教程,來收! 效果圖: 一、在AI裡畫草圖 1. 首先呢~開啟你的AI,然後用橢圓工具畫一個圓,描邊:5pt。 2.

機器學習精簡教程之四——用matplotlib繪製精美的圖表

本文轉自:http://www.shareditor.com/blogshow/?blogId=55 繪製一元函式影象y=ax+b import matplotlib.pyplot as plt import numpy as np plt.figure() # 例

android自定義View繪製幾何圖形

1、首先說一下canvas類: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold

C#用serialPort和chart控制元件實現簡單波形繪製

先看最終的效果圖: 主要實現功能是將串列埠傳送過來的資料按波形顯示 注:本例是以串列埠除錯助手和虛擬串列埠VSPD軟體模擬串列埠傳送資料的,詳細說明見下文 說明: serialPort的ReadByte()方法用於從System.IO.Ports.SerialPort輸入

C語言繪製一條標準的餘弦曲線

#include<stdio.h> #include<math.h> int main() { double y; int x,m; for(y=1;y>=-1;y-=0.1) { m=acos(y)*10; for(x=1;x&

WPF 自定義的圖表(適用大量資料繪製

在WPF中繪製圖表比較簡單,有很多的第三方控制元件,但是在繪製大量資料的時候,就顯得有些吃力,即便是自己用StreamGeometry畫也達不到理想的效果,要達到繪製大量資料而不會頓卡現象,只有一個途徑,就是首先在記憶體中繪製好所有的圖形,再一次性載入(或者說繪製)到介面控

解決Cesium繪製幾何圖形被高程遮擋問題

圖一 viewer.scene.globe.depthTestAgainstTerrain = true; 圖二 viewer.scene.globe.depthTestAgainstTerrain = false; depthTestAgainstTerr

OpenGL 入門基礎教程 —— 在第一個視窗繪製一個三角形

首先了解緩衝區物件相關: 1:緩衝區物件的定義 GLuint vertexbuffer; //定義了一個unsigned int型別的正整形緩衝區物件2:建立緩衝區物件—建立 void glGenBuffers(GLsizei n, GLuint *buffers)

C# WPF 基礎教程 視訊學習筆記(二)

1.理解路由事件 2.路由事件三種方式 (1) 直接路由事件 (2) 冒泡路由事件:由所觸發控制元件層逐步向上傳遞 (3) 遂道路由事件:冒泡路由事件前加Preview由頂層逐步向下層傳遞 3.路由事件引數 Object sender 那個對像引發的這個事件 RouteE

Unity3d 利用Mesh繪製幾何圖形實現

一、建立一個GameObject,並在上面掛兩個元件(MeshFilter、MeshRenderer) 二、新建個指令碼,並掛在剛才建立的GameObject上     using UnityEngine;    using System.Collections; 

C++開發人臉性別識別教程(3)——OpenCv配置和ImageWatch插件介紹

下劃線 toc bsp 對話 顯示 調試 詳細 結構 post   OpenCv是C++圖像處理的重要工具。這個人臉性別識別的項目就是借助OpenCv進行開發的。盡管網上已經有了非常多關於OpenCv的配置教程,但出於教程完整性考慮。這裏還是用專門的一篇博客來介紹Ope