C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: DrawLinesで、線がガタガタに見えてしまう


(過去ログ 89 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■52883 / inTopicNo.1)  DrawLinesで、線がガタガタに見えてしまう
  
□投稿者/ かおりQ (1回)-(2010/08/26(Thu) 15:27:21)

分類:[C#] 

VS2008・C#でWindowsアプリケーションを開発しています。

3点を結んで、直線(破線)をGraphicsのDrawLinesで描画する際、
線がガタガタに見えてしまうのに困っています…。
以下のようなメソッドで描画しています。

private void DrawBorder(Graphics g)
{
//g.SmoothingMode = SmoothingMode.AntiAlias;
//g.PixelOffsetMode = PixelOffsetMode.HighQuality;

Pen pen = new Pen(Color.Black);
pen.DashCap = DashCap.Round;
pen.DashPattern = new float[] { 3.0f, 3.0f, 3.0f, 3.0f };

// 直線・論理座標配列
PointF[] pfa = new PointF[3];
pfa[0] = new PointF(54400, 153740);
pfa[1] = new PointF(49520, 153090);
pfa[2] = new PointF(41860, 153020);

try
{
PointF[] vpfa = new PointF[3];
// 論理座標→物理座標※ここは省略

g.DrawLines(pen, vpfa);
}
catch (System.Exception ex)
{
Debug.WriteLine(ex.Message + "\n" + ex.StackTrace);
}
finally
{
pen.Dispose();
}
}
直線がガタガタになるのと、破線の点々の長さがバラバラになり、
見た目が良くありません。
アンチエイリアスを指定するとスムーズになりますが、
どうしても線がぼやけてしまいます。

APIで描画も考えたのですが、分かりやすいサンプルコードが見つからず、
手をつけられないでいます;;

何か解決策ご存知の方いらっしゃいましたら、よろしくお願い致します!
引用返信 編集キー/
■52889 / inTopicNo.2)  Re[1]: DrawLinesで、線がガタガタに見えてしまう
□投稿者/ よねKEN (588回)-(2010/08/26(Thu) 21:04:59)
提示コードを元に動作検証をしようとしたのですが、

> // 論理座標→物理座標※ここは省略

ここを省略されているので、

> 直線がガタガタになるのと、破線の点々の長さがバラバラになり、
> 見た目が良くありません。

がどういう状況なのかをよくわかりませんでした。

引用返信 編集キー/
■52890 / inTopicNo.3)  Re[2]: DrawLinesで、線がガタガタに見えてしまう
□投稿者/ よねKEN (589回)-(2010/08/26(Thu) 21:34:03)
No52889 (よねKEN さん) に返信
> 提示コードを元に動作検証をしようとしたのですが、
>
>> // 論理座標→物理座標※ここは省略
>
> ここを省略されているので、

for (int i = 0; i < 3; i++)
{
vpfa[i] = new PointF(pfa[i].X / 50.0f - 800, pfa[i].Y / 50.0f - 3000);
}

というコードを適当にでっちあげて、フォームに描画して確認してみました。
描画先はディスプレイでよいのですよね?(そこが違うならまた話も違うかもしれません)

このぐらいのサイズで画面に描画されていると仮定して、線幅が1ピクセルなのでたぶん物理的にどうしようもないと思います。
画面はピクセルの集合ですが、1ピクセルより小さい点を表現できません。1ピクセルより小さい点を表現するために
アンチエイリアスがありますが、これが小さい点を薄い色で表現することで実現しているもので、
線幅は全体的に均一に見えるようになる代わりに、今までなかった薄い色を画面に表示するのでぼやけた感じになります。

線幅が太い場合は比率的にその薄い色の部分が少ないため、そこまで違和感がないのですが、
線幅が短い、ダッシュ1つの線の長さが短い場合はこの違和感が目立ちます。アンチエイリアスがない場合が逆にガタガタが目立ちます。





引用返信 編集キー/
■52908 / inTopicNo.4)  Re[3]: DrawLinesで、線がガタガタに見えてしまう
□投稿者/ かおりQ (3回)-(2010/08/27(Fri) 15:25:25)
No52890 (よねKEN さん) に返信
ご回答ありがとうございます!

> 描画先はディスプレイでよいのですよね?(そこが違うならまた話も違うかもしれません)
はい、ディスプレイです。
平面直角座標系を使っていて、座標変換も提示するとコードが煩雑になってしまうと思ったので省略してしまいました。
ごめんなさい。

> このぐらいのサイズで画面に描画されていると仮定して、線幅が1ピクセルなのでたぶん物理的にどうしようもないと思います。
線幅もダッシュ幅も今のままで描画したいので、
やはりアンチエイリアスを利用するしかないんですね。

APIで描画しても同じことなんでしょうかね…?
引用返信 編集キー/
■52909 / inTopicNo.5)  Re[4]: DrawLinesで、線がガタガタに見えてしまう
□投稿者/ よねKEN (590回)-(2010/08/27(Fri) 15:45:37)
よねKEN さんの Web サイト
2010/08/27(Fri) 15:47:20 編集(投稿者)

> APIで描画しても同じことなんでしょうかね…?

断言はできませんが、たぶん無理だと思います。
(どんな補完方法を使おうとも画面の解像度以上の微細な表現ができない以上、限界があるため)

例えば、3x3のピクセルで線を引くと以下のようになります。
15度や30度の表現も無理やりですが、5度、10度傾けた線なら、どのように表現しましょうか?
(さらに1度だけ傾けた線なら・・・)

■■■ 水平な線
□□□
□□□

■■□ 時計回りに15度傾けた線
□□■
□□□

■□□ 時計回りに30度傾けた線
□■■
□□□

■□□ 時計回りに45度傾けた線
□■□
□□■

■□□ 時計回りに60度傾けた線
□■□
□■□

■□□ 時計回りに75度傾けた線
■□□
□■□

■□□ 時計回りに90度傾けた線
■□□
■□□
引用返信 編集キー/
■52910 / inTopicNo.6)  Re[5]: DrawLinesで、線がガタガタに見えてしまう
□投稿者/ かおりQ (4回)-(2010/08/27(Fri) 16:02:52)
No52909 (よねKEN さん) に返信
> 例えば、3x3のピクセルで線を引くと以下のようになります。
> 15度や30度の表現も無理やりですが、5度、10度傾けた線なら、どのように表現しましょうか?
> (さらに1度だけ傾けた線なら・・・)

なるほど、分かりやすいご回答ありがとうございます。
がたつきは解像度依存で仕方が無いので、
多少ぼやけても、アンチエイリアスを使うことにします。

ありがとうございました!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -