// Calculate minimum extend of the polygon. static float polyMinExtent(const float* verts, const int nverts) { float minDist = FLT_MAX; for (int i = 0; i < nverts; i++) { const int ni = (i+1) % nverts; const float* p1 = &verts[i*3]; const float* p2 = &verts[ni*3]; float maxEdgeDist = 0; for (int j = 0; j < nverts; j++) { if (j == i || j == ni) continue; float d = distancePtSeg2d(&verts[j*3], p1,p2); maxEdgeDist = rcMax(maxEdgeDist, d); } minDist = rcMin(minDist, maxEdgeDist); } return rcSqrt(minDist); }
int rcOffsetPoly(const float* verts, const int nverts, const float offset, float* outVerts, const int maxOutVerts) { const float MITER_LIMIT = 1.20f; int n = 0; for (int i = 0; i < nverts; i++) { const int a = (i+nverts-1) % nverts; const int b = i; const int c = (i+1) % nverts; const float* va = &verts[a*3]; const float* vb = &verts[b*3]; const float* vc = &verts[c*3]; float dx0 = vb[0] - va[0]; float dy0 = vb[2] - va[2]; float d0 = dx0*dx0 + dy0*dy0; if (d0 > 1e-6f) { d0 = 1.0f/rcSqrt(d0); dx0 *= d0; dy0 *= d0; } float dx1 = vc[0] - vb[0]; float dy1 = vc[2] - vb[2]; float d1 = dx1*dx1 + dy1*dy1; if (d1 > 1e-6f) { d1 = 1.0f/rcSqrt(d1); dx1 *= d1; dy1 *= d1; } const float dlx0 = -dy0; const float dly0 = dx0; const float dlx1 = -dy1; const float dly1 = dx1; float cross = dx1*dy0 - dx0*dy1; float dmx = (dlx0 + dlx1) * 0.5f; float dmy = (dly0 + dly1) * 0.5f; float dmr2 = dmx*dmx + dmy*dmy; bool bevel = dmr2 * MITER_LIMIT*MITER_LIMIT < 1.0f; if (dmr2 > 1e-6f) { const float scale = 1.0f / dmr2; dmx *= scale; dmy *= scale; } if (bevel && cross < 0.0f) { if (n+2 >= maxOutVerts) return 0; float d = (1.0f - (dx0*dx1 + dy0*dy1))*0.5f; outVerts[n*3+0] = vb[0] + (-dlx0+dx0*d)*offset; outVerts[n*3+1] = vb[1]; outVerts[n*3+2] = vb[2] + (-dly0+dy0*d)*offset; n++; outVerts[n*3+0] = vb[0] + (-dlx1-dx1*d)*offset; outVerts[n*3+1] = vb[1]; outVerts[n*3+2] = vb[2] + (-dly1-dy1*d)*offset; n++; } else { if (n+1 >= maxOutVerts) return 0; outVerts[n*3+0] = vb[0] - dmx*offset; outVerts[n*3+1] = vb[1]; outVerts[n*3+2] = vb[2] - dmy*offset; n++; } } return n; }