A Python library that converts TrueType/OpenType font glyph outlines into triangular meshes.

- ✅ Full Sample Point Triangulation: All line points and quadratic/cubic curve sample points are added to the vertex set
- ✅ No Additional Vertices: Triangulation only uses contour sample points without adding any new vertices
- ✅ Inner/Outer Contour Differentiation: Outer contours displayed in red, inner contours (holes) in blue
- ✅ Complete Vertex Display: All sample points visualized
- Font Parsing: Use
fontToolsto read font files and extract glyph outlines - Contour Sampling: Discretize Bezier curves into sample points
- Direction Detection: Distinguish outer contours (counter-clockwise) from inner contours (clockwise) based on area sign
- Hierarchy Construction: Establish parent-child relationships between outer and inner contours
- Triangulation: Use
shapelyfor polygon triangulation, ensuring triangles are within valid regions
| Contour Type | Direction | Area Sign |
|---|---|---|
| Outer Contour | Counter-clockwise | Negative |
| Inner Contour (Hole) | Clockwise | Positive |
pip install numpy matplotlib fonttools shapelypython font2tri_lib.pyThe program will automatically search for system fonts (KaiTi, Microsoft YaHei, SimSun), then you can input characters for triangulation.
from font2tri_lib import FontTriangulator
# Initialize triangulator
ft = FontTriangulator(r"C:\Windows\Fonts\simkai.ttf")
# Process single character
ft.run('中')
# Batch process characters
for char in ['中', '国', '字', 'A', 'O']:
ft.run(char)python test_all_chars.pyThe core class for font triangulation, providing glyph contour extraction and triangulation functionality.
| Method | Description | Parameters |
|---|---|---|
__init__(font_path) |
Initialize triangulator | font_path: Path to font file |
extract_sampled_contours(char, curve_steps=20) |
Extract character contour sample points | char: Single character; curve_steps: Curve sampling steps |
triangulate_from_contour_points(contours) |
Triangulate contours | contours: List of contour point arrays |
show(char, contours, vs, fs) |
Visualize results | character, contours, vertices, faces |
run(char, curve_steps=20) |
Complete execution flow | character and curve sampling steps |
The program displays three plots:
- Left: Original contours (outer contours red, inner contours blue)
- Middle: Triangulation result (light blue fill, blue edges)
- Right: Vertex set (red dots showing all sample points)
Console output example:
【中】Done
Contours: 1
Vertices: 168 (lines + curve samples)
Triangles: 324
- TrueType (.ttf)
- TrueType Collection (.ttc)
- OpenType (.otf)
- Python 3.6+
- Windows (system font search path is Windows-specific)
font2tri_outline/
├── font2tri_lib.py # Core library file
├── test_all_chars.py # Test script
├── README.md # Documentation (Chinese)
└── readme_en.md # Documentation (English)
MIT License