WPF使用PATH来画圆
WPF使用Path来画圆, 在 WPF 中可以使用 Path (路径) 来画圆,而 Path 支持两种写法:xaml 代码格式、标记格式,这里介绍的是标记格式:
例子:
<Path Data="M 300,300 A 100,100 0 1 1 300,299 Z" Stroke="Black" StrokeThickness="5" Fill="Transparent"/>
效果:
结合代码解释:
1. Stroke 表示圆边框的颜色,这里是黑色 black
2. StrokeThickness 表示边框粗细
3. Fill 表示圆内部的颜色,这里为蓝色 blue
4. Path 的 Data 属性,就是描述当前路径是如何描画的
Data=”M 300,300 A 100,100 0 1 1 300,299 Z”
M 300,300 : 300,300 表示起始坐标,字母 M 为 Move, 意思是将画笔移到 300,300 处;
A 100,100 0 1 1 300,299 这是圆弧的书写语法,详细格式如下:
A 表示 Arc 圆弧,
100,100 表示圆弧的 x, y 值,表示椭圆时表示大小半径,圆是两值相同;
0 表示图形的旋转角度;
1 当图形设置了旋转角度,并且大于 180度时,才会生效,1 表示取大圆弧,0 表示取小圆弧;
1 表示画圆时笔画是是顺时针画,需要逆时针时设置为 0;
300,299 表示终止坐标
Z 表示路径闭合。
官方描述如下:
Elliptical Arc Command
Creates an elliptical arc between the current point and the specified end point.
语法格式如下:
A size rotationAngle isLargeArcFlag sweepDirectionFlag endPoint
或者
a size rotationAngle isLargeArcFlag sweepDirectionFlag endPoint
参数 | 描述 |
size | System.Windows.Size The x- and y-radius of the arc. 就是起始坐标,如 (0, 0) |
rotationAngle | System.Double The rotation of the ellipse, in degrees. 图形的旋转角度 |
isLargeArcFlag | Set to 1 if the angle of the arc should be 180 degrees or greater; otherwise, set to 0. 当画正圆和椭圆时,不生效;只有在画圆弧时, 并且旋转角度大于 180 是才生效, 判断是取小圆弧合适大圆弧 |
sweepDirectionFlag | Set to 1 if the arc is drawn in a positive-angle direction; otherwise, set to 0. 1 为顺时针画图,0 为逆时针画图 |
endPoint | System.Windows.Point The point to which the arc is drawn. 终止坐标 |
注意:标记命令不区分大小写
正圆是椭圆的子集,上述的语法其实是针对所有椭圆都有效的,编写 Data 的思路大致可以参考以下说明:
1.确定起始坐标、终止坐标;
这决定了路径的起始位置和结束位置,特别注意:
如果需要画正圆,大小半径必须一样,而因为起始坐标和终止坐标不能相同,所以一般终止坐标减一,例如:
起始坐标 (100, 100)
终止坐标可以为 (100, 99) 或者 (99, 100)
2.半径和坐标之间的关系:
当只画部分圆弧时,两个坐标之间的距离会影响半径的大小:
当两个坐标之间的距离大于2倍半径之和时,半径(椭圆的小半径)为两坐标距离/2;
当两坐标之间的距离小于2倍半径之和时,半径 (椭圆的小半径) 为设定值;
例子如下:
3 个图形,圆心坐标为(300,300),顺时针画圆
<Path Data="M 300,300 A 100,100 0 1 1 300,0 Z" Stroke="Black" StrokeThickness="5" Fill="Transparent"/>
<Path Data="M 300,300 A 100,100 0 1 1 300,100 Z" Stroke="Red" StrokeThickness="5" Fill="Transparent"/>
<Path Data="M 300,300 A 100,100 0 1 1 300,200 Z" Stroke="Violet" StrokeThickness="5" Fill="Transparent"/>
结果如下:
黑色图形的两个坐标的距离大于2倍半径,所以最终的半径变大;
红色图形和紫粉色图形的两个坐标的距离小于2倍半径,所以半径不变;
总结:
1. 画圆弧(圆形)时,先确定两个坐标(起始坐标、终止坐标);
2.确定顺时针还是逆时针方向画图;
3.如果是椭圆还可以根据需求设置旋转角度;
4.如果设置了旋转角度大于 180 度,可以通过设置获取大圆弧还是小圆弧;
椭圆的例子:
<!--黑色椭圆,是原始角度-->
<Path Data="M 300,300 A 100,50 0 1 1 300,299 Z" Stroke="Black" StrokeThickness="5" Fill="Transparent"/>
<!--红色椭圆,旋转了90度-->
<Path Data="M 300,300 A 100,50 90 1 1 300,299 Z" Stroke="Red" StrokeThickness="5" Fill="Transparent"/>
<!--紫蓝色椭圆,逆时针画的-->
<Path Data="M 300,300 A 100,50 0 1 0 300,299 Z" Stroke="BlueViolet" StrokeThickness="5" Fill="Transparent"/>
结果如下:
设置了大于180度的旋转角度,并根据需要获取大小圆弧
<!--红色的圆,旋转200度,顺时针,获取大圆弧-->
<Path Data="M 50,200 A 100,100 200 1 0 200,100" Stroke="Red" StrokeThickness="5" Fill="Transparent"/>
<!--咖啡色的圆,旋转200度,逆时针,获取大圆弧-->
<Path Data="M 50,200 A 100,100 200 1 1 200,100" Stroke="Chocolate" StrokeDashArray="4 1" StrokeThickness="5" Fill="Transparent"/>
<!--绿色的圆,旋转200度,顺时针,获取小圆弧-->
<Path Data="M 50,200 A 100,100 200 0 1 200,100" Stroke="LawnGreen" StrokeDashArray="2 2" StrokeThickness="5" Fill="Transparent"/>
<!--蓝色的圆,旋转200度,逆时针,获取小圆弧-->
<Path Data="M 50,200 A 100,100 200 0 0 200,100" Stroke="Blue" StrokeDashArray="3 3" StrokeThickness="5" Fill="Transparent"/>
效果如下图:
设置了大于180度的旋转角度,椭圆弧获取大小圆弧:
注意:strokedasharray = “4 1” 是用来设置虚线显示效果的,4 表示虚线中每段实体的长度,1表示虚线中每段空白的长度
<!--黑色椭圆弧,旋转200度,逆时针,取大圆弧-->
<Path Data="M 400,300 A 200,100 200 1 0 200,150" Stroke="Black" StrokeThickness="5" Fill="Transparent"/>
<!--粉红色椭圆弧,旋转200度,顺时针,取大圆弧-->
<Path Data="M 400,300 A 200,100 200 1 1 200,150" Stroke="PaleVioletRed" StrokeDashArray="4 1" StrokeThickness="5" Fill="Transparent"/>
<!--蓝色椭圆弧,旋转200度,逆时针,取小圆弧-->
<Path Data="M 400,300 A 200,100 200 0 0 200,150" Stroke="Blue" StrokeThickness="5" StrokeDashArray="4 2" Fill="Transparent"/>
<!--绿色椭圆弧,旋转200度,顺时针,取小圆弧-->
<Path Data="M 400,300 A 200,100 200 0 1 200,150" Stroke="Green" StrokeThickness="5" StrokeDashArray="4 2" Fill="Transparent"/>
结果如下图:
-------------------------------------------------------------------------------------------------------------------------------------
<Grid>
<Path x:Name="p1" Stroke="Black" StrokeThickness="5" Fill="Transparent"/>
<Path Data="M 300,300 A 100,100 0 1 1 300,299 Z" Stroke="Black" StrokeThickness="5" Fill="Transparent"/>
</Grid>
C# code..
string str = "M 600,600 A 100,100 0 1 1 600,599 Z";
p1.Data = Geometry.Parse(str);
WPF使用PATH来画圆的更多相关文章
- WPF 中 Path 使用虚线
效果如下: 上图由两个圆弧组成,代码如下: <!--红色的实线圆弧,旋转200度,顺时针,获取大圆弧--> <Path Data="M 50,200 A 100,100 2 ...
- 深入WPF中的图像画刷(ImageBrush)之2——ImageBrush的铺设方式
原文:深入WPF中的图像画刷(ImageBrush)之2--ImageBrush的铺设方式 ------------------------------------------------------ ...
- WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆
一.前言 吐槽一下,百度在国内除了百度地图是良心产品外,其他的真的不敢恭维.在上一篇笔记里,我已经实现了自定义的地图测量模块.在百度地图里面(其他地图)都有一个周边搜索的功能,拖拽画一个圆,然后以圆半 ...
- canvas入门(画圆)
1.想在H5上画一个canvas,必须在页面上你需要的地方添加canvas标签, <canvas id="myCanvas"></canvas> 接着需 ...
- 【openGL】画圆
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...
- javascript画直线和画圆的方法(非HTML5的方法)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【液晶模块系列基础视频】4.1.X-GUI图形界面库-画线画圆等函数简介
[液晶模块系列基础视频]4.1.X-GUI图形界面库-画线画圆等函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地 ...
随机推荐
- Java程序设计当堂测试 9.20
/*Java当堂测试 ATM机模拟系统由于学习的知识有限,不能完成所有课上项目,文件的应用没有完成,汇款转账功能也没有写,一些要求该退出的地方也没有写,基本功能还算完善*/ 1 package acc ...
- Odoo ORM研究2 - BaseModel中的常用方法分析
今天继续研究ORM的BaseModel,昨天研究了一下所有常用属性的具体用法,那么今天研究一下BaseModel中一些常用的方法,我们学会它们并灵活的应用它们,可以为我们开发解决很多的问题. odoo ...
- Pytest单元测试框架之FixTure基本使用
前言: 在单元测试框架中,主要分为:测试固件,测试用例,测试套件,测试执行及测试报告: 测试固件不难理解,也就是我们在执行测试用例前需要做的动作和测试执行后的需要做的事情: 比如在UI自动化测试中,我 ...
- 40.qt quick- 高仿微信实现局域网聊天V4版本(支持gif动图表情包、消息聊天、拖动缩放窗口)
在上章37.qt quick- 高仿微信实现局域网聊天V3版本(添加登录界面.UDP校验登录.皮肤更换.3D旋转),我们已经实现了: 添加登录界面. UDP校验登录. 皮肤更换. 3D旋转(主界面和登 ...
- MySql存储过程的创建与使用及在thinkphp中如何调用笔记
学习sql的存储过程,笔记总结如下: MySQL默认将分号,即";"作为语句的分隔符.如果是这样的话,则一个存储过程将很难正常创建,因为它的BEGIN和END之间可以是任意数量的S ...
- sqlite无法保存数据
springboot使用连接sqlite数据,使用jdbc:sqlite::resource:db/XXX.db方式连接数据库为只读,使用绝对路径才可以写入.
- 第五十三篇 -- MFC美化界面2
IDC_STATIC 1. 设置字体样式 方法1:在OnInitDialog()函数中使用以下语句 CFont * f; f = new CFont; f->CreateFont(50, // ...
- Django中F对象,Q对象与运算符
在Django的模型中F对象与Q对象比较常用的,所以单独说一下: F对象 F对象位于django.dc.models模板下,使用的时候记得首先导入!!! 作用:F对象主要用于当模型的字段A与字段B进行 ...
- ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞
http://192.168.49.2:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_ar ...
- 论文笔记:(CVPR2017)PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
目录 一. 存在的问题 二. 解决的方案 1.点云特征 2.解决方法 三. 网络结构 四. 理论证明 五.实验效果 1.应用 (1)分类: ModelNet40数据集 (2)部件分割:ShapeNet ...