# Most efficient way to get the distance from a shape's edge?

What’s the most efficient way to get the distance from a shape’s edge at any closest point?

For example, pretend that perfectly drawn red line represents 4 studs away from the part. If a player is on any point of that line, return 4.

The first idea that springs to mind is to store the part’s corners within a table then recursively check the magnitude between them and the object. Is there a built in function to handle this for us?

5 Likes

I think this is what you mean? As long as you can figure out how to move the points out four studs from the origin, it should work(correct me if im wrong).

``````local function PointInPolygon(Point, Polygon)
local current = Polygon
local inside = false
local A = current.Position
local ax, az = A.X, A.Z
local px, pz = Point.X, Point.Z
repeat
local B = current.Next.Position
local bx, bz = B.X, B.Z
if ((az >= pz) ~= (bz >= pz)) and ((px - ax) <= (bx - ax)*(pz - az)/(bz - az)) then
inside = not inside
end
current = current.Next
A, ax, az = B, bx, bz
until current == Polygon
return inside
end

local function CreatePolygonFromPoints(Points)
local Polygon = {Position = Points}
local First = Polygon
for i = 2, #Points do
Polygon.Next = {Previous = Polygon, Position = Points[i]}
Polygon = Polygon.Next
end
Polygon.Next, First.Previous = First, Polygon
return First
end
``````
3 Likes

I’m more-so looking for the most efficient method to get the distance from the closest point on a part’s edge, as apposed to checking if something is within it’s area. I’ve edited the OP to make this more clear.

If I understand your issue properly (to get parts on or in the red line boundary), while this isn’t the “most efficient way to do it,” I’d create two Region3s, one that’s the “square version” of the part, being the size of the part, plus 4 studs all around. Then, I’d create the second Region3, which is essentially the “ignore” part of the region (for the bottom right corner).

Use any variant of workspace:FindPartsInRegion3 to get parts that are within both Regions, and if they match up in both tables, cancel them out. If parts that are in the first Region3 aren’t in the second, then you’ve got a part within the 4-stud boundary surrounding your part.

To get the distance from a point to some (block-shaped) part, you can find the closest point on that part to the point, and then calculate the distance between those points.

As for finding the closest point on the part to the point, I wrote some code in reply to a similar post which does this. I have also provided an explanation of how it works:

From there, you just need to take that point and calculate the distance to your original point.

Note that this will not work for non block-shaped parts (spheres, wedges, etc.) - you will have to come up with alternative methods to find the closest point on those parts. This method will not be applicable to unions or meshparts.

4 Likes