Hi,
Been trying to solve a problem and even though on paper the logic makes sense, I could really do with some fresh perspective.
Problem:
Distribute 10 cubes (local scale 10, 10, 10) in an square area of 50 x 50 without any overlap between the cubes (cubes must have a distance of 10 or more units for all other cubes). Note: don’t need to worry about the z axis can it just be set to 0.
Solution:
So these were my steps to solve this:
1) Get a random position within the square
Vector3 GetRandomPosition()
{
return new Vector3(Random.Range(0f, 50f), Random.Range(0f, 50f), 0f);
}
2) Check if the random position is a valid one. The position must be at least 10 units for all other cubes in the square area.
Vector3 GetValidPositionInArea()
{
Vector3 randomPosition = GetRandomPosition();
// Using for loop with steps to ensure the loop exits
// and doesn't hang incase there are never any
// valid positions found
for(int i = 0; i < m_numOfSteps; i++)
{
// If the position is valid break and return
if(IsPositionValid(randomPosition))
{
correctNum++;
break;
}
// else find another one
randomPosition = GetRandomPosition();
}
return randomPosition;
}
//
// Test a random position against all the other
// cubes in the array to make sure there
// is a valid distance between the random position
// and ALL other cubes
bool IsPositionValid(Vector3 randomPos)
{
int numOfValidPositions = 0;
for(int i = 0; i < m_numberOfCubes; i++)
{
// If the position is valid increment the number of valid positions
if(IsPositionEmpty(randomPos, m_cubesTransforms*.position))*

{*

numOfValidPositions++;*

}*

}*

// If all the positions are valid the cubes*

// have been distributed correctly*

return numOfValidPositions == m_numberOfCubes;*

}*
3) If the random position tested is not valid, get another random position and keep doing this until a valid position is found for all cubes

Vector3 GetValidPositionInArea()*

{*

Vector3 randomPosition = GetRandomPosition();*

// Using for loop with steps to ensure the loop exits*

// and doesn't hang incase there are never any valid positions found*

for(int i = 0; i < m_numOfSteps; i++)*

{*

// If the position is valid break and return*

if(IsPositionValid(randomPosition))*

{*

correctNum++;*

break;*

}*

// else find another one*

randomPosition = GetRandomPosition();*

}*

return randomPosition;*

}*

The problem I’m find now is that some cubes that are placed later on i.e. 8, 9 and 10 have NO valid place left in the square area and thus never find a valid position so are just placed randomly and thus overlap. What I guess I really need to do is run a distribution, check all cubes have a valid position and keep going through the loop until there placed correctly. Which I’ve tried and either using a while loop, it just never finds any where valid and locks up or using a for loop and a fixed number of steps it will still get an invalid place and overlap with another cube. Back to the drawing board!