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-08-06 19:59:49

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

Unity3D之Mesh(六)绘制扇形、扇面、环形

前言: 绘制了圆,就想到绘制与之相关的几何图形,以便更灵活的掌握Mesh动态创建模型的机制与方法. 一.分析: 首先,结合绘制圆的过程绘制环形: 圆形是由segments个等腰三角形组成的(上一篇中,将圆分为segments份,即segments个等腰三角形),圆环就是有segments个等腰梯形组成的. 那么等腰梯形由什么组成?两个三角形(多个也是可以的). 故:添加一个变量,内圆半径. 即:到此时此刻,我们需要根据:外半径.内半径.分割的数目(  当然如果是扇形或扇面,我们还需要一个角度an

数据输入——生成你需要的echart图(堆积柱状图、扇形图、嵌套环形图)

最近论文需要一些比较直观的图表, 发现echart做出来的图还是比较美观的,这里介绍如何修改数据生成你需要的echart图. 1.堆积柱状图: http://echarts.baidu.com/examples/editor.html?c=bar-stack 以上的类型的颜色是自动分配的,stack属性可以将同一类型的数据放在一个矩形图中. 2.扇形图 http://echarts.baidu.com/examples/editor.html?c=pie-legend 1---->随机生成扇形图

[ActionScript 3.0] 动态绘制扇形实例(拖拽绘制)

1 package 2 { 3 import flash.display.Shape; 4 import flash.display.Sprite; 5 import flash.events.MouseEvent; 6 7 /** 8 * @author Frost.Yen 9 * @E-mail [email protected] 10 * @create 2015-7-13 上午11:14:16 11 * 12 */ 13 [SWF(width="800",height=&quo

利用JFreeChart绘制股票K线图完整解决方案

http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) 标签: 绘制 股票 k线 it 分类: 软件_Software 因为工作的需要,接触了一些股票图形绘制类的工作,其中最主要的还是股票K线图的绘制了,如果利用编程语言最底层的图形绘制方法去绘制这类图形,如果对编程语言不是特别熟悉的话,一般是有很大的困难的,通过在网上搜索发现,以自己最熟悉的两门语言为

用canvas绘制的饼状图,6等分,颜色随机

都说程序员懒,生活还是不能懒的,比如洗头.洗脸,当然也包括是分享咯.下面分享一下我用H5的新标签canvas绘制的饼状图,颜色是随机生成的,动态生成6等分,我还做了随机生成数据的, 配上文字,每份所占的比例就显而意见.,这点用在分析数据还是挺好的.图片如下; canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现.. 基本使用语法: 使用

Echarts个性化图表的样式--绘制南丁格尔图

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>个性化图表的样式--绘制南丁格尔图</title> </head> <body> <div id="main" style="width:800px;height:600px;">&

绘制扇形效果线条小Bug解决

绘制线条基本代码: 变量: CPoint m_ptOrigin;//起点坐标 bool m_bTrue;//检查鼠标左键是否按下 CPoint m_ptOldOrigin;//记录上一次绘制终点坐标,用于绘制边界线 初始化: m_ptOrigin = 0; m_bTrue = false; m_ptOldOrigin = 0; 代码实现: void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: Add your mes

使用canvas编写环形图.

原理使用canvas画图: 第一步:画一个大圆 第二部:画一个扇形 第三部:画一个小圆 相互叠加. 最终效果: 现在上代码: (function($){ $.fn.drawPic=function(opts){ var defaults={ canvasbj:"white",//画布背景 canvasWidth:50, canvasHeight:50, bigBg:"red",//大圆背景 bigRadius:50,//大圆半径 ringColor:"ye

环形图 自定义(一)

需求:自定义环形图(饼图),实现2项数据配比显示; 效果图: 实现分析: 1.目录结构: 代码实现: 1. color.xml <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 饼图 --> <color name="pie_progress_bank">#fd8f8b</color> <color name="