指定节点固定相对位置绘制约束图,求适用绘图软件推荐
需求:带位置约束的图形绘制工具
我想用绘图引擎(目前觉得neato效果最好)绘制图形,但需要让引擎遵守节点间的部分相对位置约束。比如图形里有长度为5的环,我想指定这个环按特定尺寸绘制成五角星,引擎要输出满足该约束的图形。有没有能实现这个需求的软件?
编辑补充示例
输入的Graphviz代码
"(1, 2, 3, 4)" [shape=circle]; "(1, 2, 4, 3)" [shape=circle]; "(1, 3, 2, 4)" [shape=circle]; "(1, 3, 4, 2)" [shape=circle]; "(1, 4, 2, 3)" [shape=circle]; "(1, 4, 3, 2)" [shape=circle]; "(2, 1, 3, 4)" [shape=circle]; "(2, 1, 4, 3)" [shape=circle]; "(2, 3, 1, 4)" [shape=circle]; "(2, 3, 4, 1)" [shape=circle]; "(2, 4, 1, 3)" [shape=circle]; "(2, 4, 3, 1)" [shape=circle]; "(3, 1, 2, 4)" [shape=circle]; "(3, 1, 4, 2)" [shape=circle]; "(3, 2, 1, 4)" [shape=circle]; "(3, 2, 4, 1)" [shape=circle]; "(3, 4, 1, 2)" [shape=circle]; "(3, 4, 2, 1)" [shape=circle]; "(4, 1, 2, 3)" [shape=circle]; "(4, 1, 3, 2)" [shape=circle]; "(4, 2, 1, 3)" [shape=circle]; "(4, 2, 3, 1)" [shape=circle]; "(4, 3, 1, 2)" [shape=circle]; "(4, 3, 2, 1)" [shape=circle]; "(1, 2, 3, 4)" -- "(2, 1, 3, 4)" [color=red]; "(1, 2, 3, 4)" -- "(2, 3, 4, 1)" [color=blue]; "(1, 2, 3, 4)" -- "(4, 1, 2, 3)" [color=blue]; "(1, 2, 4, 3)" -- "(2, 1, 4, 3)" [color=red]; "(1, 2, 4, 3)" -- "(2, 4, 3, 1)" [color=blue]; "(1, 2, 4, 3)" -- "(3, 1, 2, 4)" [color=blue]; "(1, 3, 2, 4)" -- "(3, 1, 2, 4)" [color=red]; "(1, 3, 2, 4)" -- "(3, 2, 4, 1)" [color=blue]; "(1, 3, 2, 4)" -- "(4, 1, 3, 2)" [color=blue]; "(1, 3, 4, 2)" -- "(3, 1, 4, 2)" [color=red]; "(1, 3, 4, 2)" -- "(2, 1, 3, 4)" [color=blue]; "(1, 3, 4, 2)" -- "(3, 4, 2, 1)" [color=blue]; "(1, 4, 2, 3)" -- "(4, 1, 2, 3)" [color=red]; "(1, 4, 2, 3)" -- "(3, 1, 4, 2)" [color=blue]; "(1, 4, 2, 3)" -- "(4, 2, 3, 1)" [color=blue]; "(1, 4, 3, 2)" -- "(4, 1, 3, 2)" [color=red]; "(1, 4, 3, 2)" -- "(2, 1, 4, 3)" [color=blue]; "(1, 4, 3, 2)" -- "(4, 3, 2, 1)" [color=blue]; "(2, 1, 3, 4)" -- "(4, 2, 1, 3)" [color=blue]; "(2, 1, 4, 3)" -- "(3, 2, 1, 4)" [color=blue]; "(2, 3, 1, 4)" -- "(3, 2, 1, 4)" [color=red]; "(2, 3, 1, 4)" -- "(3, 1, 4, 2)" [color=blue]; "(2, 3, 1, 4)" -- "(4, 2, 3, 1)" [color=blue]; "(2, 3, 4, 1)" -- "(3, 2, 4, 1)" [color=red]; "(2, 3, 4, 1)" -- "(3, 4, 1, 2)" [color=blue]; "(2, 4, 1, 3)" -- "(4, 2, 1, 3)" [color=red]; "(2, 4, 1, 3)" -- "(3, 2, 4, 1)" [color=blue]; "(2, 4, 1, 3)" -- "(4, 1, 3, 2)" [color=blue]; "(2, 4, 3, 1)" -- "(4, 2, 3, 1)" [color=red]; "(2, 4, 3, 1)" -- "(4, 3, 1, 2)" [color=blue]; "(3, 1, 2, 4)" -- "(4, 3, 1, 2)" [color=blue]; "(3, 2, 1, 4)" -- "(4, 3, 2, 1)" [color=blue]; "(3, 4, 1, 2)" -- "(4, 3, 1, 2)" [color=red]; "(3, 4, 1, 2)" -- "(4, 1, 2, 3)" [color=blue]; "(3, 4, 2, 1)" -- "(4, 3, 2, 1)" [color=red]; "(3, 4, 2, 1)" -- "(4, 2, 1, 3)" [color=blue]; }
约束要求
下图中的正方形在绘制的图形中也需保持为正方形

解决方案
1. 基于Graphviz(含neato)的实现
你可以直接在Graphviz代码中手动指定节点坐标,强制约束相对位置,neato会尊重这些固定坐标,仅自动调整未指定的部分:
- 给需要约束的节点添加
pos="x,y!"属性,感叹号表示强制固定位置,比如正方形的四个节点可设为pos="0,0!"、pos="0,1!"、pos="1,1!"、pos="1,0!" - 对于五角星这类规则图形,可提前计算好每个节点的极坐标,转换成笛卡尔坐标后赋值给
pos属性 - 示例修改:给代码中对应正方形的四个节点加上固定坐标,neato渲染时就会保持正方形结构
2. 可视化交互工具
- yEd Graph Editor:支持导入Graphviz代码,手动拖动节点调整到符合约束的位置(比如拖出正方形、五角星),再自动优化其他节点的布局,完全满足部分位置约束需求
- OmniGraffle(仅Mac):支持图形精确对齐和约束设置,能手动固定特定节点组的相对位置,再补充绘制其他关联元素
- Draw.io(Diagrams.net):可导入Graphviz文件,通过对齐工具快速设置节点的规则排列(比如正方形、五角星),固定后再自动布局剩余节点
3. 专业约束绘图工具
- Graphviz的fdp引擎:相比neato,fdp对节点位置约束的支持更灵活,配合
constraint=true属性可强化部分节点的布局规则 - TikZ(LaTeX):若熟悉LaTeX,可用TikZ的图形绘制功能,通过精确坐标和约束命令,完全自定义任意节点的相对位置,生成符合要求的专业图形
内容的提问来源于stack exchange,提问作者squirrels
相关产品推荐
相关产品推荐

