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

简介: 原文:Sliverlight实例之 绘制扇形和环形图  未解决: 1,任意偏角,是个重点问题: (1),  另一边在弧上坐标 (2),  这个弧的弧度(ArcSegment中的Size或Angle属性) (3),  如何把这个弧度做成依赖属性配置的  2,做成一个自定义控件   有...
原文: 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>

 

目录
相关文章
|
域名解析 缓存 安全
Tomcat - 如何优化 Tomcat 配置(内存、并发、缓存)优化
Tomcat - 如何优化 Tomcat 配置(内存、并发、缓存)优化
1395 0
|
9月前
|
存储 人工智能 Serverless
10 分钟打造你的专属 AI 客服
10 分钟打造你的专属 AI 客服
322 9
|
11月前
|
前端开发 容器
CSS 居中技术完全指南:从基础到高级应用
本文详细介绍了 CSS 中常用的居中方法,涵盖水平居中、垂直居中及同时实现两者的方法。
939 12
|
10月前
|
自然语言处理 JavaScript 前端开发
Qwen开源多语言基准数据集P-MMEval
Qwen开源多语言基准数据集P-MMEval
|
机器学习/深度学习 数据采集 运维
使用 Python 实现深度学习模型:智能食品生产线优化
使用 Python 实现深度学习模型:智能食品生产线优化
257 13
【LVGL快速入门】SquareLine Studio安装教程(LVGL官方工具)
【LVGL快速入门】SquareLine Studio安装教程(LVGL官方工具)
3773 0
|
Dragonfly 算法 安全
RT-Thread快速入门-动态内存堆管理方法
RT-Thread快速入门-动态内存堆管理方法
487 0
|
API
RT-Thread快速入门-中断管理
RT-Thread快速入门-中断管理
470 0
|
消息中间件 存储 容器
RT-Thread快速入门-消息邮箱
RT-Thread快速入门-消息邮箱
417 0
|
关系型数据库 MySQL
MySQL字段默认值设置详解
在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默认值相关知识。
1834 0