我在做广告冲孔字的自动孔位排布。输入是一份已经转成轮廓的 SVG,希望算法在文字实体区域内排出多行圆孔,孔位随笔画弯曲,窄处能从多排平滑过渡到一排。 简单带状区域已经有一些可用结果,复杂汉字的交汇、尖角和宽窄变化仍不稳定。想请教做过计算几何、CAM、字体几何或类似排布问题的朋友,有没有合适的算法模型、论文或开源实现。 一、原始需求 文字可以理解为单线笔画扩展成有宽度的带状区域,实际输入提供最终的填充轮廓。算法需要处理曲线、宽窄变化、多个独立连通区域,以及字形内部的空白孔洞。 现有样例包含已经合并的笔画交汇。不能默认每个 SVG 子路径对应一笔,也不能默认文件保留了原始中心线或笔顺。 输入与输出 项目 说明 输入图形 SVG 字形的实体填充区域,包含外轮廓和可能存在的内轮廓 输入参数 孔径 D 、孔间距 S 、孔边距 M 、窄笔画处理模式 期望输出 每个圆孔的圆心坐标和直径,可导出为 SVG 或坐标数据 中间结果 如果方案需要中心线、排线或区域分解,可以作为调试结果输出 参数定义 参数 原始含义 D 冲孔直径 S 孔间距,按圆心距计算,允许自适应放大,最大为 2S M 孔中心到轮廓边界的最小距离,外轮廓和内轮廓都参与限制 force 窄笔画强制排一排 skip 窄笔画跳过不排 这里的 M 是孔心距离。如果按孔边缘到轮廓的余量计算,就会变成另一套参数。圆孔本身也应完整落在实体区域内;窄到连一个孔都放不下的位置,需要标出无法满足的原因。 force 下如何报告这类情况,还需要明确。 排孔要求 能容纳多排时优先排多排;只能容纳一排时,按窄笔画模式处理。 第一排顺着笔画轮廓走,满足孔边距 M 。 后续各排满足孔间距要求,走向大致沿局部笔画和轮廓方向。 每排孔尽量均匀,孔盘不越界,也不进入字形内部的空白孔洞。 宽窄过渡采用连续合并的做法,例如两排逐渐向中心靠拢,接成一排。项目里把这个要求称为 A1,不能到某个宽度阈值就突然删掉一排。 “排”可以沿曲线弯曲。横笔、竖笔、撇捺应当有各自的局部方向,全字统一用一个方向扫过去,很难得到想要的效果。 二、宽窄过渡具体想要什么 以一段从宽到窄的笔画为例,宽处能排两排,窄处只能排一排。希望两排在过渡段里逐渐靠拢,窄处的一排回到笔画中间。反向变宽时,再逐渐展开。 沿笔画前进方向 -> 宽处两排 逐渐靠拢 窄处一排 o o o o o o o o o o o o o o o o 这张示意只表达连接关系,不代表具体孔距。靠拢时还要检查两排之间的实际孔距,合并点也只能有一个物理孔,不能把两排的孔直接叠在一起。 三、样例 A,较规则的“广、元”轮廓 SVG 画布尺寸为 3000.5 × 2000 mm 。下图为轮廓预览,灰色为可排孔实体,白色为实体外区域。 这组样例适合先检验直笔画、弯曲笔画和独立组件的排布。值得观察的位置是“元”字下部的弯钩、横竖相接处,以及“广”字顶部点画与横笔的连接处。“元”字上方独立的横笔也应单独处理。 期望直段排得整齐,弯钩处随轮廓转弯,各个独立实体都有结果,不因整字统一方向而在转弯处斜穿笔画。 四、样例 B,复杂书法体“爱” 计算用文件为 ,画布尺寸为 1550 × 1800 mm 。它保留一个字的可见填充轮廓,包含两个独立实体和两个内部孔洞。 这组样例集中包含笔画搭接、局部突然变宽、收窄和急转弯。上半部的交汇处容易出现排线方向不一致,中部斜笔画附近容易错配对边,下半部宽窄变化又需要多排合并。 希望算法在这些位置继续保持能辨认出的排布方向,避免孔位突然断开、挤成一团,或者留出一大片没有解释的空白。 已有人工排孔参考 [not1.svg] 是一份包含人工排孔的生产文件,里面有五个大字及其孔位。其中一个字与上面的输入字形对应,下图是从生产文件提取的人工结果。蓝色表示轮廓,红点表示孔位。 交汇处的局部放大如下。 主要想参考它的排布方向、边排贴合程度和交汇处的整齐感。自动结果可以采用不同的孔数和相位,只要能说明如何满足参数约束和视觉要求。 原始 not1.svg 中有对象位于根 viewBox 之外,直接在浏览器打开可能看不到全部人工孔位。做算法输入可以先用 not1_visible.svg ,看人工效果可以先看这里的 PNG。 五、人工样例与原始参数有一处需要讨论 现有脚本对“爱”字的人工结果做过统计。 指标 统计结果 孔数 810 孔径 约 8.8 mm 每孔到最近另一孔的距离,最小值 约 15.30 mm 最近邻距离,中位数 约 30.57 mm 最近邻距离,第 95 百分位 约 33.96 mm 孔心到轮廓的最小距离 约 13.04 mm ,为边界采样估计 这些最近邻统计没有识别每一排的顺序,不能直接当作同排相邻孔距,也不能据此判断每排的最大空档。 人工样例呈现出的典型孔距在三十毫米左右,局部最近邻距离会更小。因此,若取名义 S=33 mm 并把它作为所有孔对的硬下限,这份人工参考本身也不满足。 原需求只写了圆心距可放大到 2S 。这里暂时保留这个定义,没有把人工样例中观察到的局部压缩写成已确认的要求。想请教实际工艺里是否应当分别设置目标孔距、全局最小孔距和同排最大孔距,以及它们与排间距的关系。 六、目前尝试过的方向 方向 已观察到的困难 中轴或骨架,加横截面生成多排 简单带状区域效果较好,尖角和交汇处容易产生分叉,影响后续排线 多层轮廓内缩,再沿轮廓布孔 能贴合边界,但宽窄处容易断开或形成一圈圈内环,多排合一不自然 分区后匹配两侧边界,再插值生成排线 对边选对时效果较好,复杂交汇的自动分区和对边选择仍不稳定 局部方向场、相位场或流线 能生成弯曲排线,交汇处的断线、合并和局部覆盖仍需处理 目前有手工修正分区、选择对边的调试流程,也有自动方案的实验结果。复杂样例尚未稳定达到上述要求。 七、希望请教的问题 对只有最终填充轮廓的 SVG,有没有适合提取局部带状区域和稳定双侧边界的方法?遇到 T 形、十字形交汇时,怎样决定各排如何连接? 多排到少排的连续过渡,适合用什么几何表示?有没有能同时处理排线连接与离散孔位间距的模型? 在广告冲孔字或类似 CAM 场景中,孔距、排距和交汇处让孔通常怎样定义?上面原始需求与人工参考之间的差异,应当怎样处理? 有没有相关论文、检索关键词、开源库或实际项目可参考?如果纯轮廓信息不足,也希望知道最值得让上游补充哪一类信息。 能针对任意一个样例说明思路,或者指出某条要求在特定几何下无法同时满足,都很有帮助。尤其希望建议能具体到交汇或收窄位置,方便继续做小规模验证。 2 个帖子 - 1 位参与者 阅读完整话题


  • 情报分类:综合情报
  • 分类依据:内容未命中明确的垂直分类规则,归入综合情报
  • 信息来源:服务器 / LINUX DO - 最新话题
  • 发布时间:2026/10/8 21:19:30