How to detect when a part is COMPLETELY inside a region?

I have parts of different sizes, different orientations.
I use the mouse to drag these outside parts into a box/region.
The outside parts of the box are in red and should change to green only when they are COMPLETELY inside the box:

In the example above you can see that one part is green (completely inside the box), a second is red (completely outside), and a third part is also red (almost all inside, but not completely inside).

All parts inside the box are ANCHORED and should not use physics (collide, touch).

How could I do that?

1 Like

This function can determine if a point is inside a brick:

function isInsideBrick(position, brick)
	local v3 = brick.CFrame:PointToObjectSpace(position)
	return (math.abs(v3.X) <= brick.Size.X / 2)
		and (math.abs(v3.Y) <= brick.Size.Y / 2)
		and (math.abs(v3.Z) <= brick.Size.Z / 2)
end

To see if an entire brick is inside the region you would check for every corner of the brick.

function isCompletelyInside(part, region)
	local size = part.Size / 2
	local corners = {
		part.CFrame * CFrame.new(size.X, size.Y, size.Z),
		part.CFrame * CFrame.new(size.X, size.Y, -size.Z),
		part.CFrame * CFrame.new(size.X, -size.Y, size.Z),
		part.CFrame * CFrame.new(size.X, -size.Y, -size.Z),
		part.CFrame * CFrame.new(-size.X, size.Y, size.Z),
		part.CFrame * CFrame.new(-size.X, size.Y, -size.Z),
		part.CFrame * CFrame.new(-size.X, -size.Y, size.Z),
		part.CFrame * CFrame.new(-size.X, -size.Y, -size.Z)
	}
	for _, cf in ipairs(corners) do
		-- if any corner is outside, stop
		if (not isInsideBrick(cf.Position, region)) then
			return false
		end
	end
	return true
end
9 Likes

That’s perfect!
I’m happy to see that there are people who use their experience and intelligence to support others!
Thank you very much! :smiley:

2 Likes

Yo, it works! I have been looking for something like this, thank you (: