修改静态资源文件夹位置
This commit is contained in:
		
							
								
								
									
										328
									
								
								public/sdk/arrow/algorithm.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										328
									
								
								public/sdk/arrow/algorithm.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,328 @@ | ||||
| var xp = { | ||||
|     version: "1.0.0", | ||||
|     createTime: "2018.6.19", | ||||
|     author: "xupinhui" | ||||
| } | ||||
| var doubleArrowDefualParam = { | ||||
|     type: "doublearrow", | ||||
|     headHeightFactor: .25, | ||||
|     headWidthFactor: .3, | ||||
|     neckHeightFactor: .85, | ||||
|     fixPointCount: 4, | ||||
|     neckWidthFactor: .15 | ||||
| } | ||||
| var tailedAttackArrowDefualParam = { | ||||
|     headHeightFactor: .18, | ||||
|     headWidthFactor: .3, | ||||
|     neckHeightFactor: .85, | ||||
|     neckWidthFactor: .15, | ||||
|     tailWidthFactor: .1, | ||||
|     headTailFactor: .8, | ||||
|     swallowTailFactor: 1 | ||||
| }; | ||||
| var fineArrowDefualParam = { | ||||
|     tailWidthFactor: 0.15, | ||||
|     neckWidthFactor: 0.20, | ||||
|     headWidthFactor: 0.25, | ||||
|     headAngle: Math.PI / 8.5, | ||||
|     neckAngle: Math.PI / 13 | ||||
| }; | ||||
| xp.algorithm = {}, | ||||
|     xp.algorithm.doubleArrow = function (inputPoint) { | ||||
|         this.connPoint = null; | ||||
|         this.tempPoint4 = null; | ||||
|         this.points = inputPoint; | ||||
|         var result = { | ||||
|             controlPoint: null, | ||||
|             polygonalPoint: null | ||||
|         }; | ||||
|         //获取已经点击的坐标数 | ||||
|         var t = inputPoint.length; | ||||
|         if (!(2 > t)) { | ||||
|             if (2 == t) return inputPoint; | ||||
|             var o = this.points[0],    //第一个点 | ||||
|                 e = this.points[1],        //第二个点 | ||||
|                 r = this.points[2],        //第三个点 | ||||
|                 t = inputPoint.length; //获取已经点击的坐标数 | ||||
|             //下面的是移动点位后的坐标 | ||||
|             3 == t ? this.tempPoint4 = xp.algorithm.getTempPoint4(o, e, r) : this.tempPoint4 = this.points[3], | ||||
|                 3 == t || 4 == t ? this.connPoint = P.PlotUtils.mid(o, e) : this.connPoint = this.points[4]; | ||||
|             var n, g; | ||||
|             P.PlotUtils.isClockWise(o, e, r) ? (n = xp.algorithm.getArrowPoints(o, this.connPoint, this.tempPoint4, !1), g = xp.algorithm.getArrowPoints(this.connPoint, e, r, !0)) : (n = xp.algorithm.getArrowPoints(e, this.connPoint, r, !1), g = xp.algorithm.getArrowPoints(this.connPoint, o, this.tempPoint4, !0)); | ||||
|             var i = n.length, | ||||
|                 s = (i - 5) / 2, | ||||
|                 a = n.slice(0, s), | ||||
|                 l = n.slice(s, s + 5), | ||||
|                 u = n.slice(s + 5, i), | ||||
|                 c = g.slice(0, s), | ||||
|                 p = g.slice(s, s + 5), | ||||
|                 h = g.slice(s + 5, i); | ||||
|             c = P.PlotUtils.getBezierPoints(c); | ||||
|             var d = P.PlotUtils.getBezierPoints(h.concat(a.slice(1))); | ||||
|             u = P.PlotUtils.getBezierPoints(u); | ||||
|             var f = c.concat(p, d, l, u); | ||||
|             var newArray = xp.algorithm.array2Dto1D(f); | ||||
|             result.controlPoint = [o, e, r, this.tempPoint4, this.connPoint]; | ||||
|             result.polygonalPoint = Cesium.Cartesian3.fromDegreesArray(newArray); | ||||
|         } | ||||
|  | ||||
|         return result; | ||||
|     }, | ||||
|     xp.algorithm.threeArrow = function (inputPoint) { | ||||
|         this.connPoint = null; | ||||
|         this.tempPoint4 = null; | ||||
|         this.tempPoint5 = null; | ||||
|         this.points = inputPoint; | ||||
|         var result = { | ||||
|             controlPoint: null, | ||||
|             polygonalPoint: null | ||||
|         }; | ||||
|         //获取已经点击的坐标数 | ||||
|         var t = inputPoint.length; | ||||
|         if (t >= 2) { | ||||
|             if (t == 2) { | ||||
|                 return inputPoint; | ||||
|             } | ||||
|             var o = this.points[0],    //第一个点 | ||||
|                 e = this.points[1],        //第二个点 | ||||
|                 r = this.points[2],        //第三个点 | ||||
|                 t = inputPoint.length; //获取已经点击的坐标数 | ||||
|             //下面的是移动点位后的坐标 | ||||
|             if (t == 3) { | ||||
|                 this.tempPoint4 = xp.algorithm.getTempPoint4(o, e, r); | ||||
|                 this.tempPoint5 = P.PlotUtils.mid(r, this.tempPoint4); | ||||
|             } else { | ||||
|                 this.tempPoint4 = this.points[3]; | ||||
|                 this.tempPoint5 = this.points[4]; | ||||
|             } | ||||
|             if (t < 6) { | ||||
|                 this.connPoint = P.PlotUtils.mid(o, e); | ||||
|             } else { | ||||
|                 this.connPoint = this.points[5]; | ||||
|             } | ||||
|             var n, g; | ||||
|             if (P.PlotUtils.isClockWise(o, e, r)) { | ||||
|                 n = xp.algorithm.getArrowPoints(o, this.connPoint, this.tempPoint4, !1); | ||||
|                 g = xp.algorithm.getArrowPoints(this.connPoint, e, r, !0); | ||||
|             } else { | ||||
|                 n = xp.algorithm.getArrowPoints(e, this.connPoint, r, !1); | ||||
|                 g = xp.algorithm.getArrowPoints(this.connPoint, o, this.tempPoint4, !0); | ||||
|             } | ||||
|             var i = n.length, | ||||
|                 s = (i - 5) / 2, | ||||
|                 a = n.slice(0, s), | ||||
|                 l = n.slice(s, s + 5), | ||||
|                 u = n.slice(s + 5, i), | ||||
|                 c = g.slice(0, s), | ||||
|                 p = g.slice(s, s + 5), | ||||
|                 h = g.slice(s + 5, i); | ||||
|             c = P.PlotUtils.getBezierPoints(c); | ||||
|             var d = P.PlotUtils.getBezierPoints(h.concat(a.slice(1))); | ||||
|             u = P.PlotUtils.getBezierPoints(u); | ||||
|             var f = c.concat(p, d, l, u); | ||||
|             var newArray = xp.algorithm.array2Dto1D(f); | ||||
|             result.controlPoint = [o, e, r, this.tempPoint4, this.tempPoint5, this.connPoint]; | ||||
|             result.polygonalPoint = Cesium.Cartesian3.fromDegreesArray(newArray); | ||||
|         } | ||||
|         return result; | ||||
|     }, | ||||
|     xp.algorithm.array2Dto1D = function (array) { | ||||
|         var newArray = []; | ||||
|         array.forEach(function (elt) { | ||||
|             newArray.push(elt[0]); | ||||
|             newArray.push(elt[1]); | ||||
|         }); | ||||
|         return newArray; | ||||
|     }, | ||||
|     xp.algorithm.getArrowPoints = function (t, o, e, r) { | ||||
|         this.type = doubleArrowDefualParam.type, | ||||
|             this.headHeightFactor = doubleArrowDefualParam.headHeightFactor, | ||||
|             this.headWidthFactor = doubleArrowDefualParam.headWidthFactor, | ||||
|             this.neckHeightFactor = doubleArrowDefualParam.neckHeightFactor, | ||||
|             this.neckWidthFactor = doubleArrowDefualParam.neckWidthFactor; | ||||
|         var n = P.PlotUtils.mid(t, o), | ||||
|             g = P.PlotUtils.distance(n, e), | ||||
|             i = P.PlotUtils.getThirdPoint(e, n, 0, .3 * g, !0), | ||||
|             s = P.PlotUtils.getThirdPoint(e, n, 0, .5 * g, !0); | ||||
|         i = P.PlotUtils.getThirdPoint(n, i, P.Constants.HALF_PI, g / 5, r), | ||||
|             s = P.PlotUtils.getThirdPoint(n, s, P.Constants.HALF_PI, g / 4, r); | ||||
|         var a = [n, i, s, e], | ||||
|             l = xp.algorithm.getArrowHeadPoints(a, this.headHeightFactor, this.headWidthFactor, this.neckHeightFactor, this.neckWidthFactor), | ||||
|             u = l[0], | ||||
|             c = l[4], | ||||
|             p = P.PlotUtils.distance(t, o) / P.PlotUtils.getBaseLength(a) / 2, | ||||
|             h = xp.algorithm.getArrowBodyPoints(a, u, c, p), | ||||
|             d = h.length, | ||||
|             f = h.slice(0, d / 2), | ||||
|             E = h.slice(d / 2, d); | ||||
|         return f.push(u), | ||||
|             E.push(c), | ||||
|             f = f.reverse(), | ||||
|             f.push(o), | ||||
|             E = E.reverse(), | ||||
|             E.push(t), | ||||
|             f.reverse().concat(l, E) | ||||
|     }, | ||||
|     xp.algorithm.getArrowHeadPoints = function (t, o, e) { | ||||
|         this.type = doubleArrowDefualParam.type, | ||||
|             this.headHeightFactor = doubleArrowDefualParam.headHeightFactor, | ||||
|             this.headWidthFactor = doubleArrowDefualParam.headWidthFactor, | ||||
|             this.neckHeightFactor = doubleArrowDefualParam.neckHeightFactor, | ||||
|             this.neckWidthFactor = doubleArrowDefualParam.neckWidthFactor; | ||||
|         var r = P.PlotUtils.getBaseLength(t), | ||||
|             n = r * this.headHeightFactor, | ||||
|             g = t[t.length - 1], | ||||
|             i = (P.PlotUtils.distance(o, e), n * this.headWidthFactor), | ||||
|             s = n * this.neckWidthFactor, | ||||
|             a = n * this.neckHeightFactor, | ||||
|             l = P.PlotUtils.getThirdPoint(t[t.length - 2], g, 0, n, !0), | ||||
|             u = P.PlotUtils.getThirdPoint(t[t.length - 2], g, 0, a, !0), | ||||
|             c = P.PlotUtils.getThirdPoint(g, l, P.Constants.HALF_PI, i, !1), | ||||
|             p = P.PlotUtils.getThirdPoint(g, l, P.Constants.HALF_PI, i, !0), | ||||
|             h = P.PlotUtils.getThirdPoint(g, u, P.Constants.HALF_PI, s, !1), | ||||
|             d = P.PlotUtils.getThirdPoint(g, u, P.Constants.HALF_PI, s, !0); | ||||
|         return [h, c, g, p, d]; | ||||
|     }, | ||||
|     xp.algorithm.getArrowBodyPoints = function (t, o, e, r) { | ||||
|         for (var n = P.PlotUtils.wholeDistance(t), g = P.PlotUtils.getBaseLength(t), i = g * r, s = P.PlotUtils.distance(o, e), a = (i - s) / 2, l = 0, u = [], c = [], p = 1; p < t.length - 1; p++) { | ||||
|             var h = P.PlotUtils.getAngleOfThreePoints(t[p - 1], t[p], t[p + 1]) / 2; | ||||
|             l += P.PlotUtils.distance(t[p - 1], t[p]); | ||||
|             var d = (i / 2 - l / n * a) / Math.sin(h), | ||||
|                 f = P.PlotUtils.getThirdPoint(t[p - 1], t[p], Math.PI - h, d, !0), | ||||
|                 E = P.PlotUtils.getThirdPoint(t[p - 1], t[p], h, d, !1); | ||||
|             u.push(f), | ||||
|                 c.push(E) | ||||
|         } | ||||
|         return u.concat(c) | ||||
|     }, | ||||
|     xp.algorithm.getTempPoint4 = function (t, o, e) { | ||||
|         var r, n, g, i, s = P.PlotUtils.mid(t, o), | ||||
|             a = P.PlotUtils.distance(s, e), | ||||
|             l = P.PlotUtils.getAngleOfThreePoints(t, s, e); | ||||
|         return l < P.Constants.HALF_PI ? (n = a * Math.sin(l), g = a * Math.cos(l), i = P.PlotUtils.getThirdPoint(t, s, P.Constants.HALF_PI, n, !1), r = P.PlotUtils.getThirdPoint(s, i, P.Constants.HALF_PI, g, !0)) : l >= P.Constants.HALF_PI && l < Math.PI ? (n = a * Math.sin(Math.PI - l), g = a * Math.cos(Math.PI - l), i = P.PlotUtils.getThirdPoint(t, s, P.Constants.HALF_PI, n, !1), r = P.PlotUtils.getThirdPoint(s, i, P.Constants.HALF_PI, g, !1)) : l >= Math.PI && l < 1.5 * Math.PI ? (n = a * Math.sin(l - Math.PI), g = a * Math.cos(l - Math.PI), i = P.PlotUtils.getThirdPoint(t, s, P.Constants.HALF_PI, n, !0), r = P.PlotUtils.getThirdPoint(s, i, P.Constants.HALF_PI, g, !0)) : (n = a * Math.sin(2 * Math.PI - l), g = a * Math.cos(2 * Math.PI - l), i = P.PlotUtils.getThirdPoint(t, s, P.Constants.HALF_PI, n, !0), r = P.PlotUtils.getThirdPoint(s, i, P.Constants.HALF_PI, g, !1)), | ||||
|             r | ||||
|     }, | ||||
|     xp.algorithm.tailedAttackArrow = function (inputPoint) { | ||||
|         inputPoint = xp.algorithm.dereplication(inputPoint); | ||||
|         this.tailWidthFactor = tailedAttackArrowDefualParam.tailWidthFactor; | ||||
|         this.swallowTailFactor = tailedAttackArrowDefualParam.swallowTailFactor; | ||||
|         this.swallowTailPnt = tailedAttackArrowDefualParam.swallowTailPnt; | ||||
|         //控制点 | ||||
|         var result = { | ||||
|             controlPoint: null, | ||||
|             polygonalPoint: null | ||||
|         }; | ||||
|         result.controlPoint = inputPoint; | ||||
|         var t = inputPoint.length; | ||||
|         if (!(2 > t)) { | ||||
|             if (2 == inputPoint.length) { | ||||
|                 result.polygonalPoint = inputPoint; | ||||
|                 return result; | ||||
|             } | ||||
|             var o = inputPoint, | ||||
|                 e = o[0], | ||||
|                 r = o[1]; | ||||
|             P.PlotUtils.isClockWise(o[0], o[1], o[2]) && (e = o[1], r = o[0]); | ||||
|             var n = P.PlotUtils.mid(e, r), | ||||
|                 g = [n].concat(o.slice(2)), | ||||
|                 i = xp.algorithm.getAttackArrowHeadPoints(g, e, r, tailedAttackArrowDefualParam), | ||||
|                 s = i[0], | ||||
|                 a = i[4], | ||||
|                 l = P.PlotUtils.distance(e, r), | ||||
|                 u = P.PlotUtils.getBaseLength(g), | ||||
|                 c = u * this.tailWidthFactor * this.swallowTailFactor; | ||||
|             this.swallowTailPnt = P.PlotUtils.getThirdPoint(g[1], g[0], 0, c, !0); | ||||
|             var p = l / u, | ||||
|                 h = xp.algorithm.getAttackArrowBodyPoints(g, s, a, p), | ||||
|                 t = h.length, | ||||
|                 d = [e].concat(h.slice(0, t / 2)); | ||||
|             d.push(s); | ||||
|             var f = [r].concat(h.slice(t / 2, t)); | ||||
|             var newArray = []; | ||||
|             f.push(a), | ||||
|                 d = P.PlotUtils.getQBSplinePoints(d), | ||||
|                 f = P.PlotUtils.getQBSplinePoints(f), | ||||
|                 newArray = xp.algorithm.array2Dto1D(d.concat(i, f.reverse(), [this.swallowTailPnt, d[0]])); | ||||
|             result.polygonalPoint = Cesium.Cartesian3.fromDegreesArray(newArray); | ||||
|         } | ||||
|         return result; | ||||
|     }, | ||||
|     xp.algorithm.getAttackArrowHeadPoints = function (t, o, e, defaultParam) { | ||||
|         this.headHeightFactor = defaultParam.headHeightFactor; | ||||
|         this.headTailFactor = defaultParam.headTailFactor; | ||||
|         this.headWidthFactor = defaultParam.headWidthFactor; | ||||
|         this.neckWidthFactor = defaultParam.neckWidthFactor; | ||||
|         this.neckHeightFactor = defaultParam.neckHeightFactor; | ||||
|         var r = P.PlotUtils.getBaseLength(t), | ||||
|             n = r * this.headHeightFactor, | ||||
|             g = t[t.length - 1]; | ||||
|         r = P.PlotUtils.distance(g, t[t.length - 2]); | ||||
|         var i = P.PlotUtils.distance(o, e); | ||||
|         n > i * this.headTailFactor && (n = i * this.headTailFactor); | ||||
|         var s = n * this.headWidthFactor, | ||||
|             a = n * this.neckWidthFactor; | ||||
|         n = n > r ? r : n; | ||||
|         var l = n * this.neckHeightFactor, | ||||
|             u = P.PlotUtils.getThirdPoint(t[t.length - 2], g, 0, n, !0), | ||||
|             c = P.PlotUtils.getThirdPoint(t[t.length - 2], g, 0, l, !0), | ||||
|             p = P.PlotUtils.getThirdPoint(g, u, P.Constants.HALF_PI, s, !1), | ||||
|             h = P.PlotUtils.getThirdPoint(g, u, P.Constants.HALF_PI, s, !0), | ||||
|             d = P.PlotUtils.getThirdPoint(g, c, P.Constants.HALF_PI, a, !1), | ||||
|             f = P.PlotUtils.getThirdPoint(g, c, P.Constants.HALF_PI, a, !0); | ||||
|         return [d, p, g, h, f] | ||||
|     }, | ||||
|     xp.algorithm.getAttackArrowBodyPoints = function (t, o, e, r) { | ||||
|         for (var n = P.PlotUtils.wholeDistance(t), g = P.PlotUtils.getBaseLength(t), i = g * r, s = P.PlotUtils.distance(o, e), a = (i - s) / 2, l = 0, u = [], c = [], p = 1; p < t.length - 1; p++) { | ||||
|             var h = P.PlotUtils.getAngleOfThreePoints(t[p - 1], t[p], t[p + 1]) / 2; | ||||
|             l += P.PlotUtils.distance(t[p - 1], t[p]); | ||||
|             var d = (i / 2 - l / n * a) / Math.sin(h), | ||||
|                 f = P.PlotUtils.getThirdPoint(t[p - 1], t[p], Math.PI - h, d, !0), | ||||
|                 E = P.PlotUtils.getThirdPoint(t[p - 1], t[p], h, d, !1); | ||||
|             u.push(f), | ||||
|                 c.push(E) | ||||
|         } | ||||
|         return u.concat(c) | ||||
|     }, | ||||
|     xp.algorithm.dereplication = function (array) { | ||||
|         var last = array[array.length - 1]; | ||||
|         var change = false; | ||||
|         var newArray = []; | ||||
|         newArray = array.filter(function (i) { | ||||
|             if (i[0] != last[0] && i[1] != last[1]) { | ||||
|                 return i; | ||||
|             } | ||||
|             change = true; | ||||
|         }); | ||||
|         if (change) newArray.push(last); | ||||
|         return newArray; | ||||
|     }, | ||||
|     xp.algorithm.fineArrow = function (tailPoint, headerPoint) { | ||||
|         if ((tailPoint.length < 2) || (headerPoint.length < 2)) return; | ||||
|         //画箭头的函数 | ||||
|         let tailWidthFactor = fineArrowDefualParam.tailWidthFactor; | ||||
|         let neckWidthFactor = fineArrowDefualParam.neckWidthFactor; | ||||
|         let headWidthFactor = fineArrowDefualParam.headWidthFactor; | ||||
|         let headAngle = fineArrowDefualParam.headAngle; | ||||
|         let neckAngle = fineArrowDefualParam.neckAngle; | ||||
|         var o = []; | ||||
|         o[0] = tailPoint; | ||||
|         o[1] = headerPoint; | ||||
|         e = o[0], | ||||
|             r = o[1], | ||||
|             n = P.PlotUtils.getBaseLength(o), | ||||
|             g = n * tailWidthFactor, | ||||
|             //尾部宽度因子 | ||||
|             i = n * neckWidthFactor, | ||||
|             //脖子宽度银子 | ||||
|             s = n * headWidthFactor, | ||||
|             //头部宽度因子 | ||||
|             a = P.PlotUtils.getThirdPoint(r, e, P.Constants.HALF_PI, g, !0), | ||||
|             l = P.PlotUtils.getThirdPoint(r, e, P.Constants.HALF_PI, g, !1), | ||||
|             u = P.PlotUtils.getThirdPoint(e, r, headAngle, s, !1), | ||||
|             c = P.PlotUtils.getThirdPoint(e, r, headAngle, s, !0), | ||||
|             p = P.PlotUtils.getThirdPoint(e, r, neckAngle, i, !1), | ||||
|             h = P.PlotUtils.getThirdPoint(e, r, neckAngle, i, !0), | ||||
|             d = []; | ||||
|         d.push(a[0], a[1], p[0], p[1], u[0], u[1], r[0], r[1], c[0], c[1], h[0], h[1], l[0], l[1], e[0], e[1]); | ||||
|         return Cesium.Cartesian3.fromDegreesArray(d); | ||||
|     } | ||||
							
								
								
									
										207
									
								
								public/sdk/arrow/plotUtil.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								public/sdk/arrow/plotUtil.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,207 @@ | ||||
| var P = {version: "1.0.0"} | ||||
| P.PlotUtils = {}, P.PlotUtils.distance = function (t, o) { | ||||
|     return Math.sqrt(Math.pow(t[0] - o[0], 2) + Math.pow(t[1] - o[1], 2)) | ||||
| }, P.PlotUtils.wholeDistance = function (t) { | ||||
|     for (var o = 0, e = 0; e < t.length - 1; e++) o += P.PlotUtils.distance(t[e], t[e + 1]); | ||||
|     return o | ||||
| }, P.PlotUtils.getBaseLength = function (t) { | ||||
|     return Math.pow(P.PlotUtils.wholeDistance(t), .99) | ||||
| }, P.PlotUtils.mid = function (t, o) { | ||||
|     return [(t[0] + o[0]) / 2, (t[1] + o[1]) / 2] | ||||
| }, P.PlotUtils.getCircleCenterOfThreePoints = function (t, o, e) { | ||||
|     var r = [(t[0] + o[0]) / 2, (t[1] + o[1]) / 2], | ||||
|         n = [r[0] - t[1] + o[1], r[1] + t[0] - o[0]], | ||||
|         g = [(t[0] + e[0]) / 2, (t[1] + e[1]) / 2], | ||||
|         i = [g[0] - t[1] + e[1], g[1] + t[0] - e[0]]; | ||||
|     return P.PlotUtils.getIntersectPoint(r, n, g, i) | ||||
| }, P.PlotUtils.getIntersectPoint = function (t, o, e, r) { | ||||
|     if (t[1] == o[1]) { | ||||
|         var n = (r[0] - e[0]) / (r[1] - e[1]), | ||||
|             g = n * (t[1] - e[1]) + e[0], | ||||
|             i = t[1]; | ||||
|         return [g, i] | ||||
|     } | ||||
|     if (e[1] == r[1]) { | ||||
|         var s = (o[0] - t[0]) / (o[1] - t[1]); | ||||
|         return g = s * (e[1] - t[1]) + t[0], i = e[1], [g, i] | ||||
|     } | ||||
|     return s = (o[0] - t[0]) / (o[1] - t[1]), n = (r[0] - e[0]) / (r[1] - e[1]), i = (s * t[1] - t[0] - n * e[1] + e[0]) / (s - n), g = s * i - s * t[1] + t[0], [g, i] | ||||
| }, P.PlotUtils.getAzimuth = function (t, o) { | ||||
|     var e, r = Math.asin(Math.abs(o[1] - t[1]) / P.PlotUtils.distance(t, o)); | ||||
|     return o[1] >= t[1] && o[0] >= t[0] ? e = r + Math.PI : o[1] >= t[1] && o[0] < t[0] ? e = P.Constants.TWO_PI - r : o[1] < t[1] && o[0] < t[0] ? e = r : o[1] < t[1] && o[0] >= t[0] && (e = Math.PI - r), e | ||||
| }, P.PlotUtils.getAngleOfThreePoints = function (t, o, e) { | ||||
|     var r = P.PlotUtils.getAzimuth(o, t) - P.PlotUtils.getAzimuth(o, e); | ||||
|     return 0 > r ? r + P.Constants.TWO_PI : r | ||||
| }, P.PlotUtils.isClockWise = function (t, o, e) { | ||||
|     return (e[1] - t[1]) * (o[0] - t[0]) > (o[1] - t[1]) * (e[0] - t[0]) | ||||
| }, P.PlotUtils.getPointOnLine = function (t, o, e) { | ||||
|     var r = o[0] + t * (e[0] - o[0]), | ||||
|         n = o[1] + t * (e[1] - o[1]); | ||||
|     return [r, n] | ||||
| }, P.PlotUtils.getCubicValue = function (t, o, e, r, n) { | ||||
|     t = Math.max(Math.min(t, 1), 0); | ||||
|     var g = 1 - t, | ||||
|         i = t * t, | ||||
|         s = i * t, | ||||
|         a = g * g, | ||||
|         l = a * g, | ||||
|         u = l * o[0] + 3 * a * t * e[0] + 3 * g * i * r[0] + s * n[0], | ||||
|         c = l * o[1] + 3 * a * t * e[1] + 3 * g * i * r[1] + s * n[1]; | ||||
|     return [u, c] | ||||
| }, P.PlotUtils.getThirdPoint = function (t, o, e, r, n) { | ||||
|     var g = P.PlotUtils.getAzimuth(t, o), | ||||
|         i = n ? g + e : g - e, | ||||
|         s = r * Math.cos(i), | ||||
|         a = r * Math.sin(i); | ||||
|     return [o[0] + s, o[1] + a] | ||||
| }, P.PlotUtils.getArcPoints = function (t, o, e, r) { | ||||
|     var n, g, i = [], | ||||
|         s = r - e; | ||||
|     s = 0 > s ? s + P.Constants.TWO_PI : s; | ||||
|     for (var a = 0; a <= P.Constants.FITTING_COUNT; a++) { | ||||
|         var l = e + s * a / P.Constants.FITTING_COUNT; | ||||
|         n = t[0] + o * Math.cos(l), g = t[1] + o * Math.sin(l), i.push([n, g]) | ||||
|     } | ||||
|     return i | ||||
| }, P.PlotUtils.getBisectorNormals = function (t, o, e, r) { | ||||
|     var n = P.PlotUtils.getNormal(o, e, r), | ||||
|         g = Math.sqrt(n[0] * n[0] + n[1] * n[1]), | ||||
|         i = n[0] / g, | ||||
|         s = n[1] / g, | ||||
|         a = P.PlotUtils.distance(o, e), | ||||
|         l = P.PlotUtils.distance(e, r); | ||||
|     if (g > P.Constants.ZERO_TOLERANCE) if (P.PlotUtils.isClockWise(o, e, r)) { | ||||
|         var u = t * a, | ||||
|             c = e[0] - u * s, | ||||
|             p = e[1] + u * i, | ||||
|             h = [c, p]; | ||||
|         u = t * l, c = e[0] + u * s, p = e[1] - u * i; | ||||
|         var d = [c, p] | ||||
|     } else u = t * a, c = e[0] + u * s, p = e[1] - u * i, h = [c, p], u = t * l, c = e[0] - u * s, p = e[1] + u * i, d = [c, p]; | ||||
|     else c = e[0] + t * (o[0] - e[0]), p = e[1] + t * (o[1] - e[1]), h = [c, p], c = e[0] + t * (r[0] - e[0]), p = e[1] + t * (r[1] - e[1]), d = [c, p]; | ||||
|     return [h, d] | ||||
| }, P.PlotUtils.getNormal = function (t, o, e) { | ||||
|     var r = t[0] - o[0], | ||||
|         n = t[1] - o[1], | ||||
|         g = Math.sqrt(r * r + n * n); | ||||
|     r /= g, n /= g; | ||||
|     var i = e[0] - o[0], | ||||
|         s = e[1] - o[1], | ||||
|         a = Math.sqrt(i * i + s * s); | ||||
|     i /= a, s /= a; | ||||
|     var l = r + i, | ||||
|         u = n + s; | ||||
|     return [l, u] | ||||
| }, P.PlotUtils.getCurvePoints = function (t, o) { | ||||
|     for (var e = P.PlotUtils.getLeftMostControlPoint(o), r = [e], n = 0; n < o.length - 2; n++) { | ||||
|         var g = o[n], | ||||
|             i = o[n + 1], | ||||
|             s = o[n + 2], | ||||
|             a = P.PlotUtils.getBisectorNormals(t, g, i, s); | ||||
|         r = r.concat(a) | ||||
|     } | ||||
|     var l = P.PlotUtils.getRightMostControlPoint(o); | ||||
|     r.push(l); | ||||
|     var u = []; | ||||
|     for (n = 0; n < o.length - 1; n++) { | ||||
|         g = o[n], i = o[n + 1], u.push(g); | ||||
|         for (var t = 0; t < P.Constants.FITTING_COUNT; t++) { | ||||
|             var c = P.PlotUtils.getCubicValue(t / P.Constants.FITTING_COUNT, g, r[2 * n], r[2 * n + 1], i); | ||||
|             u.push(c) | ||||
|         } | ||||
|         u.push(i) | ||||
|     } | ||||
|     return u | ||||
| }, P.PlotUtils.getLeftMostControlPoint = function (o) { | ||||
|     var e = o[0], | ||||
|         r = o[1], | ||||
|         n = o[2], | ||||
|         g = P.PlotUtils.getBisectorNormals(0, e, r, n), | ||||
|         i = g[0], | ||||
|         s = P.PlotUtils.getNormal(e, r, n), | ||||
|         a = Math.sqrt(s[0] * s[0] + s[1] * s[1]); | ||||
|     if (a > P.Constants.ZERO_TOLERANCE) var l = P.PlotUtils.mid(e, r), | ||||
|         u = e[0] - l[0], | ||||
|         c = e[1] - l[1], | ||||
|         p = P.PlotUtils.distance(e, r), | ||||
|         h = 2 / p, | ||||
|         d = -h * c, | ||||
|         f = h * u, | ||||
|         E = d * d - f * f, | ||||
|         v = 2 * d * f, | ||||
|         A = f * f - d * d, | ||||
|         _ = i[0] - l[0], | ||||
|         y = i[1] - l[1], | ||||
|         m = l[0] + E * _ + v * y, | ||||
|         O = l[1] + v * _ + A * y; | ||||
|     else m = e[0] + t * (r[0] - e[0]), O = e[1] + t * (r[1] - e[1]); | ||||
|     return [m, O] | ||||
| }, P.PlotUtils.getRightMostControlPoint = function (o) { | ||||
|     var e = o.length, | ||||
|         r = o[e - 3], | ||||
|         n = o[e - 2], | ||||
|         g = o[e - 1], | ||||
|         i = P.PlotUtils.getBisectorNormals(0, r, n, g), | ||||
|         s = i[1], | ||||
|         a = P.PlotUtils.getNormal(r, n, g), | ||||
|         l = Math.sqrt(a[0] * a[0] + a[1] * a[1]); | ||||
|     if (l > P.Constants.ZERO_TOLERANCE) var u = P.PlotUtils.mid(n, g), | ||||
|         c = g[0] - u[0], | ||||
|         p = g[1] - u[1], | ||||
|         h = P.PlotUtils.distance(n, g), | ||||
|         d = 2 / h, | ||||
|         f = -d * p, | ||||
|         E = d * c, | ||||
|         v = f * f - E * E, | ||||
|         A = 2 * f * E, | ||||
|         _ = E * E - f * f, | ||||
|         y = s[0] - u[0], | ||||
|         m = s[1] - u[1], | ||||
|         O = u[0] + v * y + A * m, | ||||
|         T = u[1] + A * y + _ * m; | ||||
|     else O = g[0] + t * (n[0] - g[0]), T = g[1] + t * (n[1] - g[1]); | ||||
|     return [O, T] | ||||
| }, P.PlotUtils.getBezierPoints = function (t) { | ||||
|     if (t.length <= 2) return t; | ||||
|     for (var o = [], e = t.length - 1, r = 0; 1 >= r; r += .01) { | ||||
|         for (var n = y = 0, g = 0; e >= g; g++) { | ||||
|             var i = P.PlotUtils.getBinomialFactor(e, g), | ||||
|                 s = Math.pow(r, g), | ||||
|                 a = Math.pow(1 - r, e - g); | ||||
|             n += i * s * a * t[g][0], y += i * s * a * t[g][1] | ||||
|         } | ||||
|         o.push([n, y]) | ||||
|     } | ||||
|     return o.push(t[e]), o | ||||
| }, P.PlotUtils.getBinomialFactor = function (t, o) { | ||||
|     return P.PlotUtils.getFactorial(t) / (P.PlotUtils.getFactorial(o) * P.PlotUtils.getFactorial(t - o)) | ||||
| }, P.PlotUtils.getFactorial = function (t) { | ||||
|     if (1 >= t) return 1; | ||||
|     if (2 == t) return 2; | ||||
|     if (3 == t) return 6; | ||||
|     if (4 == t) return 24; | ||||
|     if (5 == t) return 120; | ||||
|     for (var o = 1, e = 1; t >= e; e++) o *= e; | ||||
|     return o | ||||
| }, P.PlotUtils.getQBSplinePoints = function (t) { | ||||
|     if (t.length <= 2) return t; | ||||
|     var o = 2, | ||||
|         e = [], | ||||
|         r = t.length - o - 1; | ||||
|     e.push(t[0]); | ||||
|     for (var n = 0; r >= n; n++) for (var g = 0; 1 >= g; g += .05) { | ||||
|         for (var i = y = 0, s = 0; o >= s; s++) { | ||||
|             var a = P.PlotUtils.getQuadricBSplineFactor(s, g); | ||||
|             i += a * t[n + s][0], y += a * t[n + s][1] | ||||
|         } | ||||
|         e.push([i, y]) | ||||
|     } | ||||
|     return e.push(t[t.length - 1]), e | ||||
| }, P.PlotUtils.getQuadricBSplineFactor = function (t, o) { | ||||
|     return 0 == t ? Math.pow(o - 1, 2) / 2 : 1 == t ? (-2 * Math.pow(o, 2) + 2 * o + 1) / 2 : 2 == t ? Math.pow(o, 2) / 2 : 0 | ||||
| }, P.Constants = { | ||||
|     TWO_PI: 2 * Math.PI, | ||||
|     HALF_PI: Math.PI / 2, | ||||
|     FITTING_COUNT: 100, | ||||
|     ZERO_TOLERANCE: 1e-4 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user