当前位置: 首页 > wzjs >正文

做网站百度推广多少钱百度知道在线

做网站百度推广多少钱,百度知道在线,wordpress html5 音乐播放器,个人摄影网站模版引言 在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要。本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,再将其解压还原,并通过matplotlib进行可视化。这一过程可应用于字体设计、矢量图…

引言

在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要。本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,再将其解压还原,并通过matplotlib进行可视化。这一过程可应用于字体设计、矢量图形编辑或Web应用中的路径数据传输。


核心功能概述

1. 路径命令解析

  • 输入:包含moveTolineToqCurveTo(二次贝塞尔曲线)、closePath命令的路径数据。
  • 输出:转换为matplotlib.path.Path对象,用于绘制矢量图形。

2. 路径数据压缩

  • 将路径命令序列转换为紧凑的JSON格式,便于存储或传输。
  • 示例:moveTo((100, 177)){"M":[100,177]}

3. 路径数据解压

  • 将JSON格式还原为原始路径命令序列,确保数据完整性。

4. 可视化

  • 使用matplotlib渲染路径,验证压缩/解压过程的正确性。

代码实现详解

1. 路径命令解析(parse_commands函数)

def parse_commands(data):codes = []vertices = []for cmd, params in data:if cmd == 'moveTo':codes.append(Path.MOVETO)vertices.append(params[0])elif cmd == 'lineTo':codes.append(Path.LINETO)vertices.append(params[0])elif cmd == 'qCurveTo':# 处理二次贝塞尔曲线(每段需要两个控制点和一个终点)for i in range(0, len(params), 2):control = params[i]end = params[i+1] if i+1 < len(params) else params[-1]codes.extend([Path.CURVE3, Path.CURVE3])vertices.extend([control, end])elif cmd == 'closePath':codes.append(Path.CLOSEPOLY)vertices.append(vertices[0])  # 闭合路径回到起点return codes, vertices
关键点:
  • 二次贝塞尔曲线qCurveTo命令需两个控制点和一个终点,通过Path.CURVE3实现。
  • 闭合路径CLOSEPOLY命令自动连接最后一个点到起点。

2. 路径数据压缩(compress_path_to_json函数)

def compress_path_to_json(data):command_map = {'moveTo': 'M', 'lineTo': 'L', 'qCurveTo': 'Q', 'closePath': 'Z'}compressed = []for cmd, params in data:cmd_short = command_map[cmd]points = []if cmd == 'closePath':compressed.append({cmd_short: []})else:# 将坐标元组展平为一维列表(如 [(x,y), (a,b)] → [x,y,a,b])for coord in params:points.extend(list(coord))compressed.append({cmd_short: points})return json.dumps(compressed, separators=(',', ':'))
示例输出:
[{"M":[100,177]},{"L":[107,169]},{"Q":[116,172,127,172]},...]

3. 路径数据解压(decompress_json_to_path函数)

def decompress_json_to_path(compressed_json):command_map = {'M': 'moveTo', 'L': 'lineTo', 'Q': 'qCurveTo', 'Z': 'closePath'}data = json.loads(compressed_json)decompressed = []for item in data:cmd_short = next(iter(item))points = item[cmd_short]cmd = command_map[cmd_short]if not points:decompressed.append((cmd, ()))  # 闭合路径无参数else:# 将一维列表转换为坐标元组(如 [x,y,a,b] → [(x,y), (a,b)])coords = []for i in range(0, len(points), 2):coords.append((points[i], points[i+1]))decompressed.append((cmd, tuple(coords)))return decompressed

4. 可视化渲染(show_ttf函数)

def show_ttf(data):codes, vertices = parse_commands(data)path = Path(vertices, codes)fig, ax = plt.subplots()patch = patches.PathPatch(path, facecolor='orange', lw=2)ax.add_patch(patch)ax.set_xlim(0, 250)  # 根据数据范围调整坐标轴ax.set_ylim(-30, 220)plt.gca().set_aspect('equal')plt.show()

完整代码与运行结果

示例数据

data = [('moveTo', ((100, 177),)),('lineTo', ((107, 169),)),('qCurveTo', ((116, 172), (127, 172))),# ... 其他路径命令(如闭合路径、复杂曲线)
]

执行流程

# 压缩数据
compressed_json = compress_path_to_json(data)
print("压缩后的JSON:", compressed_json)# 解压数据
decompressed = decompress_json_to_path(compressed_json)
print("解压后的路径数据:", decompressed)# 可视化
show_ttf(decompressed)

结果展示

1. 压缩后的JSON片段

[{"M":[100,177]},{"L":[107,169]},{"Q":[116,172,127,172]},{"Z":[]}
]

2. 解压后的路径数据

[('moveTo', ((100, 177),)),('lineTo', ((107, 169),)),('qCurveTo', ((116, 172), (127, 172))),('closePath', ())
]

技术要点总结

  1. 路径命令映射

    • MmoveTo:移动到起点
    • LlineTo:绘制直线
    • QqCurveTo:二次贝塞尔曲线
    • ZclosePath:闭合路径
  2. JSON压缩策略

    • 将坐标元组展平为一维列表,减少冗余。
    • 闭合路径(Z)的参数为空列表。
  3. matplotlib路径渲染

    • 使用Path对象和PathPatch实现复杂曲线的绘制。
    • CURVE3命令需成对使用,适配二次贝塞尔曲线的参数。

应用场景

  • Web开发:将矢量路径数据嵌入SVG或Canvas元素。
  • 字体设计:存储和传输字体轮廓路径。
  • 数据可视化:动态生成并传输图表路径数据。

import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches# 解析输入数据def parse_commands(data):codes = []vertices = []for command, params in data:if command == 'moveTo':codes.append(Path.MOVETO)vertices.append(params[0])elif command == 'lineTo':codes.append(Path.LINETO)vertices.append(params[0])elif command == 'qCurveTo':# Check if there are enough points to form a quadratic Bezier curve segmentfor i in range(0, len(params) - 1, 2):  # Ensure we don't go out of boundscontrol_point = params[i]end_point = params[i + 1]codes.extend([Path.CURVE3, Path.CURVE3])  # Two CURVE3 commands for the quad Beziervertices.extend([control_point, end_point])elif command == 'closePath':codes.append(Path.CLOSEPOLY)vertices.append(vertices[0])  # Closing back to the start pointreturn codes, verticesdef show_ttf():codes, vertices = parse_commands(data)path = Path(vertices, codes)fig, ax = plt.subplots()patch = patches.PathPatch(path, facecolor='orange', lw=2)ax.add_patch(patch)ax.set_xlim(0, 250)  # Adjust these limits based on your data's extentax.set_ylim(-30, 220)  # Adjust these limits based on your data's extentplt.gca().set_aspect('equal', adjustable='box')  # Keep aspect ratio equalplt.show()import jsondef compress_path_to_json(data):command_map = {'moveTo': 'M','lineTo': 'L','qCurveTo': 'Q','closePath': 'Z'}compressed = []for cmd, params in data:command_type = command_map[cmd]points = []if cmd == 'closePath':pass  # closePath无需坐标else:# 确保params[0]是坐标点列表(即使只有一个点)for param in params:points += list(param)compressed.append({command_type: points})return json.dumps(compressed, separators=(',', ':'))data = [('moveTo', ((100, 177),)), ('lineTo', ((107, 169),)), ('qCurveTo', ((116, 172), (127, 172))),('lineTo', ((240, 172),)), ('lineTo', ((224, 190),)), ('lineTo', ((212, 177),)), ('lineTo', ((175, 177),)),('qCurveTo', ((183, 186), (176, 200), (154, 210))), ('lineTo', ((152, 207),)),('qCurveTo', ((164, 190), (166, 177))), ('closePath', ()), ('moveTo', ((204, 143),)), ('lineTo', ((211, 148),)),('lineTo', ((198, 162),)), ('lineTo', ((189, 152),)), ('lineTo', ((143, 152),)), ('lineTo', ((128, 160),)),('qCurveTo', ((129, 149), (129, 116), (128, 102))), ('lineTo', ((142, 106),)), ('lineTo', ((142, 114),)),('lineTo', ((191, 114),)), ('lineTo', ((191, 105),)), ('lineTo', ((205, 111),)),('qCurveTo', ((204, 119), (204, 135), (204, 143))), ('closePath', ()), ('moveTo', ((142, 147),)),('lineTo', ((191, 147),)), ('lineTo', ((191, 119),)), ('lineTo', ((142, 119),)), ('closePath', ()),('moveTo', ((119, 87),)), ('lineTo', ((218, 87),)), ('lineTo', ((218, 6),)),('qCurveTo', ((218, -3), (210, -5), (181, -3))), ('lineTo', ((181, -8),)),('qCurveTo', ((212, -13), (212, -26))), ('qCurveTo', ((221, -22), (231, -12), (231, 2))),('lineTo', ((231, 80),)), ('lineTo', ((240, 87),)), ('lineTo', ((224, 102),)), ('lineTo', ((216, 92),)),('lineTo', ((119, 92),)), ('lineTo', ((105, 100),)), ('qCurveTo', ((106, 84), (106, 5), (105, -26))),('lineTo', ((119, -18),)), ('closePath', ()), ('moveTo', ((196, 58),)), ('lineTo', ((203, 63),)),('lineTo', ((188, 76),)), ('lineTo', ((182, 67),)), ('lineTo', ((151, 67),)), ('lineTo', ((137, 76),)),('qCurveTo', ((138, 59), (138, 30), (137, 5))), ('lineTo', ((150, 11),)), ('lineTo', ((150, 21),)),('lineTo', ((184, 21),)), ('lineTo', ((184, 10),)), ('lineTo', ((197, 16),)),('qCurveTo', ((196, 27), (196, 48), (196, 58))), ('closePath', ()), ('moveTo', ((150, 62),)),('lineTo', ((184, 62),)), ('lineTo', ((184, 26),)), ('lineTo', ((150, 26),)), ('closePath', ()),('moveTo', ((36, 63),)), ('qCurveTo', ((66, 100), (94, 148))), ('lineTo', ((103, 152),)),('lineTo', ((83, 163),)), ('qCurveTo', ((74, 138), (66, 125))), ('lineTo', ((30, 123),)),('qCurveTo', ((50, 154), (71, 193))), ('lineTo', ((82, 197),)), ('lineTo', ((59, 209),)),('qCurveTo', ((51, 178), (23, 124), (14, 124))), ('lineTo', ((25, 106),)),('qCurveTo', ((31, 111), (50, 117), (63, 119))), ('qCurveTo', ((44, 87), (24, 63), (18, 62))),('lineTo', ((28, 44),)), ('qCurveTo', ((39, 51), (68, 60), (98, 66))), ('lineTo', ((97, 70),)),('qCurveTo', ((67, 66), (36, 63))), ('closePath', ()), ('moveTo', ((11, 14),)), ('lineTo', ((21, -4),)),('qCurveTo', ((30, 4), (65, 20), (95, 30))), ('lineTo', ((94, 34),)),('qCurveTo', ((72, 28), (25, 16), (11, 14))), ('closePath', ())]def decompress_json_to_path(compressed_json):command_map = {'M': 'moveTo','L': 'lineTo','Q': 'qCurveTo','Z': 'closePath'}data = json.loads(compressed_json)decompressed = []for item in data:cmd_char = next(iter(item))  # 获取命令字符points = item[cmd_char]original_cmd = command_map[cmd_char]if not points:# closePath,参数为空decompressed.append((original_cmd, ()))else:# 将points列表转换为坐标点元组的元组tuples = []for i in range(0, len(points), 2):x = points[i]y = points[i + 1]tuples.append((x, y))params = tuple(tuples)decompressed.append((original_cmd, params))return decompressedcompressed_json = compress_path_to_json(data)# 解压
decompressed = decompress_json_to_path(compressed_json)
http://www.dtcms.com/wzjs/498169.html

相关文章:

  • c .net网站开发实例优化网站链接的方法
  • 做网站多少钱西宁君博领衔网络营销建议
  • 中国最大的摄影网站seo优化策略
  • wordpress阿里云建站百度seo查询系统
  • 惠州做棋牌网站建设哪家公司收费合理希爱力双效片用后感受
  • 做网站写代码好还是模板创建站点的步骤
  • 做品牌的人常用的网站如何创建一个自己的网站
  • 中国八冶建设集团网站哪里可以代写软文
  • 温州专业微网站制作电话软文广告案例分析
  • 携程官网四川seo选哪家
  • wordpress 没有 sqlseo网站推广主要目的不包括
  • 乐清企业站长工具seo排名查询
  • 星巴克网站开发票吗百度推广seo
  • 聊城建设银行官方网站厦门网站制作
  • 社交账号登录wordpress常州网络推广seo
  • 合肥做网站怎么样如何网络推广自己的产品
  • asp.net做网站的步骤百度业务推广
  • 百度是不是只有在自己的网站发布才会被收录优化关键词的方法
  • 网站 设计 文档沈阳seo优化
  • 滨州建设局网站竞价托管一般多少钱
  • seo技术外包 乐云践新专家萌新seo
  • 玉树营销网站建设公司长沙哪家网络公司做网站好
  • 网站搭建与生成技术教材广告投放收费标准
  • 大学生做家教比较好的网站百度seo优化
  • 做fpga的网站最佳磁力吧ciliba搜索引擎
  • 做网站需要给设计提供长春疫情最新消息
  • 太原做网站什么是seo网站优化
  • wordpress交流群百度视频seo
  • 能够做一镜到底的网站网站设计与制作教程
  • 公司网站建app360投放广告怎么收费