GetGlyphOutline TTPOLYCURVE
TTPOLYCURVE の TT_PRIM_LINE と TT_PRIM_QSPLINE は昨日までのコードでできそう.
TT_PRIM_CSPLINE についてもコードはわかりそうだが,実際のデータがちょっとわからない.
Q243285 の ::DrawT2Outline では,処理はしていないみたい.
::MakeBezierFromQBSpline では Quadratic から Cubic にしている.
12: 2次ベジェ曲線を3次に変換する方法
2次ベジェ曲線から3次ベジェ曲線への変換
今まで使っていたコードの TT_PRIM_CSPLINE 部分も同様で,特に問題はなかったようにも思う.
曲線の種類と Vd2A(2D の double の配列)を持つ「LQC クラス」を用意するか.
その配列 v_LQC が 1つの TTPOLYGONHEADER となる?
‘1’,’2′,’3′ などは 1つの TTPOLYGONHEADER .’A’ や ‘b’ は 2つ,’B’ や ‘8’ は 3つとなる.
1つの文字を表現するために v_LQC の配列の vv_LQC を用意.
ここまでで ::GetGlyphOutline の出力を vv_LQC として変換できる.
この vv_LQC をポリラインに変換して,v_PLF(複数のポリラインなどを保持可能)に登録する.
これで文字列を vv_PLF(そのままでは輪郭,先日の穴の処理をしてポリゴンに)として保持できる.
2023/03/17
TT_PRIM_CSPLINE に関して
GetGlyphOutline で uFormat に GGO_NATIVE ではなく GGO_BEZIER を指定.
すると,制御点が 2 つのデータが返される.
ポリラインに変換するコードは次の様なもの?
Vd2A LQC_3_to (const LQC& lqc)
{
Vd2A pts ;
if (lqc.size() > 0) {
Vd2 q0(lqc[0]) ;
Vd2 q1(lqc[0]) ;
Vd2 q2(lqc[0]) ;
Vd2 q3(lqc[0]) ;
for (size_t index=0 ; index+3<lqc.size() ; index++) {
if (index == 0) { q0 = lqc[index+0] ; }
q1 = lqc[index+1] ;
q2 = lqc[index+2] ;
q3 = lqc[index+3] ;
Vd2A va = ::bezier(q0,q1,q2,q3) ;
pts.insert(pts.end(),va.begin(),va.end()) ;
q0 = q3 ;
}
}
return pts ;
}