ホーム ] TIPS ウィンドウズ系 ] TIPS グラフィックス系 ] TIPS メルチメディア系 ] TIPS 理数系 ] TIPS 総覧 ]

上へ
G0001 色名一覧
G0002 アルファブレンド
G0003 カラーマップを作る
G0101 曲線の数値化
G0102 曲線長を測る
G0103 曲線の接線・法線
G0104 曲線のスムージング
G0201 図形の回転
G0202 領域の認識
G0301 文字の線形変換
G0302 文字の自由変形
G0303 文字の極座標変換
G0304 曲線に沿った文字列
G0305 飾文字-中抜き
G0306 飾文字-縁取り
G0307 飾文字-ドロップダウンシャドウ
G0501 画像の線形変換
G0502 画像の透明化
G0503 画像の任意形状切出し
G0504 画像の回転
G0505 画像の高速処理化

VB.NET2005 TIPS / グラフィックス系

G0304 曲線に沿った文字列

最終更新:2006/11/12 再掲

●解説

 曲線は折線、ポリゴン、円、楕円、自由曲線などで、その軌跡に沿った文字列を描くもの。今回は、文字列の沿い方に3種紹介している。極座標変換では文字そのものが変換されていたが、この例では文字 自体はそのままで、位置と傾きが調整される。下図参照。

  •  垂直:文字が外形線に沿って垂直に配置

  •  接線:外形線のその点の接線方向に文字列が縦書きで進行

  •  法線:外形線のその点の法線方向に文字が向いて配置


実例:円に沿った文字列(垂直、接線、法線)

●原理 

 線上の点をどう見つけるか、選ぶかがポイントとなる。ここでは、線の追跡を行い、線の進行方向を辿って一定の線長(距離)の点を見つけそこを文字の基準点としている。後は、その点の接線や方線の角度が分かれば良い。文字列は、塊として描画できなく、一文字づつ独立で描画する。 

●方法 

1.         図形はその外形線をPoint配列にする。開いていても閉じていても良い。

2.         文字列は十分に長いとする(この例では)

3.         紹介しているMeasureCurveLengthにて線長テーブルを作成

4.         距離の刻みを適当に決めながら、紹介しているGetCurveParamにて線を辿ってゆく。

  •  開始点を決める

  •   刻みを描画する文字に合わせる(高さまたは幅、しかし厳密でなくとも良い)

  •  点の座標や角度を得る

  •  文字を座標位置に、必要なら回転も加えて描画

  •  繰り返す。線の全長で終了する。(文字列がなくなったら終了かは随意。)

●実例

Dim g As Graphics
f = New Font(fn, fSZ)
Dim dss As String = "・・・・・・・・・・・・・・・・・・・・・"
Dim pps() As PointF
Dim CL(), CLmax, fH, fW As Single
Dim CB As SizeF
Dim i, cvC, CC As Integer
Dim R, L, X, Y, Xa, Ya, A, dL, dA As Single
Dim s As String
fmt.Alignment = StringAlignment.Center
fmt.LineAlignment = StringAlignment.Far
fh = f.GetHeight(g)
CB = g.MeasureString("あ", f, New SizeF(1000, 1000), fmt)     '一文字の幅を計測
fW = CB.Width - 0.4 * fh                                                  '前後の余裕幅を除く

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・       'ここで図形をpps()に数値化する

cvC = pps.Length
MeasureCurveLength(pps, CL)                '距離テーブルCL()を作成
CLmax = CL(cvC - 1)                               '外形線の全長
Select Case SDir                                     '文字列の沿い方
    Case 0                          '垂直
        L = fW / 2 : i = 0
        While L <= CLmax       '外形線がなくなるまで繰り返す
            s = Mid(dss, i + 1, 1)
            GetCurveParam(pps, CL, L + fW / 2, X, Y, A, Xa, Ya)
            g.DrawString(s, f, Brushes.Red, X, Y, fmt)
            L = L + fW
            i = i + 1
        End While
    Case 1, 2                       '接線、法線
        Select Case SDir
            Case 1
                dL = fH              '距離刻みを文字高さとする
                dA = 0.0F            '文字回転調整値
            Case 2
                dL = fW             '距離刻みを文字幅とする
                dA = 90.0F
        End Select
        Dim cmx As Matrix = g.Transform
        Dim pmx As New Matrix()
        L = 0.0F : i = 0
        While L < (CLmax - dL)
            s = Mid(dss, i + 1, 1)
            GetCurveParam(pps, CL, L + dL, X, Y, A, Xa, Ya)
            g.ResetTransform()
            pmx.Reset()
            pmx.RotateAt(A + dA, New PointF(X, Y), Drawing2D.MatrixOrder.Append)     '文字を回転
            g.Transform = pmx
            g.DrawString(s, f, Brushes.Red, X, Y, fmt)
            L = L + dL
            i = i + 1
        End While
        pmx.Dispose()
Ens Select