2017-11-13 33 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 

필자 임 지점에서의 출혈가는 마지막 두 시간 동안 내 머리를 긁적되었다! (진지하게, 그것에서 나의 머리를하고있는).

답변

0

내가 추가 한 것은 사용자가 총 볼 수를 지정할 수있는 InputBox입니다. 그래픽을 그리기 위해 OnPaint 이벤트에 코드를 삽입했습니다. 폼 너비/높이를 기반으로 열과 행 너비를 계산했습니다. 나는 칼럼/행에 대한 변수를 사용하여 For 루프에서 어떤 열과 행을 그리는 지 추적 한 다음, 열/행 너비/높이를 사용하여 내 x와 y (더하기 .1 열/행 너비/높이 간격). 마지막으로 .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

나는 먹을 것이 거의 없으므로 아내가 나에게 소리를 지르려고합니다. 그러나 나는 그 것을 양식에 붙여 넣기 만하면됩니다. 나는 당신이 한 일을 읽고 이해하기 위해 코드를 읽는 데 약간의 시간을 할애 할 것입니다. 그것은 오리지날에서 백만 마일 떨어진 곳을 보지 못했지만 일부 그래픽적인 변화와 행 높이를 볼 수 있습니다 - 그걸 읽는 것이 좋을 것입니다 - 대단히 감사합니다 Capellan - 이것을 분류하기위한 슈퍼 스타 :) –