MCPcopy Create free account
hub / github.com/MeshInspector/MeshLib / insertSharpCorner

Function insertSharpCorner

source/MRMesh/MROffsetContours.cpp:249–302  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

247}
248
249void insertSharpCorner( Contour2f& cont, const CornerParameters& params, float maxSharpAngle, int* shiftMap )
250{
251 if ( maxSharpAngle <= 0.0f )
252 return;
253
254 bool openAng = cross( params.rc - params.lc, params.rn - params.lc ) * params.lrAng < 0.0f || cross( params.lp - params.rc, params.lc - params.rc ) * params.lrAng < 0.0f;
255 if ( openAng )
256 return;
257
258 auto realAng = findAngle( params.rn, params.rc, params.rc + params.lp - params.lc );
259 if ( params.lrAng < 0.0f )
260 realAng = -PI_F - realAng;
261 else
262 realAng = -PI_F + realAng;
263
264 if ( cross( params.rc - params.rn, params.lc - params.lp ) * params.lrAng < 0.0f )
265 return;
266
267 auto intersection = findIntersection( params.lp, params.lc, params.rn, params.rc );
268 if ( intersection && std::abs( realAng ) <= maxSharpAngle )
269 {
270 cont.emplace_back( *intersection );
271 if ( shiftMap )
272 ++( *shiftMap );
273 }
274 else
275 {
276 float leftAngRat = params.lrAng * 0.5f;
277 if ( intersection )
278 leftAngRat = findAngle( params.lc, params.org, *intersection );
279
280 auto leftAng = leftAngRat - std::copysign( ( std::abs( realAng ) - maxSharpAngle ), realAng ) * leftAngRat / realAng;
281 auto rotXf = AffineXf2f::xfAround( Matrix2f::rotation( leftAng ), params.org );
282 auto rotPoint = rotXf( params.lc );
283 auto interLeft = findIntersection( params.lp, params.lc, params.org, rotPoint );
284 if ( interLeft )
285 {
286 cont.emplace_back( *interLeft );
287 if ( shiftMap )
288 ++( *shiftMap );
289 }
290
291 auto rightAng = ( params.lrAng - leftAngRat ) - std::copysign( ( std::abs( realAng ) - maxSharpAngle ), realAng ) * ( params.lrAng - leftAngRat ) / realAng;
292 rotXf = AffineXf2f::xfAround( Matrix2f::rotation( -rightAng ), params.org );
293 rotPoint = rotXf( params.rc );
294 auto interRight = findIntersection( params.rn, params.rc, params.org, rotPoint );
295 if ( interRight )
296 {
297 cont.emplace_back( *interRight );
298 if ( shiftMap )
299 ++( *shiftMap );
300 }
301 }
302}
303
304Contour2f offsetOneDirectionContour( const Contour2f& cont, SingleOffset offset, const OffsetContoursParams& params,
305 int* shiftMap )

Callers 1

Calls 4

findAngleFunction · 0.85
findIntersectionFunction · 0.85
absFunction · 0.85
crossFunction · 0.70

Tested by

no test coverage detected