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