| 247 | } |
| 248 | |
| 249 | void 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 | |
| 304 | Contour2f offsetOneDirectionContour( const Contour2f& cont, SingleOffset offset, const OffsetContoursParams& params, |
| 305 | int* shiftMap ) |
no test coverage detected