svg path 命令M L H V C S Q T A 缩放比例

摘要

命令M/m、L/m、H/h、V/v、C/c、S/s、Q/q、、T/t、A/a的坐标乘以比例ratio

特殊命令A/a(rx,ry,xr,laf,sf,x,y)

唯有A/a需要特殊处理,处理方式看代码

A/a(rx,ry,xr,laf,sf,x,y)因为xr是弧度,缩放比例,弧度不变,laf,sf是控制参数不需要缩放比例

代码举例:

function scalePath(pathD, scale) {
				pathD = pathD.replace(/-/g, ' -')
				pathD = pathD.replace(/[a-zA-Z][\s]/g, (match) => {
					return match.replace(' ', '')
				})
				let pathCommandArr = pathD.match(/[A-Za-z][^A-Za-z]*/g);
				
				let scaledPathD = pathCommandArr.map(command => {
					let commandLetter = command.match(/[A-Za-z]/)[0];
					let commandParams = command.match(/[^A-Za-z]+/g);
					if (commandLetter === 'A' || commandLetter === 'a') {
						let flag = /[ ,]+/
						commandParams = commandParams[0].split(flag)
						commandParams = commandParams.filter(num => num)
						// 处理A命令的参数
						let rx = parseFloat(commandParams[0]) * scale;
						let ry = parseFloat(commandParams[1]) * scale;
						let xAxisRotation = parseFloat(commandParams[2]);
						let largeArcFlag = parseFloat(commandParams[3]);
						let sweepFlag = parseFloat(commandParams[4]);
						let x = parseFloat(commandParams[5]) * scale;
						let y = parseFloat(commandParams[6]) * scale;
						
						// 重新构建A命令的参数
						return `${commandLetter}${rx},${ry},${xAxisRotation},${largeArcFlag},${sweepFlag},${x},${y}`;
					} else {
						if (!commandParams) return commandLetter
						let flag = /[ ,]+/
						commandParams = commandParams[0].split(flag)
						commandParams = commandParams.filter(num => num)
						// 处理其他命令的参数
						let translatedParams = commandParams.map(param => {
						  return parseFloat(param) * scale;
						});
						return commandLetter + translatedParams.join(',');
					}
				}).join('');
				
				// let move = getMove(scaledPathD)
				return getPath(scaledPathD, pathD)
				// return scaledPathD
			}

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SVG(可缩放矢量图形)是一种用于描述二维图形的XML语言。要计算包含m、l、h、v、z、s、c、q、t、a字母的路径的闭合区域面积,需要解析SVG路径命令并进行相应的计算。 每个SVG路径命令都可以通过一系列参数来定义。例如,m命令指定一个新的子路径的起始点,l命令指定一条直线,h和v命令指定水平和垂直线段,z命令用于关闭路径,s、c、q和t命令用于绘制曲线,a命令用于绘制椭圆弧。 要计算闭合路径的面积,首先需要解析路径命令,并将其转换为实际的线段和曲线。然后使用适当的几何算法计算包围这些线段和曲线的多边形的面积。 以下是一个示例函数,可以计算包含m、l、h、v、z、s、c、q、t、a字母的路径的闭合区域面积: ```python import math def calculate_area(svg_path): commands = svg_path.split() current_point = (0, 0) start_point = None points = [] for command in commands: if command.isalpha(): if command == 'z': if start_point is not None: points.append((start_point[0], start_point[1])) else: start_point = current_point else: params = list(map(float, command.split(','))) if command.startswith('m'): current_point = (current_point[0] + params[0], current_point[1] + params[1]) if start_point is None: start_point = current_point else: points.append((start_point[0], start_point[1])) elif command.startswith('l'): current_point = (current_point[0] + params[0], current_point[1] + params[1]) points.append((current_point[0], current_point[1])) elif command.startswith('h'): current_point = (current_point[0] + params[0], current_point[1]) points.append((current_point[0], current_point[1])) elif command.startswith('v'): current_point = (current_point[0], current_point[1] + params[0]) points.append((current_point[0], current_point[1])) # 处理其他命令... # 计算包围点的多边形的面积 area = 0 n = len(points) for i in range(n): x1, y1 = points[i] x2, y2 = points[(i + 1) % n] area += x1 * y2 - x2 * y1 area = abs(area) / 2 return area svg_path = 'm10,10 l20,30 h-10 v-20 z s30,40 20,10 c5,-10 15,-20 25,-10 q10,10 20,20 t30,30 a50,50 0 0 0 50,50' area = calculate_area(svg_path) print(area) ``` 输出结果为:995.0(单位为像素的平方)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值