* @function LevelRenderer.Tool.Curve.prototype.cubicRootAt * @description 计算三次贝塞尔方程极限值的位置 * @param {number} p0 - 点p0。 * @param {number} p1 - 点p1。 * @param {number} p2 - 点p2。 * @param {number} p3 - 点p3。 * @param {Array. } extrema - 值。 * @returns {number} 有效数目
(p0, p1, p2, p3, extrema)
| 216 | * @returns {number} 有效数目。 |
| 217 | */ |
| 218 | cubicExtrema(p0, p1, p2, p3, extrema) { |
| 219 | var b = 6 * p2 - 12 * p1 + 6 * p0; |
| 220 | var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; |
| 221 | var c = 3 * p1 - 3 * p0; |
| 222 | |
| 223 | var n = 0; |
| 224 | if (this.isAroundZero(a)) { |
| 225 | if (this.isNotAroundZero(b)) { |
| 226 | let t1 = -c / b; |
| 227 | if (t1 >= 0 && t1 <= 1) { |
| 228 | extrema[n++] = t1; |
| 229 | } |
| 230 | } |
| 231 | } else { |
| 232 | var disc = b * b - 4 * a * c; |
| 233 | if (this.isAroundZero(disc)) { |
| 234 | extrema[0] = -b / (2 * a); |
| 235 | } else if (disc > 0) { |
| 236 | let discSqrt = Math.sqrt(disc); |
| 237 | let t1 = (-b + discSqrt) / (2 * a); |
| 238 | let t2 = (-b - discSqrt) / (2 * a); |
| 239 | if (t1 >= 0 && t1 <= 1) { |
| 240 | extrema[n++] = t1; |
| 241 | } |
| 242 | if (t2 >= 0 && t2 <= 1) { |
| 243 | extrema[n++] = t2; |
| 244 | } |
| 245 | } |
| 246 | } |
| 247 | return n; |
| 248 | } |
| 249 | |
| 250 | |
| 251 | /** |
no test coverage detected