一般来说绘制正N边形,使用Blend直接画出来就好。不过可能是博主受WInform影响比较大,比较喜欢使用画出来的图形。如果要绘制正N边形,前面的绘制五角星的公式可以通用的(http://blog.csdn.net/yysyangyangyangshan/article/details/9378871)。
主要是利用圆,根据三角函数和圆的半径计算出圆上的N个点即可。
计算N各点的方法如下:

private PointCollection GetPolygonPoint(Point center, double r,int polygonBound)
{
double g = 18; double perangle = 360 / polygonBound; double pi = Math.PI; List<Point> values = new List<Point>(); for (int i = 0; i < (int) polygonBound; i++)
{
Point p2 = new Point(r * Math.Cos((g + 36) * pi / 180), r * Math.Sin((g + 36) * pi / 180)); values.Add(p2); g += perangle;
} PointCollection pcollect = new PointCollection(values); return pcollect;
}

g是起始角度,也是可以修改的。这个方法默认是在原点画出,r表示半径,polygonBound表示边数。
对五角星类做一下简单的修改,

public partial class RegularPolygonControl : UserControl
{
private double radius = 20; private Brush selectBackground = new SolidColorBrush(Color.FromRgb(0xEB, 0x42, 0x00)); private Brush unselectBackgroud = new SolidColorBrush(Color.FromRgb(0x99, 0x93, 0x93)); /// <summary>
/// 半径
/// </summary>
public double Radius
{
get
{
object result = GetValue(RadiusProperty); if (result == null)
{
return radius;
} return (double)result;
} set
{
SetValue(RadiusProperty, value); this.InvalidateVisual();
}
} public static DependencyProperty RadiusProperty =
DependencyProperty.Register("Radius", typeof(double), typeof(RegularPolygonControl), new UIPropertyMetadata()); /// <summary>
/// 选中颜色
/// </summary>
public Brush SelectBackground
{
get
{
object result = GetValue(SelectBackgroundProperty); if (result == null)
{
return selectBackground;
} return (Brush)result;
} set
{
SetValue(SelectBackgroundProperty, value); //this.InvalidateVisual();
}
} public static DependencyProperty SelectBackgroundProperty =
DependencyProperty.Register("SelectBackground", typeof(Brush), typeof(RegularPolygonControl), new UIPropertyMetadata()); /// <summary>
/// 未选中颜色
/// </summary>
public Brush UnSelectBackground
{
get
{
object result = GetValue(UnSelectBackgroundProperty); if (result == null)
{
return unselectBackgroud;
} return (Brush)result;
} set
{
SetValue(UnSelectBackgroundProperty, value);
}
} public static DependencyProperty UnSelectBackgroundProperty =
DependencyProperty.Register("UnSelectBackground", typeof(Brush), typeof(RegularPolygonControl), new UIPropertyMetadata()); protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
base.OnRender(dc); Point center = new Point(); PointCollection Points = GetPolygonPoint(center, Radius, 12); Canvas ca = new Canvas(); Polygon plg = new Polygon(); plg.Points = Points; plg.Stroke = Brushes.Transparent; plg.StrokeThickness = 2; plg.Fill = this.SelectBackground; plg.FillRule = FillRule.Nonzero; ca.Children.Add(plg); ca.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; ca.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; this.Content = ca;
} /// <summary>
///根据半径和圆心确定N个点
/// </summary>
/// <param name="center"></param>
/// <returns></returns>
private PointCollection GetPolygonPoint(Point center, double r,int polygonBound)
{
double g = 18; double perangle = 360 / polygonBound; double pi = Math.PI; List<Point> values = new List<Point>(); for (int i = 0; i < (int) polygonBound; i++)
{
Point p2 = new Point(r * Math.Cos((g + 36) * pi / 180), r * Math.Sin((g + 36) * pi / 180)); values.Add(p2); g += perangle;
} PointCollection pcollect = new PointCollection(values); return pcollect;
}
}

效果如下:
   

再做一下简单的变化,可以绘制出一般抽奖用的转盘图形,修改如下,

public class TurnTable : UserControl
{
private double radius = 20; private Brush selectBackground = new SolidColorBrush(Color.FromRgb(0xEB, 0x42, 0x00)); private Brush unselectBackgroud = new SolidColorBrush(Color.FromRgb(0x99, 0x93, 0x93)); /// <summary>
/// 半径
/// </summary>
public double Radius
{
get
{
object result = GetValue(RadiusProperty); if (result == null)
{
return radius;
} return (double)result;
} set
{
SetValue(RadiusProperty, value); this.InvalidateVisual();
}
} public static DependencyProperty RadiusProperty =
DependencyProperty.Register("Radius", typeof(double), typeof(TurnTable), new UIPropertyMetadata()); /// <summary>
/// 选中颜色
/// </summary>
public Brush SelectBackground
{
get
{
object result = GetValue(SelectBackgroundProperty); if (result == null)
{
return selectBackground;
} return (Brush)result;
} set
{
SetValue(SelectBackgroundProperty, value); //this.InvalidateVisual();
}
} public static DependencyProperty SelectBackgroundProperty =
DependencyProperty.Register("SelectBackground", typeof(Brush), typeof(TurnTable), new UIPropertyMetadata()); protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
base.OnRender(dc); Point center = new Point(); PointCollection Points = GetPolygonPoint(center, Radius, 12); Canvas ca = new Canvas(); Polygon plg = new Polygon(); plg.Points = Points; plg.Stroke = Brushes.Black; plg.StrokeThickness = 2; plg.Fill = this.SelectBackground; plg.FillRule = FillRule.Nonzero; ca.Children.Add(plg); //外接圆
Brush b = new SolidColorBrush(Colors.Yellow); Pen p = new Pen(b, 2); var path = new Path(); double circleRadius = Radius + 10; EllipseGeometry eg = new EllipseGeometry(center, circleRadius, circleRadius); path.Stroke = Brushes.Black; path.StrokeThickness = 1; path.Data = eg; ca.Children.Add(path); ca.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; ca.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; this.Content = ca;
} /// <summary>
///根据半径和圆心确定N个点
/// </summary>
/// <param name="center"></param>
/// <returns></returns>
private PointCollection GetPolygonPoint(Point center, double r, int polygonBound)
{
double g = 18; double perangle = 360 / polygonBound; double pi = Math.PI; List<Point> values = new List<Point>(); for (int i = 0; i < (int)polygonBound; i++)
{
Point p2 = new Point(r * Math.Cos((g + 36) * pi / 180), r * Math.Sin((g + 36) * pi / 180)); values.Add(p2); values.Add(center); g += perangle;
} PointCollection pcollect = new PointCollection(values); return pcollect;
}
}

这样 两个控件一起看一下效果,

<Window x:Class="TestSomeGraphics.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="1200" Height="900" xmlns:my="clr-namespace:TestSomeGraphics"> <Grid>
<my:RegularPolygonControl HorizontalAlignment="Left" x:Name="regularControl1" Radius="200" SelectBackground="Gray"
Margin="235,358,0,-358" />
<my:TurnTable HorizontalAlignment="Left" Radius="100" Margin="639,358,0,0" x:Name="turnTableControl1" VerticalAlignment="Top" />
</Grid> </Window>

如图,

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/6326307

WPF-24:绘制正多边形的更多相关文章

  1. wpf 后台绘制圆弧

    wpf 前台绘制圆弧很简单,如:<Path x:Name="path_data" Stroke="#FFE23838" StrokeThickness=& ...

  2. C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码

    原文:C#WPF 如何绘制几何图形 图示教程 绘制sin曲线 正弦 绘制2D坐标系 有图有代码 C#WPF 如何绘制几何图形? 怎么绘制坐标系?绘制sin曲线(正弦曲线)? 这离不开Path(Syst ...

  3. WPF 图形绘制 及各种线帽、箭头的实现

    原文:WPF 图形绘制 及各种线帽.箭头的实现  /// <summary>     /// 矩形类     /// </summary>     public sealed ...

  4. WPF特效-绘制实时2D激光雷达图

    原文:WPF特效-绘制实时2D激光雷达图 接前两篇: https://blog.csdn.net/u013224722/article/details/80738619 https://blog.cs ...

  5. 在WPF中绘制多维数据集

    原文 https://stuff.seans.com/2008/08/13/drawing-a-cube-in-wpf/ 是时候使用WPF绘制一个简单的3D对象了.作为WPF中3D图形的快速介绍,让我 ...

  6. 【C#】第3章补充(一)如何在WPF中绘制正弦曲线

    分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.要点 本例子提前使用了教材第13章介绍的基本知识. 二 ...

  7. WPF 如何绘制不规则按钮,并且有效点击范围也是不规则的

    最近在做一个东西,如地图,点击地图上的某一区域,这一区域需要填充成其他颜色.区域是不规则的,而且点击该区域的任一点,都能够变色.普通的按钮只是简单的加载一幅图肯定是不行的.查了很多资料,终于把它搞定了 ...

  8. WPF拖动绘制

    using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using ...

  9. wpf GeometryDrawing 绘制文字

    <GeometryDrawing x:Key="GeometryDrawingText"> <GeometryDrawing.Geometry> <R ...

随机推荐

  1. Go--包引用介绍

    最近在学习Go编程,本文简单的叙述如何在Go编程中使用包(包管理). 和其他大多数语言一样,Go也存在包,并使用package关键字定义一个包.首先介绍在程序中如何引入包,引入包有以下几种方式: 1. ...

  2. Hadoop 1、在虚拟机上进行 HDFS 安装

    一.准备条件 1.四台Linux虚拟机(1台NameNode节点,1台Secondary节点(Secondary和其中1台DataNode共用),外加2台DataNode) 2.下载Hadoop版本, ...

  3. spark1.3的部署

    1.下载源码,根据自己的环境编译,我这里下载的是spark1.3版本 本人采用sbt编译, SPARK_HADOOP_VERSION=2.5.2 SPARK_YARN=ture sbt/sbt ass ...

  4. Socket学习笔记

    ..........(此处略去万万字)学习中曲折的过程不介绍了,直接说结果 我的学习方法,问自己三个问题,学习过程将围绕这三个问题进行 what:socket是什么 why:为什么要使用socket ...

  5. listener笔记

    listener 分四步: 在被观察者类中创建 onXXListener Interface,包含一个方法:xxxListener(object o),参数根据需要观察者需要设定. public in ...

  6. o2o

    o2o(电子商务名词) -- 百度名片 O2O即Online To Offline(在线离线/线上到线下),是指将线下的商务机会与互联网结合,让互联网成为线下交易的前台,这个概念最早来源于美国.O2O ...

  7. MySQL指令记录(Wampserve环境)

    1.MySQL在Wampserve中的默认用户名为'root',默认密码为空: 2.显示所有数据库 show databases; 3.切换数据库 use DATABASE_NAME; 4.列出所有表 ...

  8. Render和template?

    Template是一个模板. render = web.template.render('templates/') 这会告诉web.py到你的模板目录中去查找模板.然后把 index.GET改成: 告 ...

  9. C++的学习记录 - 0

    最近玩Arduino发现,在编写函数库的时候要用到C++.正好手头有一本教材,于是时隔2年,开始重学. 又看到重载.构造.拷贝这些词竟然还有些小兴奋. 开个系列日志记录一下学习过程中的问题和体会. 看 ...

  10. CI框架uri去掉index.php

    CI框架的入口是index.php,所以url实际上要多出一个index.php,非常不美观.我使用的是apache服务器,要开启mod_rewrite服务才可以. sudo a2enmod rewr ...