1 /* 2 Copyright 2008-2024 3 Matthias Ehmann, 4 Michael Gerhaeuser, 5 Carsten Miller, 6 Bianca Valentin, 7 Alfred Wassermann, 8 Peter Wilfahrt 9 10 This file is part of JSXGraph. 11 12 JSXGraph is free software dual licensed under the GNU LGPL or MIT License. 13 14 You can redistribute it and/or modify it under the terms of the 15 16 * GNU Lesser General Public License as published by 17 the Free Software Foundation, either version 3 of the License, or 18 (at your option) any later version 19 OR 20 * MIT License: https://github.com/jsxgraph/jsxgraph/blob/master/LICENSE.MIT 21 22 JSXGraph is distributed in the hope that it will be useful, 23 but WITHOUT ANY WARRANTY; without even the implied warranty of 24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 GNU Lesser General Public License for more details. 26 27 You should have received a copy of the GNU Lesser General Public License and 28 the MIT License along with JSXGraph. If not, see <https://www.gnu.org/licenses/> 29 and <https://opensource.org/licenses/MIT/>. 30 */ 31 32 /*global JXG: true, define: true, html_sanitize: true*/ 33 /*jslint nomen: true, plusplus: true*/ 34 35 /** 36 * @fileoverview expect.js provides utilities for parameter magic by normalizing multi-type parameters. 37 */ 38 39 import JXG from "../jxg.js"; 40 import Type from "./type.js"; 41 import Const from "../base/constants.js"; 42 import Coords from "../base/coords.js"; 43 44 /** 45 * The JXG.Expect namespace provides method to normalize access on coordinates, 46 * i.e. provides utilities for parameter magic by normalizing multi-type parameters. 47 * @namespace 48 */ 49 JXG.Expect = { 50 /** 51 * Apply an expect method on every element of an array. 52 * 53 * @param {Array} a 54 * @param {function} format 55 * @param {Boolean} [copy=false] 56 * 57 * @returns {Array} 58 */ 59 each: function (a, format, copy) { 60 var i, 61 len, 62 r = []; 63 64 if (Type.exists(a.length)) { 65 len = a.length; 66 for (i = 0; i < len; i++) { 67 r.push(format.call(this, a[i], copy)); 68 } 69 } 70 71 return r; 72 }, 73 74 /** 75 * Normalize points and coord objects into a coord object. 76 * 77 * @param {JXG.Point|JXG.Coords} c 78 * @param {Boolean} [copy=false] Return a copy, not a reference 79 * 80 * @returns {JXG.Coords} 81 */ 82 coords: function (c, copy) { 83 var coord = c; 84 85 if (c && c.elementClass === Const.OBJECT_CLASS_POINT) { 86 coord = c.coords; 87 } else if (c.usrCoords && c.scrCoords && c.usr2screen) { 88 coord = c; 89 } 90 91 if (copy) { 92 coord = new Coords(Const.COORDS_BY_USER, coord.usrCoords, coord.board); 93 } 94 95 return coord; 96 }, 97 98 /** 99 * Normalize points, coordinate arrays and coord objects into a coordinate array. 100 * 101 * @param {JXG.Point|JXG.Coords|Array} c 102 * @param {Boolean} [copy=false] Return a copy, not a reference 103 * 104 * @returns {Array} Homogeneous coordinates 105 */ 106 coordsArray: function (c, copy) { 107 var coord; 108 109 if (!Type.isArray(c)) { 110 coord = this.coords(c).usrCoords; 111 } else { 112 coord = c; 113 } 114 115 if (coord.length < 3) { 116 coord.unshift(1); 117 } 118 119 if (copy) { 120 coord = [coord[0], coord[1], coord[2]]; 121 } 122 123 return coord; 124 } 125 }; 126 127 export default JXG.Expect; 128