MCPcopy Index your code
hub / github.com/SuperMap/iClient-JavaScript / cubicExtrema

Method cubicExtrema

src/common/overlay/levelRenderer/Curve.js:218–248  ·  view source on GitHub ↗

* @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)

Source from the content-addressed store, hash-verified

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 /**

Callers 3

cubeBezierMethod · 0.95
CurveSpec.jsFile · 0.80
windingCubicMethod · 0.80

Calls 2

isAroundZeroMethod · 0.95
isNotAroundZeroMethod · 0.95

Tested by

no test coverage detected