思想とデータフロー
輪郭と筆画は異なる
輪郭フォントのパスは、文字の外周と穴を表します。これは「どこを塗るか」を示すデータであり、「どの順番でペンを動かすか」を示す筆画データではありません。
そのため本ライブラリは、次の二つを明確に区別します。
FontOutlineGlyph、FontFilledGlyph、FontCenterlineGlyph: 輪郭フォントを幾何処理して得るデータFontStrokeGlyph: 筆順とペン上下単位を持つストロークデータ
中心線抽出経路は任意フォントへの適用性を優先し、KanjiVG経路は漢字の筆順と自然な筆画分割を優先します。
中間表現
FontOutlineGlyph
一文字または文字列の輪郭パス群です。各点は指定した文字高さへスケーリングされます。複数文字の場合は、フォントのadvance widthと指定spacingでX方向へ配置されます。
FontFilledGlyph
輪郭を一定間隔の格子へ投影した二値マスクです。複数輪郭はXORで合成されるため、外周と内側の穴を区別できます。
FontCenterlineGlyph
二値マスクをスケルトン化し、8近傍グラフとして追跡した中心線パス群です。分岐点や端点でパスが分割されます。
FontStrokeGlyph
筆順付きパス群です。パス順が書字順であり、一つの FontStrokePath は一回ペンを下ろして描く単位です。
分解された責務
段階 |
クラス |
主な責務 |
|---|---|---|
輪郭抽出 |
|
フォント命令を点列化し、指定高さへ変換 |
塗りつぶし |
|
輪郭を二値格子へ変換 |
中心線抽出 |
|
スケルトン化とパス追跡 |
中心線整理 |
|
短線除去、重複点除去、再サンプリング |
漢字ストローク |
|
KanjiVGの筆画順を保持して点列化 |
英字ストローク |
|
内蔵single-line文字から点列生成 |
表示 |
|
中間表現の目視確認 |
実書字 |
|
絶対P座標変換とCOBOTTA動作 |
ロボット書字の原則
COBOTTA書字では、筆画内と筆画間で動作を分けます。
ペンを上げた状態で筆画始点へ空走する。
始点で書字面までペンを下ろす。
同一Z座標上で筆画内の点を連続投入する。
筆画終点でペンを上げる。
次の筆画始点へ移動する。
ロボット目標は相対移動ではなく、書字開始姿勢を基準にした絶対P座標です。姿勢成分は開始姿勢を維持し、XYZだけを文字座標から変換します。