Что нового

[Элементы GUI][Условия] Рандомное расположение элементов без пересечения

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Здравствуйте, помогите пожалуйста написать примерчик - как расположить рандомно элементы так что бы они не имели между собой пересечений.
У меня уже есть небольшие наработки но он естественно не работает :stars::
Код:
$hWnd = guicreate("", 680, 460)
dim $pos[10][2]
$pos[0][0] = random(64, 616, 1)
$pos[0][1] = random(64, 396, 1)
for $i = 1 to 9
	local $tX, $tY
	do
		$tX=random(64, 616, 1)
		$tY=random(64, 396, 1)
		for $ii=0 to ubound($pos, 1)
			if ($tX>=($pos[$ii][0]-64) or $tX<=($pos[$ii][0]+64)) or ($tY>=($pos[$ii][1]-64) or $tY<=($pos[$ii][1]+64)) then
				ExitLoop 1
			endif
		next
	until $i = 9
	$pos[$i][0] = $tX
	$pos[$i][1] = $tY
	ConsoleWrite($pos[$i][0]&@tab&$pos[$i][1] & @LF)
	GUICtrlCreateButton("", $pos[$i][0], $pos[$i][1], 64, 64)
next

guisetstate(@sw_show, $hWnd)

while 1
	Switch guigetmsg()
		case -3
			exit
	EndSwitch
wend
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MnM,
А какая конечная цель?
 

Fever

Скриптер
Сообщения
308
Репутация
112
MnM
Код:
$hWnd = guicreate("", 680, 460)
dim $pos[10][2]

Local $iX, $iY, $error = 0

for $i = 1 to 9
	$iX = random(64, 616, 1)
	$iY = random(64, 396, 1)

	for $j = 1 to $i
		if ($i <> $j) Then
			Do
				$error = 0

				if _DotInSquare($iX, $iY, $pos[$j][0], $pos[$j][1], 64, 64) Then
					$error = 1
					$iX += 5
					$iY += 5
				ElseIf  _DotInSquare($iX + 64, $iY, $pos[$j][0], $pos[$j][1], 64, 64) Then
					$error = 1
					$iX -= 5
					$iY += 5
				ElseIf  _DotInSquare($iX, $iY + 64, $pos[$j][0], $pos[$j][1], 64, 64) Then
					$error = 1
					$iX += 5
					$iY -= 5
				ElseIf  _DotInSquare($iX + 64, $iY + 64, $pos[$j][0], $pos[$j][1], 64, 64) Then
					$error = 1
					$iX -= 5
					$iY -= 5
				EndIf

			if ($error == 1) Then $j = 0

			Until $error = 0
		endif

	next

	$pos[$i][0] = $iX
	$pos[$i][1] = $iY

	GUICtrlCreateButton("", $iX, $iY, 64, 64)
next

guisetstate(@sw_show, $hWnd)

while 1
    Switch guigetmsg()
        case -3
            exit
    EndSwitch
wend

Func _DotInSquare($_iX, $_iY, $_iSX, $_iSY, $_iSW, $_iSH)
	Return ($_iX >= $_iSX And $_iY >= $_iSY And $_iX <= $_iSX + $_iSW And $_iY <= $_iSY + $_iSH)
EndFunc


кнопки генерируются скоплениями ибо вытесняют одна другую после генерации
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MnM,
Сырой пример.
Код:
#include <GUIConstantsEx.au3>

Global $iW = 680, $iH = 460, $iWb = 64, $iHb = 48, $iMsg, $iCountBtn, $aiBtn[1][2], $iRangeX, $iRangeY, $hGui, $iRandX, $iRandY

$iMsg = Random(2, 8, 1)
$iCountBtn = $iMsg * ($iMsg + 1)
ConsoleWrite('$iCountBtn = ' & $iCountBtn & ' (' & $iMsg & ' * (' & $iMsg & ' + 1)' & @LF)
If ($iWb + 2) * ($iHb + 2) * $iCountBtn > $iW * $iH Then Exit 13
ReDim $aiBtn[$iCountBtn + 1][2]
$iMsg = Floor(Sqrt($iCountBtn))

If $iW / $iWb >= $iH / $iHb Then
	For $i = $iMsg To $iCountBtn
		For $j = $iMsg To 1 Step -1
			If $i * $j = $iCountBtn Then
				$iRangeX = $i
				$iRangeY = $j
				ExitLoop 2
			EndIf
		Next
	Next
Else
	For $i = $iMsg To $iCountBtn
		For $j = $iMsg To 1 Step -1
			If $i * $j = $iCountBtn Then
				$iRangeX = $j
				$iRangeY = $i
				ExitLoop 2
			EndIf
		Next
	Next
EndIf
ConsoleWrite($iRangeX & 'x' & $iRangeY & @LF)

$hGui = GUICreate('Random Button', $iW, $iH)
For $i = 0 To $iRangeX - 1
	For $j = 0 To $iRangeY - 1
		$aiBtn[0][0] += 1
		$iRandX = Random(Int($i * $iW / $iRangeX), Int(($i + 1) * $iW / $iRangeX - ($iWb + 2)), 1)
		$iRandY = Random(Int($j * $iH / $iRangeY), Int(($j + 1) * $iH / $iRangeY - ($iHb + 2)), 1)
		$aiBtn[$aiBtn[0][0]][0] = GUICtrlCreateButton($aiBtn[0][0], $iRandX, $iRandY, $iWb, $iHb)
		$aPos = ControlGetPos($hGui, '', $aiBtn[$aiBtn[0][0]][0])
		$aiBtn[$aiBtn[0][0]][1] = $iRandX & 'x' & $iRandY
	Next
Next
GUISetState()
While 1
	$iMsg = GUIGetMsg()
	Switch $iMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aiBtn[1][0] To $aiBtn[$aiBtn[0][0]][0]
			For $i = 1 To $aiBtn[0][0]
				If $iMsg = $aiBtn[$i][0] Then
					MsgBox(64, 'Info', 'Button: ' & $i & ' (XxY)' & @LF & $aiBtn[$i][1], 0, $hGui)
					ExitLoop
				EndIf
			Next
			$aiBtn[0][0] = 0
			For $i = 0 To $iRangeX - 1
				For $j = 0 To $iRangeY - 1
					$aiBtn[0][0] += 1
					$iRandX = Random(Int($i * $iW / $iRangeX), Int(($i + 1) * $iW / $iRangeX - ($iWb + 2)), 1)
					$iRandY = Random(Int($j * $iH / $iRangeY), Int(($j + 1) * $iH / $iRangeY - ($iHb + 2)), 1)
					GUICtrlSetPos($aiBtn[$aiBtn[0][0]][0], $iRandX, $iRandY)
					$aiBtn[$aiBtn[0][0]][1] &= @LF & $iRandX & 'x' & $iRandY
				Next
			Next
	EndSwitch
WEnd
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Спасибо вам большое, тема решена.

madmasles сказал(а):
А какая конечная цель?
Как это какая? Цель темы была назначена Вы и Fever решили её, за что вам и спасибо! :smile:
 
Верх