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

わんくま同盟

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

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

ツリー一括表示

RectangleのようなStructureの作り方 /yukata (19/08/13(Tue) 18:01) #91948
Re[1]: RectangleのようなStructureの作り方 /Hongliang (19/08/13(Tue) 18:08) #91949
  └ Re[2]: RectangleのようなStructureの作り方 /yukata (19/08/13(Tue) 18:21) #91950
    └ Re[3]: RectangleのようなStructureの作り方 /Hongliang (19/08/13(Tue) 18:50) #91952
      └ Re[4]: RectangleのようなStructureの作り方 /Hongliang (19/08/13(Tue) 19:28) #91953
        └ Re[5]: RectangleのようなStructureの作り方 /yukata (19/08/14(Wed) 15:30) #91954
          └ Re[6]: RectangleのようなStructureの作り方 /yukata (19/08/14(Wed) 15:31) #91955 解決済み


親記事 / ▼[ 91949 ]
■91948 / 親階層)  RectangleのようなStructureの作り方
□投稿者/ yukata (1回)-(2019/08/13(Tue) 18:01:11)

分類:[.NET 全般] 

VBを使用しております。

StructureのRectangleは
x,y,height,widthを入力すると
自動的にleftやright,top,bottomにも値が入力されます。

こういうStructureってどうやって作れば良いですか?


RighttriangleというStructureがあり、
BottomとLeftを入力すると
自動的に
Thetaの値に
Theta = Math.Atan(Left / Bottom)
が入力されるようにするにはどうしたら良いですか?




[ □ Tree ] 返信 編集キー/

▲[ 91948 ] / ▼[ 91950 ]
■91949 / 1階層)  Re[1]: RectangleのようなStructureの作り方
□投稿者/ Hongliang (857回)-(2019/08/13(Tue) 18:08:44)
一番単純なのは、読み取り専用のThetaプロパティを作り、Getが呼ばれるたびに計算して値を返す方法でしょう。

Public ReadOnly Property Theta() As Double
Get
Return Math.Atan(Me.Left / Me.Bottom)
End Get
End Property

Thetaが多量に呼び出されることが想定される場合は事前に計算しておく方法もアリですが、基本的には上記で十分ではないかと思います。
[ 親 91948 / □ Tree ] 返信 編集キー/

▲[ 91949 ] / ▼[ 91952 ]
■91950 / 2階層)  Re[2]: RectangleのようなStructureの作り方
□投稿者/ yukata (2回)-(2019/08/13(Tue) 18:21:50)
ありがとうございます。

事前に計算しておく方法も
できればお教えいただけないでしょうか?

あと、
Me.Left とMe.Bottomに両方、値が格納される前に
Thetaを取得しようとするとNothingを返すようにしたいのですが、
どうすれば良いですか?

今回の場合、
Me.Left とMe.Bottomがゼロでないことを確認すれば良いわけですが、
これらの値がゼロになりうるStructureの場合にはどうすれば良いですか?


[ 親 91948 / □ Tree ] 返信 編集キー/

▲[ 91950 ] / ▼[ 91953 ]
■91952 / 3階層)  Re[3]: RectangleのようなStructureの作り方
□投稿者/ Hongliang (858回)-(2019/08/13(Tue) 18:50:42)
> 事前に計算しておく方法も
> できればお教えいただけないでしょうか?

Private _Left, _Bottom, _Theta As Double
' まずはコンストラクタで計算
Public Sub New(ByVal left AS Double, ByVal bottom As Double, ...)
    Me._Left = left
    Me._Bottom = bottom
    ' ほかの処理があるかもしれないけど省略
    Me.CalcTheta()
End Sub
Private Sub CalcTheta()
    Me._Theta = Atan(Me._Left / Me._Bottom)
End Sub
' Leftとかを変更可能なら、そこのSetでも再計算
' ただし、Structureは基本的にプロパティはすべてReadOnlyにすべき
Public Property Left() As Double
    Get
        Return Me._Left
    End Get
    Set
        Me._Left = Value
        Me.CalcTheta()
    End Set
End Property
' Thetaは計算済みの値を返すだけ
Public ReadOnly Property Theta() As Double
    Get
        Return Me._Theta
    End Get
End Property

> Me.Left とMe.Bottomに両方、値が格納される前に
> Thetaを取得しようとするとNothingを返すようにしたいのですが、
> どうすれば良いですか?

VBだと、Nothingが何を意味するのかが曖昧です。
CDbl(Nothing)は0.0を意味し、0.0 = Nothing はTrueを返します。
(0.0 Is Nothingはコンパイルエラーになりますが)
このことから単に0.0を返せばいいのであれば、そのようにすればいいです。

一方、Is Nothing判定をできるようにしたいのであれば、Thetaの型として Doubleを使うことはできません。
代わりに Double? 型(Nullable(Of Double) の省略形)を使用することになるでしょう。
この場合、
Public ReadOnly Property Theta() As Double?
    Get
        ' このIfはステートメントではなく演算子
        Return If(Me.Left = 0 OrElse Me.Bottom = 0, Nothing, Atan(Me.Left / Me.Bottom))
    End Get
End Property

[ 親 91948 / □ Tree ] 返信 編集キー/

▲[ 91952 ] / ▼[ 91954 ]
■91953 / 4階層)  Re[4]: RectangleのようなStructureの作り方
□投稿者/ Hongliang (859回)-(2019/08/13(Tue) 19:28:12)
追記。
Double(あるいはSingle)であれば、NaN、+∞、-∞という特殊な値を持ちます。
これらの値をNothingの代わりに使うという考え方もあります。
NaNかどうかは x = Double.NaN では判定できず、Double.IsNaN(x) を使う必要があります。

Thetaなら0であれば三角形として成立しないので、0であれば異常値、でもいいとおもいますが。
[ 親 91948 / □ Tree ] 返信 編集キー/

▲[ 91953 ] / ▼[ 91955 ]
■91954 / 5階層)  Re[5]: RectangleのようなStructureの作り方
□投稿者/ yukata (3回)-(2019/08/14(Wed) 15:30:51)
No91953 (Hongliang さん) に返信
> 追記。
> Double(あるいはSingle)であれば、NaN、+∞、-∞という特殊な値を持ちます。
> これらの値をNothingの代わりに使うという考え方もあります。
> NaNかどうかは x = Double.NaN では判定できず、Double.IsNaN(x) を使う必要があります。
>
> Thetaなら0であれば三角形として成立しないので、0であれば異常値、でもいいとおもいますが。
[ 親 91948 / □ Tree ] 返信 編集キー/

▲[ 91954 ] / 返信無し
■91955 / 6階層)  Re[6]: RectangleのようなStructureの作り方
□投稿者/ yukata (4回)-(2019/08/14(Wed) 15:31:14)
ありがとうございます。

助かりました。
解決済み
[ 親 91948 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -