Path的Data生成归总

本文介绍了XAML中Path元素的Data属性的三种生成方法及其命令语法。包括使用ExpressionDesign和ExpressionBlend软件导出,以及手动编写Data属性值的具体方法。详细解释了移动指令、绘制指令和平滑指令等的使用,并提供了具体的格式示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Path的Data数据有三种生成方式:

      1. 最简单的是用Expression Design。可以粘贴来自其它软件的矢量图形。导出时选择,文件->导出->导出属性->格式->XAML Silverlight 画布,即可得到XAML格式的矢量图形,也就是Path。

      2. 如果只是把文字转成图形,相当于印刷行业里的文字转曲,可以直接用Expression Blend。对象->路径->转换为路径,即可。

      3. 自己动手写。当然这也是最难的方式。不过对于简单图形来说非常有用。用Design生成的数据量很大,手写就会变得很简洁。

 

命令的使用方法如下:

==============================

1. 移动指令:Move Command(M):M 起始点,或者:m 起始点 
      比如:M 100,240 或 m 100,240
      使用大写M时,表示绝对值; 使用小写m时; 表示相对于前一点的值,如果前一点没有指定,则使用(0,0)。

 

2. 绘制指令(Draw Command): 
      (1) 直线:Line(L)
      (2) 水平直线: Horizontal line(H)
      (3) 垂直直线: Vertical line(V)
      (4) 三次方程式贝塞尔曲线: Cubic Bezier curve(C)
      (5) 二次方程式贝塞尔曲线: Quadratic Bezier curve(Q)
      (6) 平滑三次方程式贝塞尔曲线: Smooth cubic Bezier curve(S)
      (7) 平滑二次方程式贝塞尔曲线: smooth quadratic Bezier curve(T)
      (8) 椭圆圆弧: elliptical Arc(A)

      上面每种形状后用括号括起的英文字母为命令简写的大写形式,但你也可以使用小写。使用大写与小写的区别是:大写是绝对值,小写是相对值。 重复使用同 一种类型时,就可以省略前面的命令。比如:L 100,200 L 300,400简写为:L 100,200 300,400。

 

绘制指令格式语法:

(1) 直线:Line(L)
      格式:L 结束点坐标 或: l 结束点坐标。
      比如:L 100,100 或 l 100 100。坐标值可以使用x,y(中间用英文逗号隔开)或x y(中间用半角空格隔开)的形式。

(2) 水平直线 Horizontal line(H):绘制从当前点到指定x坐标的直线。
      格式:H x值 或 h x值(x为System.Double类型的值)
      比如:H 100或h 100,也可以是:H 100.00或h 100.00等形式。

(3) 垂直直线 Vertical line(V):绘制从当前点到指定y坐标的直线。
      格式:V y值 或 v y值(y为System.Double类型的值)
      比如:V 100或y 100,也可以是:V 100.00或v 100.00等形式。

(4) 三次方程式贝塞尔曲线 Cubic Bezier curve(C):通过指定两个控制点来绘制由当前点到指定结束点间的三次方程贝塞尔曲线。
      格式:C 第一控制点 第二控制点 结束点 或 c 第一控制点 第二控制点 结束点
      比如:C 100,200 200,400 300,200 或 c 100,200 200,400 300,200
      其中,点(100,200)为第一控制点,点(200,400)为第二控制点,点(300,200)为结束点。

(5) 二次方程式贝塞尔曲线 Quadratic Bezier curve(Q):通过指定的一个控制点来绘制由当前点到指定结束点间的二次方程贝塞尔曲线。
      格式:Q 控制点 结束点 或 q 控制点 结束点
      比如:q 100,200 300,200。其中,点(100,200)为控制点,点(300,200)为结束点。

(6) 平滑三次方程式贝塞尔曲线: Smooth cubic Bezier curve(S):通过一个指定点来“平滑地”控制当前点到指定点的贝塞尔曲线。
      格式:S 控制点 结束点 或 s 控制点 结束点
      比如:S 100,200 200,300

(7) 平滑二次方程式贝塞尔曲线 smooth quadratic Bezier curve(T):与平滑三次方程贝塞尔曲线类似。
      格式:T 控制点 结束点 或 t 控制点 结束点
      比如:T 100,200 200,300

(8) 椭圆圆弧: elliptical Arc(A) : 在当前点与指定结束点间绘制圆弧。
      A 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点 或: a 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点
      尺寸(Size): System.Windows.Size类型,指定椭圆圆弧X,Y方向上的半径值。
      旋转角度(rotationAngle):System.Double类型。
      圆弧旋转角度值(rotationAngle):椭圆弧的旋转角度值。
      优势弧的标记(isLargeArcFlag):是否为优势弧,如果弧的角度大于等于180度,则设为1,否则为0。
      正负角度标记(sweepDirectionFlag):当正角方向绘制时设为1,否则为0。
      结束点(endPoint):System.Windows.Point类型。
      比如:A 5,5 0 0 1 10,10

 

3. 关闭指令(close Command):用以将图形的首、尾点用直线连接,以形成一个封闭的区域。 
      用Z或z表示。

      F0 指定 EvenOdd 填充规则。
      F1 指定 Nonzero 填充规则。
      如果省略此命令,则路径使用默认行为,即 EvenOdd。如果指定此命令,则必须将其置于最前面。
      EvenOdd 确定一个点是否位于填充区域内的规则,具体方法是从该点沿任意方向画一条无限长的射线,然后计算该射线在给定形状中因交叉而形成的路径段数。如果该数为奇数,则点在内部;如果为偶数,则点在外部。
      Nonzero 确定一个点是否位于路径填充区域内的规则,具体方法是从该点沿任意方向画一条无限长的射线,然后检查形状段与该射线的交点。从 0 开始计数,每当线段从左向右穿过该射线时加 1,而每当路径段从右向左穿过该射线时减 1。计算交点的数目后,如果结果为 0,则说明该点位于路径外部。否则,它位于路径内部。

### 51单片机定时器T0实现秒表功能的完整代码 以下是一个完整的基于51单片机的秒表程序,涵盖了定时器T0、数码管显示以及按键S4和S5的控制逻辑。代码按照蓝桥杯开发板的要求进行了设计。 --- #### 完整代码实现 ```c #include <reg52.h> sbit S4 = P3^0; // 暂停/启动按键 sbit S5 = P3^1; // 清零按键 unsigned int t_005s = 0, t_s = 0, t_m = 0; // 延时函数 void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) { for(j = 0; j < 123; j++); } } // 初始化定时器T0 void Timer0_Init() { TMOD |= 0x01; // 设置T0为模式1 (16-bit) TH0 = (65536 - 50000) / 256; // 设定重载值,假设晶振频率为12MHz,则约每隔5ms触发一次中断 TL0 = (65536 - 50000) % 256; EA = 1; // 开启全局中断 ET0 = 1; // 开启T0中断 } // 中断服务函数 void Timer0_ISR() interrupt 1 { static unsigned char count = 0; TH0 = (65536 - 50000) / 256; // 恢复初始值 TL0 = (65536 - 50000) % 256; if(++count >= 200) { // 计算满一秒的情况 count = 0; t_005s++; // 增加半秒钟计数值 if(t_005s >= 2){ // 当累积到两倍即一整秒时增加总秒数 t_005s -= 2; t_s++; if(t_s >= 60){ t_s = 0; t_m++; if(t_m >= 60){ t_m = 0; } } } } } // 扫描按键并处理逻辑 void ScanKeys() { if(S4 == 0) { // 秒表暂停/启动 delay_ms(100); // 去抖动延迟 if(S4 == 0) { TR0 = ~TR0; // 切换运行状态 while(S4 == 0) { // 松手检测 ; } } } if(S5 == 0) { // 秒表清零 delay_ms(100); // 去抖动延迟 if(S5 == 0) { t_005s = 0; t_s = 0; t_m = 0; TR0 = 0; // 确保停止后再清除所有计时信息 while(S5 == 0) { // 松手检测 ; } } } } // 将时间转换为BCD码并通过数码管显示 void DisplayTime() { unsigned char temp[3]; temp[0] = t_m / 10 + '0'; // 分钟十位 temp[1] = t_m % 10 + '0'; // 分钟个位 temp[2] = ':'; // 分隔符 // 发送数据到数码管(此处需要根据具体硬件接口编写) // 示例:SendToDisplay(temp); } // 主函数 void main() { Timer0_Init(); // 初始化定时器T0 while(1) { ScanKeys(); // 扫描按键 DisplayTime(); // 更新数码管显示 } } ``` --- #### 代码解析 1. **定时器初始化 (`Timer0_Init`)** - 配置定时器T0为模式1(16位计数器)。 - 设置初值以实现每5毫秒触发一次中断[^1]。 2. **中断服务函数 (`Timer0_ISR`)** - 在每次中断中恢复定时器初值。 - 使用静态变量 `count` 实现累加计数,达到200次中断后表示过去了一秒[^1]。 3. **按键扫描与处理 (`ScanKeys`)** - 添加了去抖动延迟和松手检测机制,确保按键操作稳定可靠[^1]。 - 按下S4切换秒表的运行状态(启动/暂停)。 - 按下S5将时间清零,并关闭定时器。 4. **数码管显示 (`DisplayTime`)** - 将分钟和秒数转化为字符数组形式。 - 提供给外部接口发送至数码管显示(需根据实际硬件接口完善这部分代码)。 --- #### 注意事项 - **硬件连接**:确保P3.0和P3.1分别接到了S4和S5按键上。 - **数码管驱动**:`DisplayTime()` 函数中的 `SendToDisplay()` 方法需要根据具体的数码管模块进行适配。 - **编译环境**:建议使用Keil uVision工具链进行编译调试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值