Sliverlight实例之 绘制扇形和环形图

原文:Sliverlight实例之 绘制扇形和环形图

 

未解决:

1,任意偏角,是个重点问题:

(1),  另一边在弧上坐标

(2),  这个弧的弧度(ArcSegment中的Size或Angle属性)

(3),  如何把这个弧度做成依赖属性配置的 

2,做成一个自定义控件

 

有时间,再完成 

 

准备知识:

1,  平面几何思维(三角形,圆,弧,曲线,斜率,方程式)

2,  三次贝塞尔曲线的数学公式

3,  定时器与动画的区别是时间序列

4,  缓动动画

 

一,1道几何题

 

 

 

已知两点坐标确定一条直线,直线上存在一个未知点,起始点与未知点的距离已知

求:未知点坐标

 

思路,如下:

 

 

求AB长度,可以根据两点距离公式

 

 

 

 

 

 

二,写个C#

 

定义一个Point类,代表坐标,它有两个成员x和y

定义一个方法GetLength,获取两点距离

 

       /*
            有两点坐标a(1,24) b(35,58) 连成一条直线,现在ab连线有一点p,pa长度为12
            求:p点的坐标
        */
        class Point
        {
            public double x;
            public double y;
            public Point(int x,int y)
            {
                this.x=x;
                this.y=y;
            }
            public static double GetLength(Point a,Point b)
            {
                return Math.Sqrt(Math.Pow(a.x - b.x, 2) + Math.Pow(a.y - b.y, 2));
            }
        }

       private Point GetPoint(Point a, Point b, double otherLength)
        {
            Point p = new Point(0, 0);

            p.x = otherLength * (b.x - a.x) / Point.GetLength(a, b) + a.x;
            p.y = otherLength * (b.y - a.y) / Point.GetLength(a, b) + a.y;

            return p;
        }

        //测试方法
        static void main()
        {
            double otherLength = 12;
            double radius = 58;

            //a:起点      b:终点    p:a,b之间任意一点
            Point a1 = new Point(1, 24);
            Point b1 = new Point(35, 58);
      }

 

 

 

 

三,绘制一个扇形

 

思路:使用PathGeometry中的LinearSegment和ArcSegment来绘制

 

 

 

 

(1)     确定两点坐标,绘制一条直线

(2)     已知半径长度,得到圆心坐标

(3)     按任意偏角绘制一条弧形

 

这个任意偏角,是个重点问题:

(1),  另一边在弧上坐标

(2),  如何把这个弧度做成依赖属性配置的

 

xaml代码:

       <Path x:Name="PathFillColor" Fill="Green" Canvas.Top="100" Canvas.Left="100" Stroke="Black" StrokeThickness="2">
                <Path.Data>
                    <PathGeometry>
                        <PathFigure StartPoint="1,24" IsClosed="True">
                        <LineSegment Point="9.48528137423857,32.4852813742386"/>
                        <ArcSegment Size="80,80" Point="59,13" SweepDirection="Clockwise"/>
                        <LineSegment Point="59,1"/>
                        <ArcSegment Size="80,80" Point="1,24" SweepDirection="Counterclockwise"/>
                    </PathFigure>
                    </PathGeometry>
                </Path.Data>
            </Path>

 

 

效果图

 

 

 

 

 

四,绘制环形

 

 

 

思路:

上图由8个扇形组成,即每个扇形偏角45度

可以用8个按钮代替

 

那么:

将按钮做成控件模板,内容就是一个扇形

则8个按钮使用这个控件模板

再对每个按钮进行45度旋转(使用RotateTransform实现)

 

 

定义控件模板

<UserControl.Resources>
        <Style x:Key="CircleStyle1" TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Canvas>
                            <Canvas>
                                <Canvas.RenderTransform>
                                    <TransformGroup>
                                        <ScaleTransform x:Name="RenderScaleX" />
                                        <RotateTransform/>
                                    </TransformGroup>
                                </Canvas.RenderTransform>
                                <Path x:Name="PathFillColor" Fill="{TemplateBinding Button.Background}">
                                    <Path.Data>
                                        <PathGeometry>
                                            <PathFigure StartPoint="1,24" IsClosed="True">
                                                <!--
                                                <LineSegment Point="35,58"/>
                                                <ArcSegment Size="30,30" Point="59,48" SweepDirection="Clockwise"/>
                                                <LineSegment Point="59,1"/>
                                                <ArcSegment Size="80,80" Point="1,24" SweepDirection="Counterclockwise"/>
                                                -->
                                                <LineSegment Point="9.48528137423857,32.4852813742386"/>
                                                <ArcSegment Size="80,80" Point="59,13" SweepDirection="Clockwise"/>
                                                <LineSegment Point="59,1"/>
                                                <ArcSegment Size="80,80" Point="1,24" SweepDirection="Counterclockwise"/>
                                            </PathFigure>
                                        </PathGeometry>
                                    </Path.Data>
                                </Path>
                                <TextBlock Foreground="Black" Text="{TemplateBinding Button.Content}"  Canvas.Left="20" Canvas.Top="20">
                                    <TextBlock.RenderTransform>
                                        <RotateTransform Angle="-25"/>
                                    </TextBlock.RenderTransform>
                                </TextBlock>
                            </Canvas>
                        </Canvas>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    </UserControl.Resources>

 

 

使用样式

<Button x:Name="btn1" Background="#0024CE" Height="60" Width="60" Margin="42,18,0,0" Canvas.Top="0" Canvas.Left="0" RenderTransformOrigin="0.97,1.4" Content="1" Style="{StaticResource CircleStyle1}">
                <Button.RenderTransform>
                    <TransformGroup>
                        <RotateTransform/>
                    </TransformGroup>
                </Button.RenderTransform>
            </Button>

            <Button x:Name="btn2" Background="#00ace7" Height="60" Width="60" Margin="42,18,0,0" Canvas.Top="0" Canvas.Left="0" RenderTransformOrigin="0.97,1.4" Content="2" Style="{StaticResource CircleStyle1}">
                <Button.RenderTransform>
                    <TransformGroup>
                        <RotateTransform Angle="45"/>
                    </TransformGroup>
                </Button.RenderTransform>
            </Button>

            <Button x:Name="btn3" Background="#9dff00"  Height="60" Width="60" Margin="42,18,0,0" Canvas.Top="0" Canvas.Left="0" RenderTransformOrigin="0.97,1.4"  Content="3" Style="{StaticResource CircleStyle1}">
                <Button.RenderTransform>
                    <TransformGroup>
                        <RotateTransform Angle="90"/>
                    </TransformGroup>
                </Button.RenderTransform>
            </Button>

 

时间: 2024-07-29 14:37:40

Sliverlight实例之 绘制扇形和环形图的相关文章

PPT绘制设计一个百分比的分割型环形图

  场景:企业人事.财务.市场.项目部等需要PPT设计制作的办公人士. 方法/步骤 新建一个PPT,在"形状"中插入"同心圆".(下图 1 处) 接下来插入矩形(下图 2 处),注意矩形的最小宽度,保证矩形有旋转调节钮.(下图 3 处) 接下来复制一个矩形,然后按住Shift键,鼠标拖拽旋转调节钮,可进行每15度的旋转.调节到30度的位置.如下图所示: 以此类推后的效果: 接下来重要的操作,需要把矩形框变细.应该如何操作呢?选中下图中的三条矩形.按住shift+ct

Illustrator绘制3D楼层户型图效果实例教程

给各位Illustrator软件的使用者们来详细的解析分享一下绘制3D楼层户型图效果的实例教程. 教程分享:               好了,以上的信息就是小编给各位Illustrator的这一款软件的使用者们带来的详细的绘制3D楼层户型图效果的实例教程分享的全部内容了,各位看到这里的使用者们,小编相信大家现在看到这里了是很清楚了绘制方法了吧,那么大家就快去按照小编上面的教程自己去绘制看看效果吧.

VC6绘制3D饼状图

自从我的<VC6绘制3D饼状图>做好以后,因为留有bug,心里总觉得不舒服,通过网友的提示,思考之后,一下豁然开朗--VC是如此的强大,不应该这么简单的问题,做起来这么麻烦!还是受了那个.net作者的误导? 其实,最初的思路就是最好的方法!,只不过需要稍作修改.我第一个思路是把扇形一个一个叠起来,这样最后一个扇形在叠的过程中,侧面的边会破坏已经叠好的扇形.哎,为什么那么傻呢!把那个椭圆画完了再叠不是很简单?说干就干,修改,删除多余的代码,先画好分割扇形的椭圆(图1): 图1 然后把这个椭圆作为

Nordri Tools如何制作超酷环形图

  1.打开PowerPoint(必须要有Nordri Tools,没有Nordri Tools的先下载安装). 2.插入形状-圆角矩形-无轮廓,渐变填充-添加光圈(5个).角度40°.三维格式-顶部棱台;材料-金属效果. 3.在钟表盘即圆角矩形中插入圆形-填充白色,再在圆形中插入文本框. 4.单击菜单栏中的Nordri Tools,选择"环形复制",在出现的对话框中输入参数:数量:12,扇形角度:360°,形状直径:75.插入箭头,调整大小作为时针.分针.秒针. 这样一个超酷的环形图

前端-chart.js中环形图显示数据的宽度

问题描述 chart.js中环形图显示数据的宽度 chart.js绘制环形图,鼠标放在上面显示的数据,如何改变其显示宽度?

前端-chart.js中环形图的标签的宽度

问题描述 chart.js中环形图的标签的宽度 用chart.js绘制环形图or饼状图,标签(label)的宽度如何设置??

php使用Jpgraph绘制3D饼状图的方法_php技巧

本文实例讲述了php使用Jpgraph绘制3D饼状图的方法.分享给大家供大家参考.具体实现方法如下: <?php include ("src/jpgraph.php"); include ("src/jpgraph_pie.php"); include ("src/jpgraph_pie3d.php"); $data = array(19,23,34,38,45,67,71,78,85,87,90,96); $graph = new Pie

photoshop绘制蓝色心形图

通过photoshop来绘制蓝色心形图教程,情人节最佳礼物. 最终效果: 制作步骤: 1.打开PS,新建文件---500*400像素,白色背景,72像素分辨率. 2.新建一层,填充渐变--蓝白色对角渐变. 2.新建一层,用椭圆选区拉个圆形,羽化20,填充径向渐变,黄白渐变. 3.为此层添加图层样式---内发光,参数如图: 4.添加渐变叠加样式,参数如图: 5.新建一层,使用白色画笔工具从下部向中部涂抹,边缘选用树叶形状画笔涂抹,调整笔刷的不透明度,虚实自己把握,随意涂抹,如图: 6.复制此层,向

Excel怎么绘制漂亮的折线图

Excel怎么绘制漂亮的折线图 说个笑话:诸葛亮就曾经有这样的感叹:"临表涕零,不知所云",意思就是拿着一张Excel图表,因为看不懂这个图表要表达啥意思,不由得鼻涕眼泪的哭了起来. 首先说明一点,操作不复杂,但是步骤比较多,请提前做好心理准备. 看数据源: 制作过程: 单击数据区域,插入一个柱形图. 单击网格线,按Delete键删除.单击交易规模数据系列,[设计][更改图表类型],选择带数据标记的折线图. 双击环比增长数据系列(在贴近水平轴的地方),设置为次坐标轴: