DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33841 / inTopicNo.1)  文字を円弧に沿って表示させたい
  
□投稿者/ K-1 一般人(1回)-(2018/06/05(Tue) 22:20:21)
  • アイコン環境/言語:[VB.NET(VB2015)] 
    分類:[.NET] 

    画像処理のフィルタを自作したく、VB.NETで以下のようなコードを作りました。
    画像サイズは640x640固定。
    
    Dim 角度加算値 As Double = 0
    Dim 角度 As Double = 5
    
    '中心からの距離を得る「AB = √(X1-X2)^2+(Y1-Y2)^2」
    Dim X As Double = (320 - e.X) ^ 2
    Dim Y As Double = (320 - e.Y) ^ 2
    Dim root As Double = Math.Sqrt(X + Y)
    Dim 半径 As Double = root
    
    Dim 線分開始X As Double = 320
    Dim 線分開始Y As Double = 320 - 半径
    
    Dim radian As Double
    Dim Sign As Double
    Dim Cosign As Double
    
    '文字表示
    Dim i As Integer
    Dim 文字 As String
    Dim moji_x As Double
    Dim moji_y As Double
    Dim mojiretu As String = "1234567890"
    For i = 0 To mojiretu.Length - 1
    	角度加算値 = 角度加算値 + 角度
    	radian = 角度加算値 * System.Math.PI / 180.0
    	Sign = System.Math.Sin(radian)
    	Cosign = System.Math.Cos(radian)
    
    	moji_x = ((線分開始X - 320.0) * Cosign - (線分開始Y - 320.0) * Sign + 320.0)
    	moji_y = ((線分開始X - 320.0) * Sign + (線分開始Y - 320.0) * Cosign + 320.0)
    
    	'1文字表示
    	moji = mojiretu.Substring(i, 1)
    	Grp1.GPrint(文字, moji_x, moji_y)
    Next
    
    文字自体は表示されるのですが、画像のように円からズレて表示されてしまいます。
    三角関数等での倍精度小数点の誤差が出てきていると思われますが、
    きちんと円になるような計算方法はないでしょうか。

557×540 => 250×242
イメージ
sample.png
/10KB
引用返信 削除キー/
■33842 / inTopicNo.2)  Re[1]: 文字を円弧に沿って表示させたい
□投稿者/ Azulean 大御所(494回)-(2018/06/06(Wed) 06:17:09)
  • アイコンNo33841に返信(K-1さんの記事)
    > moji_x = ((線分開始X - 320.0) * Cosign - (線分開始Y - 320.0) * Sign + 320.0)
    > moji_y = ((線分開始X - 320.0) * Sign + (線分開始Y - 320.0) * Cosign + 320.0)

    半径 320 の円は、図でいう外側の円でしょうか?

    文字列の描画は基本的に「文字の左上の座標」を指定する考え方になっています。
    このため、描画された結果を見る限り、左上の位置は合っていそうなので、「三角関数等での倍精度小数点の誤差が出てきている」ではなさそうです。

    ではどうすれば良いかですが、2つポイントがあります。

    1.半径を調整して、2 つの円の真ん中を通る円で座標を計算する
    2.得られた座標を「文字の中心」として扱う

    2については、「描画時の文字の矩形」を求めないと中心にすることができません。
    Graphics 相手であれば MeasureString で求まるのですが、Grp1.GPrint が何者かわからない現状では「できる」「できない」は第三者からコメントできないです。。。

    参考
    https://dobon.net/vb/dotnet/graphics/measurestring.html
引用返信 削除キー/
■33844 / inTopicNo.3)  Re[1]: 文字を円弧に沿って表示させたい
□投稿者/ 魔界の仮面弁士 大御所(1110回)-(2018/06/06(Wed) 15:11:57)
  • アイコンNo33841に返信(K-1さんの記事)
    > きちんと円になるような計算方法はないでしょうか。

    手順的なものは、Azulean さんが既に回答されていますね。


    手前味噌ですが、こんな感じのものを書いたことがあるので、
    参考までに紹介しておきます(VB2017)。
    文字自体も円弧にあわせて傾いてしまうので、今回の要件とは異なりますが。
    http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30320

    上記 URL のコードのままだと、サロゲートペア非対応なので、
    String.Substring を StringInfo.SubstringByTextElements に
    置き換えた方が良いかもしれません。


    実行結果はこんな感じ。
    画像が大きすぎて添付できなかったので、URL で掲載します。
    http://www.vb-user.net/junk/replySamples/2018.06.06.14.59/circleSample.png

    上段の画像は、文字の回転処理を省いたもの(g.RotateTransformなし)、
    下段の画像は、文字を回転しているものです(g.RotateTransformあり)。

    上段は、文字の左上を基準に座標を調整しているので、
    K-1 さんのコードと同様のズレ方になっていますね。
引用返信 削除キー/
■33845 / inTopicNo.4)  Re[2]: 文字を円弧に沿って表示させたい
□投稿者/ K-1 一般人(2回)-(2018/06/06(Wed) 19:47:06)
  • アイコン> このため、描画された結果を見る限り、左上の位置は合っていそうなので、「三角関数等での倍精度小数点の誤差が出てきている」ではなさそうです。
    おお!言われてみれば確かに「左上位置から表示」では合っていますね。気がつかなかった・・・

    「文字表示をセンター指定で行う」でやってみます。ありがとうございました。

解決み!
引用返信 削除キー/
■33846 / inTopicNo.5)  Re[2]: 文字を円弧に沿って表示させたい
□投稿者/ K-1 一般人(3回)-(2018/06/06(Wed) 19:48:20)
  • アイコン文字の傾けは本件が解決したら手がけようと思っていたところです。
    参考にさせていただきます。
    ありがとうございました。
引用返信 削除キー/
■33847 / inTopicNo.6)  Re[3]: 文字を円弧に沿って表示させたい
□投稿者/ K-1 一般人(4回)-(2018/06/06(Wed) 19:50:17)
  • アイコンなんとか実現できそうです。ありがとうございます。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -