2017-11-13 21 views
0

午後、私はVB.NETで数式の型のクエリを持っています 私は画面を持っています、それはサイズを変更することができ、私はユーザーから取得する唯一の入力は、画面内に入る「ボール」を表示します。 私は、幅と高さを平方根にする必要があることを知っています。私の「量」を均等な行と列のために得るには - しかし、ちょっと計算に詰まっています: ボールのサイズ。 ボール間の距離(必要な場合、ボールは小さくする必要があります) 以下の例では、ボールの開始位置がフォームの左上隅にくるようにします。VB.NET図形の錯綜する形の塗りつぶし形

VSのコピーを開き、新しいwinformsプロジェクトを追加し、フォームのPaintイベントにコードを貼り付けて実行します。

私が必要とするのは、同じサイズと可能な限りフォームを埋めるためにX軸とY軸に同じようにフォームを埋めるために(ユーザーからのフィードを生成する)不確定な量のボールですボールの大きさの4分の1の距離になります。

自由に画面のサイズを変更するか、ボールの量を自動生成するために_BallsInTotal変数を変更してください。

Dim _BallsInTotal As Integer 

    _BallsInTotal = 100 


    Dim TotalColumns As Integer 
    Dim TotalRows As Integer 

    TotalColumns = Math.Sqrt(_BallsInTotal) 
    TotalRows = Math.Sqrt(_BallsInTotal) 

    Dim BallWidth As Single = 20 
    Dim BallHeight As Single = 20 

    Dim BallPositionX As Long = BallWidth * 2 
    Dim BallPositionY As Long = BallHeight * 2 

    Dim solidBrush As New SolidBrush(Color.FromArgb(255, 255, 0, 0)) 

    Dim rows As Single 
    Dim columns As Single 

    For columns = 1 To TotalColumns 
     For rows = 1 To TotalRows 
      e.Graphics.FillEllipse(solidBrush, BallPositionX * columns, BallPositionY * rows, BallWidth , BallHeight) 
     Next 
    Next 

私は最後の2時間私の頭を傷つけていましたどこで出血するかのポイントで私はどこにいるのですか? (真剣に、私の頭の中で)。

答えて

0

私が追加したのは、ユーザーがボールの総数を指定できるInputBoxです。グラフィックを描画するためのコードをOnPaintイベントに配置しました。私はフォームの幅/高さに基づいて列と行の幅を計算しました。私は、どの列と行を描画するのかを追跡するためにForループ内の列/行の変数を使用しています。そして、列と行の幅と高さを使用してxとyを見つけ出します/行幅/間隔の高さ)。最後に列/行幅/高さの.8を使用して、ボールが行/列でどれくらいのスペースを占めるかを指定します。

Public Class Form1 
Dim _total As Int32 = 120 

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 
    Dim columns As Int32 = Math.Ceiling(Math.Sqrt(_total)) 
    Dim rows As Int32 = Math.Ceiling(Math.Sqrt(_total)) 

    Dim width As Int32 = Me.ClientSize.Width 
    Dim height As Int32 = Me.ClientSize.Height 

    Dim columnWidth As Int32 = width/columns 
    Dim rowHeight As Int32 = height/rows 

    Dim brush As Brush = New SolidBrush(Color.FromArgb(255, 255, 0, 0)) 

    Me.SuspendLayout() 

    Dim painted As Int32 = 0 

    For r As Int32 = 0 To rows - 1 
     For c As Int32 = 0 To columns - 1 
      Dim x As Int32 = (c * columnWidth) + (columnWidth * 0.1) 
      Dim y As Int32 = (r * rowHeight) + (rowHeight * 0.1) 
      e.Graphics.FillEllipse(brush, New Rectangle(x, y, columnWidth * 0.8, rowHeight * 0.8)) 
      painted += 1 
      If painted = _total Then 
       Me.ResumeLayout() 
       Exit Sub 
      End If 
     Next 
    Next 

End Sub 

Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged 
    Me.Invalidate() 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim input As String = InputBox("Enter a total.") 
    Dim number As Int32 = 0 
    If Int32.TryParse(input, number) Then 
     _total = number 
     Me.Invalidate() 
    End If 
End Sub 
End Class 
+0

私はちょうど妻が私に腹を立てるように食べ物を用意しようとしていますが、私はそれをフォームに貼り付けて治療します。私はあなたが何をして理解したのかを理解するためにコードを読んでいく時間を費やすつもりです。それは私のオリジナルから百万マイル離れて見えませんが、私はいくつかのグラフィカルな変更と行の高さを見ることができます - それを読むのは良いだろう - これを並べ替えるための非常にカペラン - スーパースターありがとう:) –

関連する問題