挤出二维 vertices/vectors

Extrude 2d vertices/vectors

我有一组 vertices/vectors,我需要将它们挤压到对象边界内以赋予该对象厚度

举个例子:

我需要转成这样: 像这样:

我怎样才能做到这一点?

(我正在使用 C++、OpenGL 和 GLM)

-- 更新--

感谢@Futurologist 的回答,我能够解决这个问题,嘿,它就像一个魅力!

对不起python,但这样写对我来说更快更容易,而且它可能揭示了背景中的一些几何概念。

这就是你想要的吗?

'''
angle bisectors and offsetting a polygon 
'''
def  bisectors(P, thickness):

   #P is n x 2 matrix, row P[j,:] is a vertex of a polygon in the plane,
   #P is the ordered set of vertices of the polygon
   
   n = P.shape[0]; 
   B = np.zeros((n,2), dtype=float);

   for j in range(n):

       if j == 0:
          v_in = P[0,:] - P[n-1,:];
          v_out = P[1,:] - P[0,:];
       elif j == n-1:
          v_in = P[n-1,:] - P[n-2,:];
          v_out = P[0,:] - P[n-1,:];
       else:
          v_in = P[j,:] - P[j-1,:];
          v_out =P[j+1,:] - P[j,:];

       v_in = v_in / math.sqrt(v_in.dot(v_in)); #normalize edge-vector
       v_out = v_out / math.sqrt(v_out.dot(v_out)); #normalize edge-vector

       # bisector of the complementary angle at the vertex j, 
       # pointing counter clockwise and displacing the vertex so that
       # the resulting polygon is "thickness" units inwards in normal direction:
       bisector = v_in + v_out; 
       bisector = bisector / abs(bisector.dot(v_in));
       bisector = thickness * bisector

       # 90 degree counter clockwise rotation of complementary bisector:
       B[j,0] = - bisector[1];
       B[j,1] = bisector[0];
       
   return B
   
def offset_vertices(Polygon, thickness):
    
    Polygon_off = Polygon + bisectors(Polygon, thickness)
    
    return Polygon_off


P = np.array([[0,0],[2,0],[3,1],[1,3]])


P_off = offset_vertices(P, 0.1)



# Plotting

P = np.vstack((P, P[0,:] ))
P_off = np.vstack((P_off, P_off[0,:] ))
       
fig, axs = plt.subplots(1)
axs.plot(P[:,0], P[:,1], 'bo')
axs.plot(P_off[:,0], P_off[:,1], 'ro')
axs.plot(P[:,0], P[:,1])
axs.plot(P_off[:,0], P_off[:,1])
axs.set_aspect('equal')
plt.grid()
plt.show()