一般来说绘制正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