返回首页

目录{A}
通用多边形??为什么我们需要它吗?这个问题的答案可以开始一个简单的任务,它解决了上市:按照一些规则的动态定位的顶点四舍五入的多边形渲染。为什么不呢?这种任务的标准解决方案通常是减少创造Bezier曲线,其中顶点是通过结合和转换的计算。该解决方案是相当费力,往往需要不仅是复杂和漫长的操作在声明代码,也是一种命令式编程退格。但是,什么是做的事,如果您需要更改一次多边形的顶点的曲率半径为所有,或至少一个只?我想提醒你,三次曲线是指由四个顶点,而二次之一是由三个。人们必须非常小心,使曲线没有"打破??只要指导相邻节段线必须沿一条线传递的关节点。但什么是必须要做的,如果需要移动一个顶点,曲率必须保持不变呢?如果你没有改变顶点曲率变化?如果两人都在一个比例关系呢?如果一个自然的循环,而不是一个抛物线,是必要的,曲线的一部分?业余程序员简单的行为吗??他们给静态图片。 "这不是我们的方式。我们应走的另一种方式"!(© VILenin)将进一步考虑。
在上一节,有制定普遍多边形的两个基本目标:四舍五入的角落和其动态定位。在静态的形式,可以解决这个任务由三个值每个多边形顶点的定义:两个坐标和半径。在动态中,所有三个值分为三个组件:绝对值和三个相对的水平和垂直值从零到一??。这九个值,作为一项规则,只有七个需要,它并不总是(很少需要这样的规则时,相对水平分量应该影响垂直的绝对值或相对的垂直价值应该影响水平的绝对值) 。时刻形成多边形图,多边形的顶点的计算公式如下:
(xabs. xrel.hor宽度xrel.ver•高度,yabs。yrel.hor•宽度yrel.ver•高度,RABS。rrel.hor•宽度rrel.ver•高度),
在这里:xabs,yabs,RABS。 ?绝对坐标和半径组件(范围为[-8,8]);xrel.hor。yrel.hor。rrel.hor。在横轴上的投影坐标和半径的相对元件([0,1]范围);?xrel.ver。yrel.ver。rrel.ver。 ??在纵轴上的投影坐标和半径的相对元件([0,1]范围)。
了解负值半径造成混乱,因此我将立即提,加号表示有必要建立一个圆段,遍历直接顺序图的顶点,但减号表示相反的顺序。当前的实现,最终的结果是一样的的(从而此信息,而不是实际熟悉)。
下面还有UniPoint类,它实现普遍多边形UniPolygon的顶点的签名的一部分。 ???后缀属性代码> 0指定绝对值;????带有后缀的属性代码> W和代码> H指定宽度和高度的相对值??。

public class UniPoint : 

    DependencyObject, INotifyPropertyChanged {

    //  . . .

    public double X0 { get; set; }

    public double Y0 { get; set; }

    public double R0 { get; set; }

    public double Xw { get; set; }

    public double Yw { get; set; }

    public double Rw { get; set; }

    public double Xh { get; set; }

    public double Yh { get; set; }

    public double Rh { get; set; }

    //  . . .

    public override string ToString();

    public static UniPoint Parse(string s);

对象UniPoint签名属性中列出的依赖项属性和覆盖数据绑定。
为了简化XAML标记,字符串值转换成UniPoint类型的对象,反之亦然。字符串的格式如下:X0 [,XW,XH]; Y0 [,YH,YW] [; R0 [,RW [RH]] [;;].在方括号中,也有可选参数。第一高度,然后由宽度:特别强调的是放在纵轴上的相对组成部分的事实,以相反的顺序Y0,YH,YW]。这样做,以减少标记记录,很少有必要,因为它是指定对象的宽度,垂直值的依赖;并表明零每次只能以点带面,然后是不理性的高度因素。
它应该也可以告诉分隔符。可以看出,相对分离的绝对值由逗号; X,Y和半径R值由分号分隔。如果使用的区域设置是这样的小数分隔符包含一个逗号,然后的绝对值和相对值值之间的分隔符是现在采取的分号,X,Y和半径R之间的分隔符将一个管道符号« | »。如果事实证明,小数分隔符包含一个分号符号,然后分隔符将一个管道符号« | »和diesis签署«#»。为了把它简单的话,的逻辑可以表示的字符链«.,;|#»,,其中有一个从左侧转移到正确的在从左侧的一个字符巧合的情况下的和区域设置的小数分隔符的象征。
UniPoint顶点放置在UniPointCollection,其中也包括字符串值转换成集合,反之亦然。下面是这个类的签名的一部分:{C}
UniPointCollection UniPoint顶点显示完全在于UniPolygon类。它简洁的签名如下:
public sealed class UniPolygon : Shape {

//  . . .

public UniPointCollection Points { get; set; }

public double DefaultRadiusIn { get; set; }

public double DefaultRadiusOut { get; set; }

public double Offset { get; set; }

public bool IsClosed { get; set; }

让我们考虑它的属性。物业说明积分多边形的顶点的集合。DefaultRadiusIn默认情况下,多边形的内角半径。默认为0。DefaultRadiusOut 默认情况下,半径为多边形的外角。默认为0。偏移缩进多边形的边界。正面的价值观增加数字的大小,而消极的减少。默认为0。IsClosed封闭的身影。定义需要连接的第一个多边形的最后一个点。默认是真实的。几何返回几何多边形对象;可以用来创建复合形状,特别是切割领域。
如果没有明确表示为多边形的顶点,则有DefaultRadiusIn和DefaultRadiusOut属性默认情况下使用半径圆角半径。如果半径太大,进入多边形的角圆,然后不进行四舍五入的角落。
午餐的程序,连接到的文章,我们将看到类似以下的窗口:{S0}
几乎所有的窗口的数据普遍多边形UniPolygon对象。例外的是按钮的圆圈,以尽量减少和关闭的窗口和几个矩形。但是,即使这些例外可能是可以避免的,如果这将是理性的具体任务。注意调整窗口大小时,其构成要素都从属于一定的规则。最小化和关闭窗口的按钮总是位于右上角,有一个固定大小的窗口多边形四舍五入的半径也固定和不伸展或收缩,调整窗口大小,这无疑将被标记在使用Bezier曲线作为一个基数。还要注意的牛市图和野兔的爪子的厚度大小头和腿的厚度没有改变时,他们的总大小的变化。为了达到通过标准的WPF图形类似的效果不会很容易,但这里是一个数字只有一个XAML元素决定。
在上面的图片中,有一些看起来像野兔的影子。这种效应可以实现通过创建CombinedGeometry对象与结算财产GeometryCombineMode ="排除??/ code>和约束Geometry2财产野兔多边形的财产UniPolygon.Geometry。
<Path

  x:Name="x_tPlgHareGhost"

  Fill="LightBlue" Stroke="Aqua" Opacity="0.3"

  HorizontalAlignment="Right" Margin="20,113,25,45"

>

  <Path.Data>

    <CombinedGeometry

      GeometryCombineMode="Exclude"

      Geometry2="{Binding ElementName=m_tPlgHare, Path=Geometry}">

      <CombinedGeometry.Geometry1>

        <RectangleGeometry Rect="0,0,100,900"></RectangleGeometry>

      </CombinedGeometry.Geometry1>

    </CombinedGeometry>

  </Path.Data>

</Path>

一个简单的例子将展示使用UniPlygon对象。让我们创建一个五角大楼为矩形,上部是弯曲的轻微向内,并定义的曲率半径。这种类型的对象可以定义标记XAML代码类似于以下:
<b:UniPolygon

  x:Name="m_tPlg1"

  Points="

    50;           50      ;;

     0,  0.5;     75      ;;

  -100,    1;     50      ;;

  -100,    1;     -100,0,1;;

    50,    1;     -100,0,1;;

  "

  DefaultRadiusIn="50"



  DefaultRadiusOut="150"

  Stroke="YellowGreen" 

  Stretch="None"

  Margin="0"

  Offset="0"

  IsClosed="False"

  StrokeThickness="5.01">

  <b:UniPolygon.Fill>

    <SolidColorBrush Color="Yellow" Opacity="0.4"/>

  </b:UniPolygon.Fill>

</b:UniPolygon>

绝对相同的形状可以是一个略有不同的标记定义,其收集的多边形节点是不是已经由一个字符串值,但UniPoint元素,其中前两个已明确定义的参数,和最后三个指定一个字符串值。申请前两个顶点的书面形式是比较合适的,在有需要绑定一些数据的值。
<b:UniPolygon

  x:Name="m_tPlg2"

  DefaultRadiusIn="50"



  DefaultRadiusOut="150"

  Stroke="YellowGreen" 

  Offset="0"

  IsClosed="False"

  StrokeThickness="5.01">

  <b:UniPolygon.Points>

    <b:UniPoint X0="50" Y0="50"/>

    <b:UniPoint Xw="0.5" Y0="75"/>

    <b:UniPoint> -100,    1;   50        </b:UniPoint>

    <b:UniPoint> -100,    1; -100, 0,  1 </b:UniPoint>

    <b:UniPoint>   50      ; -100, 0,  1 </b:UniPoint>

  </b:UniPolygon.Points>

  <b:UniPolygon.Fill>

    <SolidColorBrush Color="Yellow" Opacity="0.4"/>

  </b:UniPolygon.Fill>

</b:UniPolygon>

现在让我们创建一个重复前一个的数字,但其中有8个单位的大小,比第一次少。对于这一点,我们将结合新图点财产和旧,并确定偏移量与价值的多边形轮廓缩进4 / code>的吗???:
<b:UniPolygon

  x:Name="m_tOP2"

  Points="{Binding ElementName=m_tOP1, Path=Points}"

  StrokeThickness="0.1"

  Offset="-4">

  <b:UniPolygon.Fill>

    <LinearGradientBrush Opacity="0.8">

      <GradientStop Color="LightGray" Offset="0"/>

      <GradientStop Color="Snow" Offset=".75" />

      <GradientStop Color="LightGray" Offset="1" />

    </LinearGradientBrush>

  </b:UniPolygon.Fill>

</b:UniPolygon>

因此,有两个平行的数字。在上面的图片中,其结果是代表在橄榄绿色,明亮的绿色轮廓的顶部矩形一个向内弯曲。
对于那些你想使用命令代码UniPlygon,这里是一个示例:
var t = new UniPolygon();

t.ToolTip = "This figure was programmed\nin imperative code.";

t.DefaultRadiusIn = 3;

t.StrokeThickness = 2;

t.Fill = Brushes.BlanchedAlmond;

t.Stroke = Brushes.BlueViolet;

t.Opacity = 0.5;

t.Points.Add(new UniPoint(0, 0, 20, 0));

t.Points.Add(new UniPoint(X0: 20, Y0: 20));

t.Points.Add(new UniPoint(X0: 20, Y0: 35, R0: 10));

t.Points.Add(new UniPoint(X0: 40, Y0: 35, R0: 10));

t.Points.Add(new UniPoint(X0: 40, Y0: 20));

t.Points.Add(new UniPoint(X0: -10, Xw: 0.5, Y0: 20));

t.Points.Add(new UniPoint(X0: 21, Xw: 0.5, Y0: 65, R0: 8));



t.Points.Add(new UniPoint(X0: 35, Xw: 0.5, Y0: 55, R0: 8));



t.Points.Add(new UniPoint(X0: 14, Xw: 0.5, Y0: 25));

t.Points.Add(new UniPoint(X0: 20, Xw: 0.5, Y0: 20));

t.Points.Add(new UniPoint(X0: 51, Xw: 0.5, Y0: 65, R0: 8));



t.Points.Add(new UniPoint(X0: 65, Xw: 0.5, Y0: 55, R0: 8));



t.Points.Add(new UniPoint(X0: 40, Xw: 0.5, Y0: 20));

t.Points.Add(new UniPoint(X0: 0, Xw: 1, Y0: 20, R0: 20));

t.Points.Add(new UniPoint() { X0 = 0, Xw = 1, Y0 = 0, Yh = 1 });

t.Points.Add(new UniPoint() { X0 = -20, Xw = 1, Y0 = 0, Yh = 1 });

t.Points.Add(new UniPoint() { X0 = -20, Xw = 1, Y0 = -20, Yh = 1, R0 = 10 });

t.Points.Add(new UniPoint() { X0 = -40, Xw = 1, Y0 = -20, Yh = 1, R0 = 10 });

t.Points.Add(new UniPoint() { X0 = -40, Xw = 1, Y0 = 0, Yh = 1 });

t.Points.Add(new UniPoint() { X0 = -60, Xw = 1, Y0 = 0, Yh = 1 });

t.Points.Add(new UniPoint() { X0 = -60, Xw = 1, Y0 = -20, Yh = 1, R0 = 10 });

t.Points.Add(new UniPoint() { X0 = -80, Xw = 1, Y0 = -20, Yh = 1, R0 = 10 });

t.Points.Add(new UniPoint() { X0 = -80, Xw = 1, Y0 = 0, Yh = 1 });

t.Points.Add(new UniPoint() { X0 = 0, Y0 = 0, Yh = 1, R0 = 20 });

t.Points.Add(new UniPoint(X0: 0, Y0: 70));

var tUniPoint1 = new UniPoint(X0: 5, Xw: 0.5, Y0: 70, R0: 10);

t.Points.Add(tUniPoint1);

t.Points.Add(new UniPoint(X0: 5, Xw: 0.5, Y0: 50, R0: 10));



t.Points.Add(new UniPoint(X0: 0, Y0: 50));

m_tGrid.Children.Add(t);

一切都相当简单,方便,快捷。我们的目标是实现了!{A8}
在这篇文章中提供的材料早已在我的工作中取得的伟大的货币。如果有人对你有用,请投票支持的文章。投诉,建议和意见是欣然接受,总是和现在。感谢您的关注! 2011年5月9日 - 初始版本2011年5月26日 - 更新1在命令代码编程的加样图UniPoint构造函数实施一些新的重载| Bourlesque

回答

评论会员:游客 时间:2012/01/27
伟大的代码!(我恨你的代码格式,但我不会标记,imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif)
Bourlesque
评论会员:游客 时间:2012/01/27
!,菲尔自从我成为一个F#中的风扇,我开始讨厌大括号。我的格式近似在一定程度上的C#到F#的语法。{S2}干杯!Bourlesque
OtherControls
评论会员:良好的工作 时间:2012/01/27
Bourlesque
评论会员:游客 时间:2012/01/27
感谢的客气话!imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif
Bourlesque
评论会员:游客 时间:2012/01/27
非常漂亮!感谢分享。imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif
吉拉德Keinan
评论会员:游客 时间:2012/01/27
,菲利普!imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif
Bourlesque
评论会员:游客 时间:2012/01/27
C#示例代码,欢迎更多的吉拉德Keinan
Bourlesque
评论会员:游客 时间:2012/01/27
!,吉拉德感谢您的关注的文章。不迟于本星期四我会提供一些必要的代码(我现在太忙了。)最好的问候,Bourlesque
丹尼斯Dykstra
评论会员:游客 时间:2012/01/27
!嗨,吉拉德您的要求的文章已更新。干杯!Bourlesque日(星期四),5月26日,修改20116:34
Bourlesque
评论会员:游客 时间:2012/01/27
非常有趣的方法,很好地执行
。马塞洛里卡多 - 奥利维拉
评论会员:游客 时间:2012/01/27
,丹尼斯!我很欣赏您的评论imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif顺便说一下,代码可以很容易地适应为WinForms,为MFC,它需要在COM包装。最好的问候,Bourlesque
Bourlesque
评论会员:游客 时间:2012/01/27
这是相当的创新性和趣味性,感谢分享!欢呼声中,马塞洛在{A9}看看这里的代码项目