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

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

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

二つのPointからRectangleを生成する方法

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

■92008 / inTopicNo.1)  二つのPointからRectangleを生成する方法
  
□投稿者/ ドット (1回)-(2019/08/17(Sat) 11:39:41)

分類:[.NET 全般] 


二つのPointに接する四角形から
Rectangleを生成したいのですが、
いつも以下のようにしています。



Dim cp1 As Point
Dim cp2 As Point


Dim Rect As New Rectangle

Rect.X = Math.Min(cp1.X, cp2.X)
Rect.Y = Math.Min(cp1.Y, cp2.Y)

Rect.Width = Math.Abs(cp1.X - cp2.X)
Rect.Height = Math.Abs(cp1.Y - cp2.Y)

これって結構コードが長くなってしまうのですが、
自動で生成してくれるような
関数ってデフォルトで入っていたりしますか?


引用返信 編集キー/
■92009 / inTopicNo.2)  Re[1]: 二つのPointからRectangleを生成する方法
□投稿者/ 魔界の仮面弁士 (2308回)-(2019/08/17(Sat) 12:39:00)
No92008 (ドット さん) に返信
> 自動で生成してくれるような
> 関数ってデフォルトで入っていたりしますか?

これは、WPF 版(WindowsBase.dll の System.Windows 名前空間)の
Point/Rect 構造体なら、話は簡単なのですけれどね…。
そもそも Size 構造体がマイナスを許容していないので、
 Dim cp1 As New Point(x1, y1)
 Dim cp2 As New Point(x2, y2)
 Dim rect As New Rect(cp1, cp2)
とするだけで、高さと幅が常に正方向の矩形になります。


一方、今回使っている、GDI+ 版(System.Drawing.dll の System.Drawing 名前空間)の
Point/PointF/Rectangle/RectangleF 構造体だと、直接的なものは無かったと思います。

こちらの Size/SizeF 構造体は、マイナスの高さや幅を持ててしまうので、
常にプラスの値にしたいなら、Math.Min/Max なり If なりを併用して、
Rectangle.FromLTRB メソッドなり、Rectangle コンストラクタを呼ぶことになるので、
自分は変換用の支援メソッドを設けて対処しています。
引用返信 編集キー/
■92010 / inTopicNo.3)  Re[2]: 二つのPointからRectangleを生成する方法
□投稿者/ ドット (2回)-(2019/08/17(Sat) 14:39:43)
WPFならできるのですね。

どうもありがとうございます。

ちなみに

> Rectangle.FromLTRB メソッドなり、Rectangle コンストラクタを呼ぶことになるので、
> 自分は変換用の支援メソッドを設けて対処しています。

これはどのようにしていますか?
もし、よろしければコードを拝見させていただけないでしょうか?

引用返信 編集キー/
■92011 / inTopicNo.4)  Re[3]: 二つのPointからRectangleを生成する方法
□投稿者/ 魔界の仮面弁士 (2309回)-(2019/08/17(Sat) 18:22:06)
No92010 (ドット さん) に返信
>>Rectangle.FromLTRB メソッドなり、Rectangle コンストラクタを呼ぶことになるので、
>>自分は変換用の支援メソッドを設けて対処しています。
> これはどのようにしていますか?
> もし、よろしければコードを拝見させていただけないでしょうか?

ドットさんのロジックと大差ないですよ。単にこんな感じ。

<System.Runtime.CompilerServices.Extension>
Public Function CreateRectangle(p As Point, q As Point) As Rectangle
 Return Rectangle.FromLTRB( _
  Math.Min(p.X, p.Y), Math.Min(p.Y, q.Y), _
  Math.Max(p.X, q.X), Math.Max(p.Y, q.Y))
End Function
引用返信 編集キー/
■92012 / inTopicNo.5)  Re[4]: 二つのPointからRectangleを生成する方法
□投稿者/ ドット (3回)-(2019/08/17(Sat) 20:00:01)
ありがとうございます。


<System.Runtime.CompilerServices.Extension>

ってどうやって使えば良いですか?

引数が一つの場合には
https://www.atmarkit.co.jp/fdotnet/bookpreview/kisokaravb_1102/kisokaravb_1102_01.html

ここに書かれてあるように

a.CreateRectangle

というように使えると思います。

引数が二つの場合にはどうすれば良いですか?



Rect = CreateRectangle(cp1, cp2)

というように使うのなら


<System.Runtime.CompilerServices.Extension>

はなくても良いのではないでしょうか?



引用返信 編集キー/
■92013 / inTopicNo.6)  Re[5]: 二つのPointからRectangleを生成する方法
□投稿者/ Azulean (1082回)-(2019/08/17(Sat) 21:02:07)
2019/08/17(Sat) 21:04:30 編集(投稿者)

No92012 (ドット さん) に返信
> ここに書かれてあるように
> a.CreateRectangle
> というように使えると思います。
> 引数が二つの場合にはどうすれば良いですか?

Rect = cp1.CreateRectangle(cp2)

ということでしょう。
拡張メソッドは、メソッド名の左側にある要素(cp1)を第 1 引数と扱うおまじないです。
(cp1.CreateRectangle(cp2) は CreateRectangle(cp1, cp2) と同じ結果)


No92011 (魔界の仮面弁士 さん) に返信
> Return Rectangle.FromLTRB( _
>  Math.Min(p.X, p.Y), Math.Min(p.Y, q.Y), _
>  Math.Max(p.X, q.X), Math.Max(p.Y, q.Y))

最初の Math.Min の中身が間違っていそう。
Math.Min(p.X, p.Y) → Math.Min(p.X, q.X)
引用返信 編集キー/
■92015 / inTopicNo.7)  Re[6]: 二つのPointからRectangleを生成する方法
□投稿者/ ドット (5回)-(2019/08/17(Sat) 21:43:05)
No92013 (Azulean さん) に返信


なるなるほど、そういうことでしたか
どうもありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ