Given a concave 2D shape, I am trying to figure out how to scale it down. Purpose is to duplicate the shape and make the duplicate smaller and join them, similar to creating a border around it.
If the polygon is convex and centered, I can easily scale it down, but I don't have that luxury.
As shown on the image, we tried to scale down, but since the mesh is not centered, it goes wrong. Even though the mesh would be centered, area like the little arm at the bottom right would be wrong.
I thought of the following:
foreach vertex
get normalized vector to previous -> A
get normalized vector to next -> B
A + B -> C
Now C would be the angle bisector and I could use that to place my duplicate vertex. But if the angle is more than 180 degrees, I would need to invert of C.
I can't check the angle of two vectors since the system will always consider it to be less then 180.
If anyone could guide me on this, help would be appreciated.

There might be a terminology problem, here. When you say “scale it down” to a mathematician it implies a certain kind of transformation that shrinks distances from some reference point.
Maybe this isn’t what you want. Maybe you want a new shape that’s inside the original one, with a constant-width gap between the larger shape and the smaller one. If so, many people would call this “offsetting” rather than scaling.
Offsetting non-convex shapes is pretty complicated. The offset boundary can develop self-intersecting loops, and removing them requires some messy logic. You may end up with an offset shape that has fewer vertices than the original, so connecting corresponding vertices will not be possible.
Now that you know what search term to use, you might be able to find an existing computational geometry package that does what you want. One place to start would be the offsetting functions in the CGAL library.
Offsetting is sometimes expressed via Minkowsi set operations, which will give you another search term.