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

わんくま同盟

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

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

■103835 / 27階層)  Visual Basicで簡易CADを作成
□投稿者/ 魔界の仮面弁士 (3893回)-(2025/08/07(Thu) 12:18:14)
No103834 (shiro さん) に返信
> 下記のとおり修正してコンパイルすると次のワーニングが出ましたが実行ファイルは出来ました。
> 新しくクラスに追加したFunction部分です。
> 1>Form1.vb(1510,5): warning BC42353: 関数 'Contains' には値を返さないコード パスがあります。'Return' ステートメントが不足していないかどうかを確認してください。
> 1>Form1.vb(1480,5): warning BC42353: 関数 'Contains' には値を返さないコード パスがあります。'Return' ステートメントが不足していないかどうかを確認してください。

Function の「メソッド定義」しか追加していないですよね。肝心の「中身」の実装はどうしたのでしょうか?
戻り値が As Boolean だというのに、True も False も Return していないではありませんか。


No103832 の回答は、用意した Contains メソッドの中に、座標判定のコードを自身で用意せよ、という意味です。

>>> イメージとしては、こんな感じ。
>>>  (中略)
>>> 上記の wall.Contains というのは、Wall クラスに追加した
>>>  Public Function Contains(p As Point) As Boolean
>>> なメソッドであり、その中身は No103830 でいうところの
>>>  If Math.Abs(e.X - wall.startPoint.X) < 10 AndAlso Math.Abs(e.Y - wall.endPoint.Y) < 10 Then
>>> の部分に相当する座標判定コードが書かれています。
>>> ※Wall クラス内で呼ばれるので、上記の "wall.startPoint.X" の部分は "Me.startPoint.X" になる


contain とは、「含有する」「含む」を意味する動詞であり、
contains は、それの三人称単数現在形(-s)。

VB 中学校でも使われていた、標準実装の「Rectangle 構造体の Contains メソッド」もまた、
引数指定の座標が矩形内の座標であれば True、矩形外なら False を返すメソッドです。
いわゆる hit-test 判定のメソッドにあたります。

今回作成する「壁クラス/柱クラスの Contains メソッド」についても、
引数指定の座標(マウス位置)が、それらのオブジェクトの中であるかどうかを
True/False で返すものとして実装する想定としています。

そのための判定方法は、既にご自身が No103830 で書かれたものがあるので、
まずはそれらを移植してみてください。これは No10832 で述べた通り、
今まで、For Each 内で「wall.startPoint.X」や「pillar.X」と記していたものを、
壁/柱クラスの Contains 内で「Me.startPoint.X」や「Me.X」に変更する作業です。


> '削除する柱や壁をクリックすることで選択できるようにする
MouseDown イベント内における、上記コメントから下にあるコードですが、
For ループと If 判定が行われているものの、その中身は、すべてがコメントアウトされていますよね。

条件判定していても、その後で実質的に何もしていないのですから、
この部分のコードは現状、まったく何の役にも立っていません。すべて削除してしまいましょう。
もちろん、投稿時に省略されたであろう「描画位置を決めるための endPoint や isDragging 関連のコード」は残します。


MouseDown 右クリックによる選択処理というのは、実質的にはそのコメントの上にある
.IsSelect プロパティに True/False を代入するコードのところだけです。

True が代入されれば、そのオブジェクト(壁/柱)が選択され、False なら未選択を意味します。
今は Contains メソッドの実装をサボったせいで、常に False しか代入されていませんけれどね。


あと、「柱の rectangleSize」や「壁の厚さ」は Form1 側で管理させるのではなく、
個々の柱側に持たせておいた方が扱いやすいかもしれません。保持のさせ方は、壁の Stiffness と同様です。


選択のためのヒットテストを行う際にも、描画処理を行う際にも、こうしたサイズ情報が必要になってきますが、
「壁関連の座標計算は Wall クラス自身」「柱関連の座標計算は Pillar クラス自身」にと
それぞれ分担させておくことで、コードの保守性を高めることができるかと思うのです。

もちろん、各オブジェクトに自身の座標を算出させるのではなく、現状のように
「あらやるオブジェクトの座標判定を Form1 自身に担当させる」というコーディングも可能なのですが、
全部を Form1 に任せてしまうとコードが読みにくくなるので、各クラスに役割分担させるということです。


しかし現状、そのあたりの座標データの管理方法に、どうにも統一性がとれていないように見えるのです。
たとえば、提示頂いたコードの柱関連の座標処理を見てみましょう。

[Paint]イベントでは、マジックナンバー「10」の代わりに rectangleSize 表記に改良されているにもかかわらず、
> 'e.Graphics.FillEllipse(Brushes.Yellow, pillar.X - 5, pillar.Y - 5, 10, 10)
> e.Graphics.FillEllipse(Brushes.Yellow, pillar.X - rectangleSize \ 2, pillar.Y - rectangleSize \ 2, rectangleSize, rectangleSize)
柱の hit-test 判定部のコードは、マジックナンバー「10」がそのまま使われており、処理に統一性がありません。
> If Math.Abs(e.X - pillar.X) < 10 AndAlso Math.Abs(e.Y - pillar.Y) < 10 Then


ということで、この rectangleSize 値の管理を柱クラス内に移動させておきます。
そうすると、先ほどの柱クラスの Contains 実装は

 Public Function Contains(p As Point) As Boolean
  If Math.Abs(p.X - Me.X) < Me.rectangleSize AndAlso Math.Abs(p.Y - pillar.Y) < Me.rectangleSize Then
   Return True
  Else
   Return False
  End If
 End Function

のように書けるということになります。

なお、If 判定式というのはそれ自体が True/False を表すものなので、上記をより簡単にして
 Public Function Contains(p As Point) As Boolean
  Return Math.Abs(p.X - Me.X) < Me.rectangleSize AndAlso Math.Abs(p.Y - pillar.Y) < Me.rectangleSize
 End Function
と単純化することもできます。



ただ……ちょっと気になるのは、選択時と非選択時で柱の形状が異なる事。
No103830 以降では、柱の形は「普段は赤い角柱(FillRectangle)」「選択時だけ黄色の円柱(FillEllipse)」なのですよね。

円柱と角柱ではヒットテスト領域が異なってしまいますが、今のヒットテストは正方形前提なので、
操作時に違和感が生じたりしないかな、と。

円柱モードになっているときは、ヒットテストのエリア判定(Contains メソッド)が変化するはずですよね。
まぁ、判定エリアが正方形のままだとしても、大きな問題にはならないかも知れませんが。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[26]: Visual Basicで簡易CADを作成 /shiro →Re[28]: Visual Basicで簡易CADを作成 /shiro
 
上記関連ツリー

Visual Basicで簡易CADを作成 / shiro (25/07/25(Fri) 20:50) #103783
Re[1]: Visual Basicで簡易CADを作成 / KOZ (25/07/27(Sun) 14:35) #103784
  └ Re[2]: Visual Basicで簡易CADを作成 / shiro (25/07/28(Mon) 20:17) #103785
    ├ Re[3]: Visual Basicで簡易CADを作成 / kiku (25/07/29(Tue) 08:49) #103786
    └ Re[3]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/07/29(Tue) 14:06) #103791
      └ Re[4]: Visual Basicで簡易CADを作成 / shiro (25/07/30(Wed) 12:22) #103792
        └ Re[5]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/07/30(Wed) 15:46) #103794
          └ Re[6]: Visual Basicで簡易CADを作成 / shiro (25/07/31(Thu) 07:34) #103795
            └ Re[7]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/07/31(Thu) 10:48) #103796
              └ Re[8]: Visual Basicで簡易CADを作成 / shiro (25/08/01(Fri) 06:15) #103797
                ├ Re[9]: Visual Basicで簡易CADを作成 / kiku (25/08/01(Fri) 08:47) #103798
                │└ Re[10]: Visual Basicで簡易CADを作成 / shiro (25/08/02(Sat) 03:40) #103803
                └ Re[9]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/01(Fri) 10:46) #103800
                  ├ Re[10]: Visual Basicで簡易CADを作成 / kiku (25/08/01(Fri) 10:50) #103801
                  └ Re[10]: Visual Basicで簡易CADを作成 / shiro (25/08/02(Sat) 03:38) #103802
                    └ Re[11]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/03(Sun) 11:50) #103805
                      └ Re[12]: Visual Basicで簡易CADを作成 / shiro (25/08/04(Mon) 05:10) #103806
                        └ Re[13]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/04(Mon) 11:36) #103808
                          └ Re[14]: Visual Basicで簡易CADを作成 / shiro (25/08/04(Mon) 18:59) #103811
                            └ Re[15]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/04(Mon) 19:43) #103812
                              └ Re[16]: Visual Basicで簡易CADを作成 / shiro (25/08/05(Tue) 12:42) #103814
                                └ Re[17]: Visual Basicで簡易CADを作成 / shiro (25/08/05(Tue) 12:44) #103815
                                  └ Re[18]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/05(Tue) 18:02) #103817
                                    └ Re[19]: Visual Basicで簡易CADを作成 / shiro (25/08/05(Tue) 19:28) #103819
                                      └ Re[20]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/05(Tue) 20:39) #103821
                                        └ Re[21]: Visual Basicで簡易CADを作成 / shiro (25/08/06(Wed) 12:22) #103822
                                          └ Re[22]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 14:42) #103825
                                            ├ Re[23]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 17:53) #103828
                                            │└ Re[24]: Visual Basicで簡易CADを作成 / shiro (25/08/06(Wed) 19:13) #103830
                                            │  ├ Re[25]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 19:44) #103832
                                            │  │└ Re[26]: Visual Basicで簡易CADを作成 / shiro (25/08/07(Thu) 07:06) #103834
                                            │  │  └ Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/07(Thu) 12:18) #103835 ←Now
                                            │  │    └ Re[28]: Visual Basicで簡易CADを作成 / shiro (25/08/07(Thu) 19:14) #103836
                                            │  │      └ Re[29]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/07(Thu) 20:25) #103837
                                            │  │        ├ Re[30]: Visual Basicで簡易CADを作成 / shiro (25/08/08(Fri) 03:34) #103838
                                            │  │        └ Re[30]: Visual Basicで簡易CADを作成 / shiro (25/08/08(Fri) 07:29) #103839
                                            │  │          └ Re[31]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/08(Fri) 09:40) #103841
                                            │  │            └ Re[32]: Visual Basicで簡易CADを作成 / shiro (25/08/09(Sat) 05:05) #103842
                                            │  │              └ Re[33]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/09(Sat) 14:24) #103843
                                            │  │                └ Re[34]: Visual Basicで簡易CADを作成 / shiro (25/08/09(Sat) 19:18) #103844
                                            │  └ Re[25]: Visual Basicで簡易CADを作成 / 魔界の仮面弁士 (25/08/06(Wed) 19:53) #103833
                                            └ Re[23]: Visual Basicで簡易CADを作成 / shiro (25/08/18(Mon) 12:41) #103847
                                              └ Re[24]: Visual Basicで簡易CADを作成 / kiku (25/08/20(Wed) 15:09) #103848
                                                └ Re[25]: Visual Basicで簡易CADを作成 / shiro (25/08/20(Wed) 18:35) #103849
                                                  └ Re[26]: Visual Basicで簡易CADを作成 / kiku (25/08/21(Thu) 09:03) #103850
                                                    └ Re[27]: Visual Basicで簡易CADを作成 / shiro (25/08/21(Thu) 22:01) #103851
                                                      └ Re[28]: Visual Basicで簡易CADを作成 / kiku (25/08/22(Fri) 08:45) #103852
                                                        └ Re[29]: Visual Basicで簡易CADを作成 / shiro (25/08/22(Fri) 13:20) #103853
                                                          └ Re[30]: Visual Basicで簡易CADを作成 / kiku (25/08/22(Fri) 16:45) #103854
                                                            └ Re[31]: Visual Basicで簡易CADを作成 / shiro (25/08/22(Fri) 20:33) #103855
                                                              └ Re[32]: Visual Basicで簡易CADを作成 / kiku (25/08/25(Mon) 08:42) #103857

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信