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

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

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

Re[6]: GraphicsPathから輪郭線を求めるには


(過去ログ 36 を表示中)

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

■18137 / inTopicNo.1)  GraphicsPathから輪郭線を求めるには
  
□投稿者/ enough326 (1回)-(2008/05/09(Fri) 13:44:40)

分類:[VB.NET/VB2005] 

いつも拝見させて頂き非常に参考にさせていただいております。

現在、GraphicsPathに三角形や四角形、五角形等の様々な図形を追加し描画しております。
このGraphicsPathの輪郭線を取得したいのですが、どのようにすれば取得できるかで悩んでおります。
GraphicsPathをリージョン化し、APIのFrameRgnを使用して描けるような輪郭線を得たいのですが、
GraphicsPathから輪郭線情報(輪郭線1辺の始点終点の座標)を取得するにはどのようにすればよろしいでしょうか?
そもそもGraphicsPathから輪郭線を求める事はできないのでしょうか…。
どうか、どなたかお知恵をお貸しください。

※パスに追加する図形の辺は隣接しているものとしております。
例:2つの四角形
-−--−-
| | |
-−--−-

下記の様なプログラムを実行した際の赤い線を求めたいのです
  Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    Dim grfx As Graphics = e.Graphics
    Dim room1 As PointF() = New PointF() {New PointF(50.0F, 50.0F), _
                       New PointF(100.0F, 50.0F), _
                       New PointF(100.0F, 100.0F)}
    Dim room2 As PointF() = New PointF() {New PointF(100.0F, 50.0F), _
                       New PointF(150.0F, 50.0F), _
                       New PointF(150.0F, 100.0F), _
                       New PointF(100.0F, 100.0F)}

    Dim path As Drawing2D.GraphicsPath = New Drawing2D.GraphicsPath
    path.AddPolygon(room1)
    path.AddPolygon(room2)

    '描画
    Dim p As New Pen(Color.Black, 1)
    grfx.DrawPath(p, path)
    p.Dispose()

    '取得したい輪郭線の描画(取得したい輪郭線座標)
    Dim outerPath As Drawing2D.GraphicsPath = New Drawing2D.GraphicsPath
    outerPath.StartFigure()
    outerPath.AddLine(New PointF(50.0F, 50.0F), New PointF(150.0F, 50.0F))
    outerPath.StartFigure()
    outerPath.AddLine(New PointF(150.0F, 50.0F), New PointF(150.0F, 100.0F))
    outerPath.StartFigure()
    outerPath.AddLine(New PointF(100.0F, 100.0F), New PointF(150.0F, 100.0F))
    outerPath.StartFigure()
    outerPath.AddLine(New PointF(50.0F, 50.0F), New PointF(100.0F, 100.0F))

    Dim p2 As New Pen(Color.Red, 3)
    grfx.DrawPath(p2, outerPath)
    p2.Dispose()

  End Sub

引用返信 編集キー/
■18140 / inTopicNo.2)  Re[1]: GraphicsPathから輪郭線を求めるには
□投稿者/ シャノン (397回)-(2008/05/09(Fri) 14:01:37)
No18137 (enough326 さん) に返信
PathPoints プロパティでしょうか。
http://msdn.microsoft.com/ja-jp/library/system.drawing.drawing2d.graphicspath.pathpoints.aspx

異常に遅いらしいですが。
http://blogs.wankuma.com/iijimas/archive/2007/11/27/110190.aspx
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1056943&SiteID=7
引用返信 編集キー/
■18144 / inTopicNo.3)  Re[2]: GraphicsPathから輪郭線を求めるには
□投稿者/ enough326 (2回)-(2008/05/09(Fri) 14:40:59)
シャノン さんご返信ありがとうございました。

PathPointsにつきましては存じ上げておりました。
しかしこの座標につきましては、追加した全ての図形の座標が含まれております。
たとえば、9つの四角形をルービックキューブの面のように並べてパスに追加した場合、
36個の座標がPathPointsで取得できてしまい、輪郭線の座標という判断が行えないのです。

ルービックキューブの面のように並べてパスに追加した場合は、
4つの輪郭線を取得できればいいのですが…。

引用返信 編集キー/
■18175 / inTopicNo.4)  Re[3]: GraphicsPathから輪郭線を求めるには
□投稿者/ 出水 (49回)-(2008/05/09(Fri) 21:10:26)
FrameRgnはPenではなくBrushを使うことから、おそらく輪郭点を描いているのだと思います

リージョンを白黒ビットマップとみなし、白を透明、黒を描画部分として、
・自分のピクセルの色が黒
・周りの8ピクセルのどこかに白
の点を輪郭点とみなして、そこに矩形を置いているんじゃないでしょうか

ってことで、自力でがんばるしかないです

図形は矩形に限る、とか条件を絞らないとちょっと洒落になんないですね…
引用返信 編集キー/
■18179 / inTopicNo.5)  Re[4]: GraphicsPathから輪郭線を求めるには
□投稿者/ Jitta on the way (84回)-(2008/05/09(Fri) 23:01:09)
複数の図形がある。
全ての図形は、他の図形と1辺を共有している。

と考えて。
1つの図形につき、他の全ての図形と共有している辺を探し、その辺に繋がるところを書き換えればいける?
引用返信 編集キー/
■18185 / inTopicNo.6)  Re[4]: GraphicsPathから輪郭線を求めるには
□投稿者/ enough326 (4回)-(2008/05/10(Sat) 10:35:48)
出水さん、Jitta on the wayさん、ご返信ありがとうございました。

私の知らない、何かもっと良い方法があるのではという甘い考えでございました。
地道に図形の辺が輪郭線(または一部)であるかどうかのチェックを行い、
輪郭線の座標を求め結んでいく方向で行きたいと思います。

「他に良い方法があるのでは…」という悶々さが無くなり気持ちよくコーディング
できそうです。

皆様有難うございました。

解決済み
引用返信 編集キー/
■18190 / inTopicNo.7)  Re[5]: GraphicsPathから輪郭線を求めるには
□投稿者/ Jitta (472回)-(2008/05/10(Sat) 11:43:01)
No18185 (enough326 さん) に返信
> 出水さん、Jitta on the wayさん、ご返信ありがとうございました。
>
> 私の知らない、何かもっと良い方法があるのではという甘い考えでございました。
> 地道に図形の辺が輪郭線(または一部)であるかどうかのチェックを行い、
> 輪郭線の座標を求め結んでいく方向で行きたいと思います。
>
> 「他に良い方法があるのでは…」という悶々さが無くなり気持ちよくコーディング
> できそうです。
>
> 皆様有難うございました。
>

 あらら。。。
 昔、地籍図を処理するシステムで、なんか、やったんだよなぁ。。。
とりあえず、「図形 OR 多角形 重なり」で検索...


面白そう http://ci.nii.ac.jp/naid/110002877222/
これも http://www-sys.ist.osaka-u.ac.jp/~umetani/slide/ssj200709_slide.pdf

「重なり」を別の単語にしたら、ヒット率変わりそう。
解決済み
引用返信 編集キー/
■18230 / inTopicNo.8)  Re[6]: GraphicsPathから輪郭線を求めるには
□投稿者/ enough326 (5回)-(2008/05/11(Sun) 15:03:17)
Jitta さんご返信ありがとうございました。

> とりあえず、「図形 OR 多角形 重なり」で検索...
> 面白そう http://ci.nii.ac.jp/naid/110002877222/
> これも http://www-sys.ist.osaka-u.ac.jp/~umetani/slide/ssj200709_slide.pdf
> 「重なり」を別の単語にしたら、ヒット率変わりそう。

早々と解決済みにしてしまいましたが…。お教え頂いた様に再度検索してみました。
http://homepage2.nifty.com/tsugu/sotuken/ronbun/sec3-2.html#0014
http://homepage2.nifty.com/tsugu/sotuken/binedge/

輪郭線を求めるという行いは、主に画像処理に使われていたんですね。
2値化を行い、白黒の画素で求める…。出水さんのおっしゃっていた、
「リージョンを白黒ビットマップとみなし、白を透明、黒を描画部分として」の意味が今やっと分かった気がします。

ありがとうございました。お教え頂いたこれらの資料は非常に参考になりました。
「輪郭追跡」は求めた輪郭座標をソートする処理で活かせそうです。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -