- PR -

drawlineで線の太さの変更は可能か?

1
投稿者投稿内容
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-12-05 10:26
いつもお世話になっております。
タイトル通りなのですが、drawlineって線の太さが必ず同じですよね。
その線の太さを変える事は可能なのか?
また可能なのなら、その方法は?
と皆様のお知恵をください。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2003-12-05 11:21
もし、java.awt.Graphics2Dが使えるなら Graphics2D#setStroke(Stroke) で線の太さを変えられるはずです。

javax.swing.text.WrappedPlainView#drawLine(int, int, Graphics, int, int) のことじゃないですよね
begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-12-06 00:45
この手の方法って、人それぞれでいろいろな方法がありますよね。掲示板にあげた理由がなんとなく察しつきます。いくつか方法があるなかで、ひとつの方法として(複雑にしてしまうかもしれないですけど)、私なら、drawLineの引数の座標に変数をそれなりに使用して、2つdrawLineのメソッドを読んだりして・・・。3つでも4つでもメソッドの数はいくつでもいいですけど。試してみたことないからわからないですけど・・・。でも、呼び出すタイミングがちょっと問題になるかもしれないです・・・。もし、不明であれば、教えてください。後で簡単なコードを組んで見ます。

でも、もし、液晶のスケーリングに詳しい人が見た場合、PCのグラフィックがSVGAで液晶に送るときにパネルがXGAの場合、パネル側で解像度を拡大するから、解像度が800x600を1024x768に拡大するときに、どんな感じにみえてしまうか、結構疑問です。線が何本もあるなかで、それを1本ずつ拡大することになるので・・・。SXGAに拡大する場合は、どうかな???PCと液晶が1:1で表示する場合は問題ないと思いますが、1:1でない、特に、SVGAをPCが出力する場合には・・・。液晶側できちんとスケーリングしてくれるかな?個人的に疑問です。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-12-07 06:09
こんにちは、さくらばです。

引用:

begoodさんの書き込み (2003-12-06 00:45) より:
この手の方法って、人それぞれでいろいろな方法がありますよね。
掲示板にあげた理由がなんとなく察しつきます。いくつか方法があるなかで、ひとつの方法として(複雑にしてしまうかもしれないですけど)、私なら、drawLineの引数の座標に変数をそれなりに使用して、2つdrawLineのメソッドを読んだりして・・・。3つでも4つでもメソッドの数はいくつでもいいですけど。試してみたことないからわからないですけど・・・。でも、呼び出すタイミングがちょっと問題になるかもしれないです・・・。もし、不明であれば、教えてください。後で簡単なコードを組んで見ます。



Stroke クラスを使えば drawLine を何回もコールして擬似的に太い線にするということはないのですが...

もし、Java2D を使えないとしても Java2D で使われている手法を参考にすることはできます。
Java2D で Stroke クラスを使って太い線を書く場合は、基点と終点に太さを加えた長方形を作成し
それを塗りつぶすという手法がとられています。

たとえば (x1, y1) から (x2, y2) に太さ t で線を描くならば (端点の形状は四角とすると)、
長方形 (x11, y11) (x12, y12) (x21, y21) (x22, y22) の座標は

コード:
   tanθ = (y1 - y2)/(x1 -x2)
   x11 = x1 - t/2 * sinθ  y11 = y1 + t/2 * cosθ
   x12 = x1 + t/2 * sinθ  y11 = y1 - t/2 * cosθ
   x21 = x2 - t/2 * sinθ  y21 = y2 + t/2 * cosθ
   x22 = x2 + t/2 * sinθ  y21 = y2 - t/2 * cosθ



そして、この長方形を fillRect すればできあがりです。
アンチエイリアスをする場合はもっと複雑になりますが....

この手法であればスケーリングの問題は (計算の誤差や丸め誤差はあったとしても)、
ないと思うのですが。
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-12-08 09:11
返答が遅くなりすみませんです。

H2さん、ありがとうございました。
>もし、java.awt.Graphics2Dが使えるなら Graphics2D#setStroke(Stroke) で線の太さを
>変えられるはずです。
"java.awt.Graphics2D"は使えないんです
>javax.swing.text.WrappedPlainView#drawLine(int, int, Graphics, int, int) のこ
>とじゃないですよね
ハイ、"java.awt.Graphics"の"drawLine"です。

begoodさん、ありがとうございました。
>この手の方法って、人それぞれでいろいろな方法がありますよね。
そうだと思います。その中で、「ほとんどの人はこの方法をとるよ」って感じの方法が
もしもあるのなら教えていただきたく質問しました。
>2つdrawLineのメソッドを読んだりして・・・
太くしたい回数"drawLine"を呼べば可能なんですね。確認してみます。

さくらばさん、ありがとうございまいした。
>基点と終点に太さを加えた長方形を作成し
>それを塗りつぶすという手法がとられています。
なるほど!確かにそれでも線を描画できますね。

このような場合、その場のケースでやり方はいくつもあるのかも知れませんが
今回皆様に教えていただいた方法を全て試してみようとおもいます。
ありがとうございました。





1

スキルアップ/キャリアアップ(JOB@IT)