(linePoints: number[][], minTurnAngle: number)
| 409 | * @param minTurnAngle Radian of minimum turn angle. 0 - 180 |
| 410 | */ |
| 411 | export function limitTurnAngle(linePoints: number[][], minTurnAngle: number) { |
| 412 | if (!(minTurnAngle <= 180 && minTurnAngle > 0)) { |
| 413 | return; |
| 414 | } |
| 415 | minTurnAngle = minTurnAngle / 180 * Math.PI; |
| 416 | // The line points can be |
| 417 | // /pt1----pt2 (label) |
| 418 | // / |
| 419 | // pt0/ |
| 420 | pt0.fromArray(linePoints[0]); |
| 421 | pt1.fromArray(linePoints[1]); |
| 422 | pt2.fromArray(linePoints[2]); |
| 423 | |
| 424 | Point.sub(dir, pt0, pt1); |
| 425 | Point.sub(dir2, pt2, pt1); |
| 426 | |
| 427 | const len1 = dir.len(); |
| 428 | const len2 = dir2.len(); |
| 429 | if (len1 < 1e-3 || len2 < 1e-3) { |
| 430 | return; |
| 431 | } |
| 432 | |
| 433 | dir.scale(1 / len1); |
| 434 | dir2.scale(1 / len2); |
| 435 | |
| 436 | const angleCos = dir.dot(dir2); |
| 437 | const minTurnAngleCos = Math.cos(minTurnAngle); |
| 438 | if (minTurnAngleCos < angleCos) { // Smaller than minTurnAngle |
| 439 | // Calculate project point of pt0 on pt1-pt2 |
| 440 | const d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); |
| 441 | tmpProjPoint.fromArray(tmpArr); |
| 442 | // Calculate new projected length with limited minTurnAngle and get the new connect point |
| 443 | tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); |
| 444 | // Limit the new calculated connect point between pt1 and pt2. |
| 445 | const t = pt2.x !== pt1.x |
| 446 | ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) |
| 447 | : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); |
| 448 | if (isNaN(t)) { |
| 449 | return; |
| 450 | } |
| 451 | |
| 452 | if (t < 0) { |
| 453 | Point.copy(tmpProjPoint, pt1); |
| 454 | } |
| 455 | else if (t > 1) { |
| 456 | Point.copy(tmpProjPoint, pt2); |
| 457 | } |
| 458 | |
| 459 | tmpProjPoint.toArray(linePoints[1]); |
| 460 | } |
| 461 | } |
| 462 | |
| 463 | /** |
| 464 | * Limit the angle of line and the surface |
no test coverage detected
searching dependent graphs…