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