Best Python code snippet using localstack_python
geo.py
Source:geo.py  
...57        Axes.set_xlim(self, -np.pi, np.pi)58        Axes.set_ylim(self, -np.pi / 2.0, np.pi / 2.0)59    def _set_lim_and_transforms(self):60        # A (possibly non-linear) projection on the (already scaled) data61        self.transProjection = self._get_core_transform(self.RESOLUTION)62        self.transAffine = self._get_affine_transform()63        self.transAxes = BboxTransformTo(self.bbox)64        # The complete data transformation stack -- from data all the65        # way to display coordinates66        self.transData = \67            self.transProjection + \68            self.transAffine + \69            self.transAxes70        # This is the transform for longitude ticks.71        self._xaxis_pretransform = \72            Affine2D() \73            .scale(1.0, self._longitude_cap * 2.0) \74            .translate(0.0, -self._longitude_cap)75        self._xaxis_transform = \76            self._xaxis_pretransform + \77            self.transData78        self._xaxis_text1_transform = \79            Affine2D().scale(1.0, 0.0) + \80            self.transData + \81            Affine2D().translate(0.0, 4.0)82        self._xaxis_text2_transform = \83            Affine2D().scale(1.0, 0.0) + \84            self.transData + \85            Affine2D().translate(0.0, -4.0)86        # This is the transform for latitude ticks.87        yaxis_stretch = Affine2D().scale(np.pi * 2.0, 1.0).translate(-np.pi, 0.0)88        yaxis_space = Affine2D().scale(1.0, 1.1)89        self._yaxis_transform = \90            yaxis_stretch + \91            self.transData92        yaxis_text_base = \93            yaxis_stretch + \94            self.transProjection + \95            (yaxis_space + \96             self.transAffine + \97             self.transAxes)98        self._yaxis_text1_transform = \99            yaxis_text_base + \100            Affine2D().translate(-8.0, 0.0)101        self._yaxis_text2_transform = \102            yaxis_text_base + \103            Affine2D().translate(8.0, 0.0)104    def _get_affine_transform(self):105        transform = self._get_core_transform(1)106        xscale, _ = transform.transform_point((np.pi, 0))107        _, yscale = transform.transform_point((0, np.pi / 2.0))108        return Affine2D() \109            .scale(0.5 / xscale, 0.5 / yscale) \110            .translate(0.5, 0.5)111    def get_xaxis_transform(self,which='grid'):112        if which not in ['tick1','tick2','grid']:113            msg = "'which' must be on of [ 'tick1' | 'tick2' | 'grid' ]"114            raise ValueError(msg)115        return self._xaxis_transform116    def get_xaxis_text1_transform(self, pad):117        return self._xaxis_text1_transform, 'bottom', 'center'118    def get_xaxis_text2_transform(self, pad):119        return self._xaxis_text2_transform, 'top', 'center'120    def get_yaxis_transform(self,which='grid'):121        if which not in ['tick1','tick2','grid']:122            msg = "'which' must be one of [ 'tick1' | 'tick2' | 'grid' ]"123            raise ValueError(msg)124        return self._yaxis_transform125    def get_yaxis_text1_transform(self, pad):126        return self._yaxis_text1_transform, 'center', 'right'127    def get_yaxis_text2_transform(self, pad):128        return self._yaxis_text2_transform, 'center', 'left'129    def _gen_axes_patch(self):130        return Circle((0.5, 0.5), 0.5)131    def _gen_axes_spines(self):132        return {'geo':mspines.Spine.circular_spine(self,133                                                   (0.5, 0.5), 0.5)}134    def set_yscale(self, *args, **kwargs):135        if args[0] != 'linear':136            raise NotImplementedError137    set_xscale = set_yscale138    def set_xlim(self, *args, **kwargs):139        raise TypeError("It is not possible to change axes limits "140                        "for geographic projections. Please consider "141                        "using Basemap or Cartopy.")142    set_ylim = set_xlim143    def format_coord(self, lon, lat):144        'return a format string formatting the coordinate'145        lon = lon * (180.0 / np.pi)146        lat = lat * (180.0 / np.pi)147        if lat >= 0.0:148            ns = 'N'149        else:150            ns = 'S'151        if lon >= 0.0:152            ew = 'E'153        else:154            ew = 'W'155        return '%f\u00b0%s, %f\u00b0%s' % (abs(lat), ns, abs(lon), ew)156    def set_longitude_grid(self, degrees):157        """158        Set the number of degrees between each longitude grid.159        """160        number = (360.0 / degrees) + 1161        self.xaxis.set_major_locator(162            FixedLocator(163                np.linspace(-np.pi, np.pi, number, True)[1:-1]))164        self._logitude_degrees = degrees165        self.xaxis.set_major_formatter(self.ThetaFormatter(degrees))166    def set_latitude_grid(self, degrees):167        """168        Set the number of degrees between each longitude grid.169        """170        number = (180.0 / degrees) + 1171        self.yaxis.set_major_locator(172            FixedLocator(173                np.linspace(-np.pi / 2.0, np.pi / 2.0, number, True)[1:-1]))174        self._latitude_degrees = degrees175        self.yaxis.set_major_formatter(self.ThetaFormatter(degrees))176    def set_longitude_grid_ends(self, degrees):177        """178        Set the latitude(s) at which to stop drawing the longitude grids.179        """180        self._longitude_cap = degrees * (np.pi / 180.0)181        self._xaxis_pretransform \182            .clear() \183            .scale(1.0, self._longitude_cap * 2.0) \184            .translate(0.0, -self._longitude_cap)185    def get_data_ratio(self):186        '''187        Return the aspect ratio of the data itself.188        '''189        return 1.0190    ### Interactive panning191    def can_zoom(self):192        """193        Return *True* if this axes supports the zoom box button functionality.194        This axes object does not support interactive zoom box.195        """196        return False197    def can_pan(self) :198        """199        Return *True* if this axes supports the pan/zoom button functionality.200        This axes object does not support interactive pan/zoom.201        """202        return False203    def start_pan(self, x, y, button):204        pass205    def end_pan(self):206        pass207    def drag_pan(self, button, key, x, y):208        pass209class AitoffAxes(GeoAxes):210    name = 'aitoff'211    class AitoffTransform(Transform):212        """213        The base Aitoff transform.214        """215        input_dims = 2216        output_dims = 2217        is_separable = False218        def __init__(self, resolution):219            """220            Create a new Aitoff transform.  Resolution is the number of steps221            to interpolate between each input line segment to approximate its222            path in curved Aitoff space.223            """224            Transform.__init__(self)225            self._resolution = resolution226        def transform_non_affine(self, ll):227            longitude = ll[:, 0:1]228            latitude  = ll[:, 1:2]229            # Pre-compute some values230            half_long = longitude / 2.0231            cos_latitude = np.cos(latitude)232            alpha = np.arccos(cos_latitude * np.cos(half_long))233            # Mask this array or we'll get divide-by-zero errors234            alpha = ma.masked_where(alpha == 0.0, alpha)235            # The numerators also need to be masked so that masked236            # division will be invoked.237            # We want unnormalized sinc.  numpy.sinc gives us normalized238            sinc_alpha = ma.sin(alpha) / alpha239            x = (cos_latitude * ma.sin(half_long)) / sinc_alpha240            y = (ma.sin(latitude) / sinc_alpha)241            return np.concatenate((x.filled(0), y.filled(0)), 1)242        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__243        def transform_path_non_affine(self, path):244            vertices = path.vertices245            ipath = path.interpolated(self._resolution)246            return Path(self.transform(ipath.vertices), ipath.codes)247        transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__248        def inverted(self):249            return AitoffAxes.InvertedAitoffTransform(self._resolution)250        inverted.__doc__ = Transform.inverted.__doc__251    class InvertedAitoffTransform(Transform):252        input_dims = 2253        output_dims = 2254        is_separable = False255        def __init__(self, resolution):256            Transform.__init__(self)257            self._resolution = resolution258        def transform_non_affine(self, xy):259            # MGDTODO: Math is hard ;(260            return xy261        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__262        def inverted(self):263            return AitoffAxes.AitoffTransform(self._resolution)264        inverted.__doc__ = Transform.inverted.__doc__265    def __init__(self, *args, **kwargs):266        self._longitude_cap = np.pi / 2.0267        GeoAxes.__init__(self, *args, **kwargs)268        self.set_aspect(0.5, adjustable='box', anchor='C')269        self.cla()270    def _get_core_transform(self, resolution):271        return self.AitoffTransform(resolution)272class HammerAxes(GeoAxes):273    name = 'hammer'274    class HammerTransform(Transform):275        """276        The base Hammer transform.277        """278        input_dims = 2279        output_dims = 2280        is_separable = False281        def __init__(self, resolution):282            """283            Create a new Hammer transform.  Resolution is the number of steps284            to interpolate between each input line segment to approximate its285            path in curved Hammer space.286            """287            Transform.__init__(self)288            self._resolution = resolution289        def transform_non_affine(self, ll):290            longitude = ll[:, 0:1]291            latitude  = ll[:, 1:2]292            # Pre-compute some values293            half_long = longitude / 2.0294            cos_latitude = np.cos(latitude)295            sqrt2 = np.sqrt(2.0)296            alpha = np.sqrt(1.0 + cos_latitude * np.cos(half_long))297            x = (2.0 * sqrt2) * (cos_latitude * np.sin(half_long)) / alpha298            y = (sqrt2 * np.sin(latitude)) / alpha299            return np.concatenate((x, y), 1)300        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__301        def transform_path_non_affine(self, path):302            vertices = path.vertices303            ipath = path.interpolated(self._resolution)304            return Path(self.transform(ipath.vertices), ipath.codes)305        transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__306        def inverted(self):307            return HammerAxes.InvertedHammerTransform(self._resolution)308        inverted.__doc__ = Transform.inverted.__doc__309    class InvertedHammerTransform(Transform):310        input_dims = 2311        output_dims = 2312        is_separable = False313        def __init__(self, resolution):314            Transform.__init__(self)315            self._resolution = resolution316        def transform_non_affine(self, xy):317            x = xy[:, 0:1]318            y = xy[:, 1:2]319            quarter_x = 0.25 * x320            half_y = 0.5 * y321            z = np.sqrt(1.0 - quarter_x*quarter_x - half_y*half_y)322            longitude = 2 * np.arctan((z*x) / (2.0 * (2.0*z*z - 1.0)))323            latitude = np.arcsin(y*z)324            return np.concatenate((longitude, latitude), 1)325        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__326        def inverted(self):327            return HammerAxes.HammerTransform(self._resolution)328        inverted.__doc__ = Transform.inverted.__doc__329    def __init__(self, *args, **kwargs):330        self._longitude_cap = np.pi / 2.0331        GeoAxes.__init__(self, *args, **kwargs)332        self.set_aspect(0.5, adjustable='box', anchor='C')333        self.cla()334    def _get_core_transform(self, resolution):335        return self.HammerTransform(resolution)336class MollweideAxes(GeoAxes):337    name = 'mollweide'338    class MollweideTransform(Transform):339        """340        The base Mollweide transform.341        """342        input_dims = 2343        output_dims = 2344        is_separable = False345        def __init__(self, resolution):346            """347            Create a new Mollweide transform.  Resolution is the number of steps348            to interpolate between each input line segment to approximate its349            path in curved Mollweide space.350            """351            Transform.__init__(self)352            self._resolution = resolution353        def transform_non_affine(self, ll):354            def d(theta):355                delta = -(theta + np.sin(theta) - pi_sin_l) / (1 + np.cos(theta))356                return delta, np.abs(delta) > 0.001357            longitude = ll[:, 0]358            latitude  = ll[:, 1]359            clat = np.pi/2 - np.abs(latitude)360            ihigh = clat < 0.087 # within 5 degrees of the poles361            ilow = ~ihigh362            aux = np.empty(latitude.shape, dtype=np.float)363            if ilow.any():  # Newton-Raphson iteration364                pi_sin_l = np.pi * np.sin(latitude[ilow])365                theta = 2.0 * latitude[ilow]366                delta, large_delta = d(theta)367                while np.any(large_delta):368                    theta[large_delta] += delta[large_delta]369                    delta, large_delta = d(theta)370                aux[ilow] = theta / 2371            if ihigh.any(): # Taylor series-based approx. solution372                e = clat[ihigh]373                d = 0.5 * (3 * np.pi * e**2) ** (1.0/3)374                aux[ihigh] = (np.pi/2 - d) * np.sign(latitude[ihigh])375            xy = np.empty(ll.shape, dtype=np.float)376            xy[:,0] = (2.0 * np.sqrt(2.0) / np.pi) * longitude * np.cos(aux)377            xy[:,1] = np.sqrt(2.0) * np.sin(aux)378            return xy379        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__380        def transform_path_non_affine(self, path):381            vertices = path.vertices382            ipath = path.interpolated(self._resolution)383            return Path(self.transform(ipath.vertices), ipath.codes)384        transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__385        def inverted(self):386            return MollweideAxes.InvertedMollweideTransform(self._resolution)387        inverted.__doc__ = Transform.inverted.__doc__388    class InvertedMollweideTransform(Transform):389        input_dims = 2390        output_dims = 2391        is_separable = False392        def __init__(self, resolution):393            Transform.__init__(self)394            self._resolution = resolution395        def transform_non_affine(self, xy):396            x = xy[:, 0:1]397            y = xy[:, 1:2]398            # from Equations (7, 8) of399            # http://mathworld.wolfram.com/MollweideProjection.html400            theta = np.arcsin(y / np.sqrt(2))401            lon = (np.pi / (2 * np.sqrt(2))) * x / np.cos(theta)402            lat = np.arcsin((2 * theta + np.sin(2 * theta)) / np.pi)403            return np.concatenate((lon, lat), 1)404        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__405        def inverted(self):406            return MollweideAxes.MollweideTransform(self._resolution)407        inverted.__doc__ = Transform.inverted.__doc__408    def __init__(self, *args, **kwargs):409        self._longitude_cap = np.pi / 2.0410        GeoAxes.__init__(self, *args, **kwargs)411        self.set_aspect(0.5, adjustable='box', anchor='C')412        self.cla()413    def _get_core_transform(self, resolution):414        return self.MollweideTransform(resolution)415class LambertAxes(GeoAxes):416    name = 'lambert'417    class LambertTransform(Transform):418        """419        The base Lambert transform.420        """421        input_dims = 2422        output_dims = 2423        is_separable = False424        def __init__(self, center_longitude, center_latitude, resolution):425            """426            Create a new Lambert transform.  Resolution is the number of steps427            to interpolate between each input line segment to approximate its428            path in curved Lambert space.429            """430            Transform.__init__(self)431            self._resolution = resolution432            self._center_longitude = center_longitude433            self._center_latitude = center_latitude434        def transform_non_affine(self, ll):435            longitude = ll[:, 0:1]436            latitude  = ll[:, 1:2]437            clong = self._center_longitude438            clat = self._center_latitude439            cos_lat = np.cos(latitude)440            sin_lat = np.sin(latitude)441            diff_long = longitude - clong442            cos_diff_long = np.cos(diff_long)443            inner_k = (1.0 +444                       np.sin(clat)*sin_lat +445                       np.cos(clat)*cos_lat*cos_diff_long)446            # Prevent divide-by-zero problems447            inner_k = np.where(inner_k == 0.0, 1e-15, inner_k)448            k = np.sqrt(2.0 / inner_k)449            x = k*cos_lat*np.sin(diff_long)450            y = k*(np.cos(clat)*sin_lat -451                   np.sin(clat)*cos_lat*cos_diff_long)452            return np.concatenate((x, y), 1)453        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__454        def transform_path_non_affine(self, path):455            vertices = path.vertices456            ipath = path.interpolated(self._resolution)457            return Path(self.transform(ipath.vertices), ipath.codes)458        transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__459        def inverted(self):460            return LambertAxes.InvertedLambertTransform(461                self._center_longitude,462                self._center_latitude,463                self._resolution)464        inverted.__doc__ = Transform.inverted.__doc__465    class InvertedLambertTransform(Transform):466        input_dims = 2467        output_dims = 2468        is_separable = False469        def __init__(self, center_longitude, center_latitude, resolution):470            Transform.__init__(self)471            self._resolution = resolution472            self._center_longitude = center_longitude473            self._center_latitude = center_latitude474        def transform_non_affine(self, xy):475            x = xy[:, 0:1]476            y = xy[:, 1:2]477            clong = self._center_longitude478            clat = self._center_latitude479            p = np.sqrt(x*x + y*y)480            p = np.where(p == 0.0, 1e-9, p)481            c = 2.0 * np.arcsin(0.5 * p)482            sin_c = np.sin(c)483            cos_c = np.cos(c)484            lat = np.arcsin(cos_c*np.sin(clat) +485                             ((y*sin_c*np.cos(clat)) / p))486            lon = clong + np.arctan(487                (x*sin_c) / (p*np.cos(clat)*cos_c - y*np.sin(clat)*sin_c))488            return np.concatenate((lon, lat), 1)489        transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__490        def inverted(self):491            return LambertAxes.LambertTransform(492                self._center_longitude,493                self._center_latitude,494                self._resolution)495        inverted.__doc__ = Transform.inverted.__doc__496    def __init__(self, *args, **kwargs):497        self._longitude_cap = np.pi / 2.0498        self._center_longitude = kwargs.pop("center_longitude", 0.0)499        self._center_latitude = kwargs.pop("center_latitude", 0.0)500        GeoAxes.__init__(self, *args, **kwargs)501        self.set_aspect('equal', adjustable='box', anchor='C')502        self.cla()503    def cla(self):504        GeoAxes.cla(self)505        self.yaxis.set_major_formatter(NullFormatter())506    def _get_core_transform(self, resolution):507        return self.LambertTransform(508            self._center_longitude,509            self._center_latitude,510            resolution)511    def _get_affine_transform(self):512        return Affine2D() \513            .scale(0.25) \...affinetransform.js
Source:affinetransform.js  
1// Copyright 2008 The Closure Library Authors. All Rights Reserved.2//3// Licensed under the Apache License, Version 2.0 (the "License");4// you may not use this file except in compliance with the License.5// You may obtain a copy of the License at6//7//      http://www.apache.org/licenses/LICENSE-2.08//9// Unless required by applicable law or agreed to in writing, software10// distributed under the License is distributed on an "AS-IS" BASIS,11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12// See the License for the specific language governing permissions and13// limitations under the License.14/**15 * @fileoverview Provides an object representation of an AffineTransform and16 * methods for working with it.17 */18goog.provide('goog.graphics.AffineTransform');19goog.require('goog.math');20/**21 * Creates a 2D affine transform. An affine transform performs a linear22 * mapping from 2D coordinates to other 2D coordinates that preserves the23 * "straightness" and "parallelness" of lines.24 *25 * Such a coordinate transformation can be represented by a 3 row by 3 column26 * matrix with an implied last row of [ 0 0 1 ]. This matrix transforms source27 * coordinates (x,y) into destination coordinates (x',y') by considering them28 * to be a column vector and multiplying the coordinate vector by the matrix29 * according to the following process:30 * <pre>31 *      [ x']   [  m00  m01  m02  ] [ x ]   [ m00x + m01y + m02 ]32 *      [ y'] = [  m10  m11  m12  ] [ y ] = [ m10x + m11y + m12 ]33 *      [ 1 ]   [   0    0    1   ] [ 1 ]   [         1         ]34 * </pre>35 *36 * This class is optimized for speed and minimizes calculations based on its37 * knowledge of the underlying matrix (as opposed to say simply performing38 * matrix multiplication).39 *40 * @param {number=} opt_m00 The m00 coordinate of the transform.41 * @param {number=} opt_m10 The m10 coordinate of the transform.42 * @param {number=} opt_m01 The m01 coordinate of the transform.43 * @param {number=} opt_m11 The m11 coordinate of the transform.44 * @param {number=} opt_m02 The m02 coordinate of the transform.45 * @param {number=} opt_m12 The m12 coordinate of the transform.46 * @constructor47 */48goog.graphics.AffineTransform = function(opt_m00, opt_m10, opt_m01,49    opt_m11, opt_m02, opt_m12) {50  if (arguments.length == 6) {51    this.setTransform(/** @type {number} */ (opt_m00),52                      /** @type {number} */ (opt_m10),53                      /** @type {number} */ (opt_m01),54                      /** @type {number} */ (opt_m11),55                      /** @type {number} */ (opt_m02),56                      /** @type {number} */ (opt_m12));57  } else if (arguments.length != 0) {58    throw Error('Insufficient matrix parameters');59  } else {60    this.m00_ = this.m11_ = 1;61    this.m10_ = this.m01_ = this.m02_ = this.m12_ = 0;62  }63};64/**65 * @return {boolean} Whether this transform is the identity transform.66 */67goog.graphics.AffineTransform.prototype.isIdentity = function() {68  return this.m00_ == 1 && this.m10_ == 0 && this.m01_ == 0 &&69      this.m11_ == 1 && this.m02_ == 0 && this.m12_ == 0;70};71/**72 * @return {!goog.graphics.AffineTransform} A copy of this transform.73 */74goog.graphics.AffineTransform.prototype.clone = function() {75  return new goog.graphics.AffineTransform(this.m00_, this.m10_, this.m01_,76      this.m11_, this.m02_, this.m12_);77};78/**79 * Sets this transform to the matrix specified by the 6 values.80 *81 * @param {number} m00 The m00 coordinate of the transform.82 * @param {number} m10 The m10 coordinate of the transform.83 * @param {number} m01 The m01 coordinate of the transform.84 * @param {number} m11 The m11 coordinate of the transform.85 * @param {number} m02 The m02 coordinate of the transform.86 * @param {number} m12 The m12 coordinate of the transform.87 * @return {!goog.graphics.AffineTransform} This affine transform.88 */89goog.graphics.AffineTransform.prototype.setTransform = function(m00, m10, m01,90    m11, m02, m12) {91  if (!goog.isNumber(m00) || !goog.isNumber(m10) || !goog.isNumber(m01) ||92      !goog.isNumber(m11) || !goog.isNumber(m02) || !goog.isNumber(m12)) {93    throw Error('Invalid transform parameters');94  }95  this.m00_ = m00;96  this.m10_ = m10;97  this.m01_ = m01;98  this.m11_ = m11;99  this.m02_ = m02;100  this.m12_ = m12;101  return this;102};103/**104 * Sets this transform to be identical to the given transform.105 *106 * @param {!goog.graphics.AffineTransform} tx The transform to copy.107 * @return {!goog.graphics.AffineTransform} This affine transform.108 */109goog.graphics.AffineTransform.prototype.copyFrom = function(tx) {110  this.m00_ = tx.m00_;111  this.m10_ = tx.m10_;112  this.m01_ = tx.m01_;113  this.m11_ = tx.m11_;114  this.m02_ = tx.m02_;115  this.m12_ = tx.m12_;116  return this;117};118/**119 * Concatenates this transform with a scaling transformation.120 *121 * @param {number} sx The x-axis scaling factor.122 * @param {number} sy The y-axis scaling factor.123 * @return {!goog.graphics.AffineTransform} This affine transform.124 */125goog.graphics.AffineTransform.prototype.scale = function(sx, sy) {126  this.m00_ *= sx;127  this.m10_ *= sx;128  this.m01_ *= sy;129  this.m11_ *= sy;130  return this;131};132/**133 * Pre-concatenates this transform with a scaling transformation,134 * i.e. calculates the following matrix product:135 *136 * <pre>137 * [sx  0 0] [m00 m01 m02]138 * [ 0 sy 0] [m10 m11 m12]139 * [ 0  0 1] [  0   0   1]140 * </pre>141 *142 * @param {number} sx The x-axis scaling factor.143 * @param {number} sy The y-axis scaling factor.144 * @return {!goog.graphics.AffineTransform} This affine transform.145 */146goog.graphics.AffineTransform.prototype.preScale = function(sx, sy) {147  this.m00_ *= sx;148  this.m01_ *= sx;149  this.m02_ *= sx;150  this.m10_ *= sy;151  this.m11_ *= sy;152  this.m12_ *= sy;153  return this;154};155/**156 * Concatenates this transform with a translate transformation.157 *158 * @param {number} dx The distance to translate in the x direction.159 * @param {number} dy The distance to translate in the y direction.160 * @return {!goog.graphics.AffineTransform} This affine transform.161 */162goog.graphics.AffineTransform.prototype.translate = function(dx, dy) {163  this.m02_ += dx * this.m00_ + dy * this.m01_;164  this.m12_ += dx * this.m10_ + dy * this.m11_;165  return this;166};167/**168 * Pre-concatenates this transform with a translate transformation,169 * i.e. calculates the following matrix product:170 *171 * <pre>172 * [1 0 dx] [m00 m01 m02]173 * [0 1 dy] [m10 m11 m12]174 * [0 0  1] [  0   0   1]175 * </pre>176 *177 * @param {number} dx The distance to translate in the x direction.178 * @param {number} dy The distance to translate in the y direction.179 * @return {!goog.graphics.AffineTransform} This affine transform.180 */181goog.graphics.AffineTransform.prototype.preTranslate = function(dx, dy) {182  this.m02_ += dx;183  this.m12_ += dy;184  return this;185};186/**187 * Concatenates this transform with a rotation transformation around an anchor188 * point.189 *190 * @param {number} theta The angle of rotation measured in radians.191 * @param {number} x The x coordinate of the anchor point.192 * @param {number} y The y coordinate of the anchor point.193 * @return {!goog.graphics.AffineTransform} This affine transform.194 */195goog.graphics.AffineTransform.prototype.rotate = function(theta, x, y) {196  return this.concatenate(197      goog.graphics.AffineTransform.getRotateInstance(theta, x, y));198};199/**200 * Pre-concatenates this transform with a rotation transformation around an201 * anchor point.202 *203 * @param {number} theta The angle of rotation measured in radians.204 * @param {number} x The x coordinate of the anchor point.205 * @param {number} y The y coordinate of the anchor point.206 * @return {!goog.graphics.AffineTransform} This affine transform.207 */208goog.graphics.AffineTransform.prototype.preRotate = function(theta, x, y) {209  return this.preConcatenate(210      goog.graphics.AffineTransform.getRotateInstance(theta, x, y));211};212/**213 * Concatenates this transform with a shear transformation.214 *215 * @param {number} shx The x shear factor.216 * @param {number} shy The y shear factor.217 * @return {!goog.graphics.AffineTransform} This affine transform.218 */219goog.graphics.AffineTransform.prototype.shear = function(shx, shy) {220  var m00 = this.m00_;221  var m10 = this.m10_;222  this.m00_ += shy * this.m01_;223  this.m10_ += shy * this.m11_;224  this.m01_ += shx * m00;225  this.m11_ += shx * m10;226  return this;227};228/**229 * Pre-concatenates this transform with a shear transformation.230 * i.e. calculates the following matrix product:231 *232 * <pre>233 * [  1 shx 0] [m00 m01 m02]234 * [shy   1 0] [m10 m11 m12]235 * [  0   0 1] [  0   0   1]236 * </pre>237 *238 * @param {number} shx The x shear factor.239 * @param {number} shy The y shear factor.240 * @return {!goog.graphics.AffineTransform} This affine transform.241 */242goog.graphics.AffineTransform.prototype.preShear = function(shx, shy) {243  var m00 = this.m00_;244  var m01 = this.m01_;245  var m02 = this.m02_;246  this.m00_ += shx * this.m10_;247  this.m01_ += shx * this.m11_;248  this.m02_ += shx * this.m12_;249  this.m10_ += shy * m00;250  this.m11_ += shy * m01;251  this.m12_ += shy * m02;252  return this;253};254/**255 * @return {string} A string representation of this transform. The format of256 *     of the string is compatible with SVG matrix notation, i.e.257 *     "matrix(a,b,c,d,e,f)".258 * @override259 */260goog.graphics.AffineTransform.prototype.toString = function() {261  return 'matrix(' +262      [this.m00_, this.m10_, this.m01_, this.m11_, this.m02_, this.m12_].join(263          ',') +264      ')';265};266/**267 * @return {number} The scaling factor in the x-direction (m00).268 */269goog.graphics.AffineTransform.prototype.getScaleX = function() {270  return this.m00_;271};272/**273 * @return {number} The scaling factor in the y-direction (m11).274 */275goog.graphics.AffineTransform.prototype.getScaleY = function() {276  return this.m11_;277};278/**279 * @return {number} The translation in the x-direction (m02).280 */281goog.graphics.AffineTransform.prototype.getTranslateX = function() {282  return this.m02_;283};284/**285 * @return {number} The translation in the y-direction (m12).286 */287goog.graphics.AffineTransform.prototype.getTranslateY = function() {288  return this.m12_;289};290/**291 * @return {number} The shear factor in the x-direction (m01).292 */293goog.graphics.AffineTransform.prototype.getShearX = function() {294  return this.m01_;295};296/**297 * @return {number} The shear factor in the y-direction (m10).298 */299goog.graphics.AffineTransform.prototype.getShearY = function() {300  return this.m10_;301};302/**303 * Concatenates an affine transform to this transform.304 *305 * @param {!goog.graphics.AffineTransform} tx The transform to concatenate.306 * @return {!goog.graphics.AffineTransform} This affine transform.307 */308goog.graphics.AffineTransform.prototype.concatenate = function(tx) {309  var m0 = this.m00_;310  var m1 = this.m01_;311  this.m00_ = tx.m00_ * m0 + tx.m10_ * m1;312  this.m01_ = tx.m01_ * m0 + tx.m11_ * m1;313  this.m02_ += tx.m02_ * m0 + tx.m12_ * m1;314  m0 = this.m10_;315  m1 = this.m11_;316  this.m10_ = tx.m00_ * m0 + tx.m10_ * m1;317  this.m11_ = tx.m01_ * m0 + tx.m11_ * m1;318  this.m12_ += tx.m02_ * m0 + tx.m12_ * m1;319  return this;320};321/**322 * Pre-concatenates an affine transform to this transform.323 *324 * @param {!goog.graphics.AffineTransform} tx The transform to preconcatenate.325 * @return {!goog.graphics.AffineTransform} This affine transform.326 */327goog.graphics.AffineTransform.prototype.preConcatenate = function(tx) {328  var m0 = this.m00_;329  var m1 = this.m10_;330  this.m00_ = tx.m00_ * m0 + tx.m01_ * m1;331  this.m10_ = tx.m10_ * m0 + tx.m11_ * m1;332  m0 = this.m01_;333  m1 = this.m11_;334  this.m01_ = tx.m00_ * m0 + tx.m01_ * m1;335  this.m11_ = tx.m10_ * m0 + tx.m11_ * m1;336  m0 = this.m02_;337  m1 = this.m12_;338  this.m02_ = tx.m00_ * m0 + tx.m01_ * m1 + tx.m02_;339  this.m12_ = tx.m10_ * m0 + tx.m11_ * m1 + tx.m12_;340  return this;341};342/**343 * Transforms an array of coordinates by this transform and stores the result344 * into a destination array.345 *346 * @param {!Array.<number>} src The array containing the source points347 *     as x, y value pairs.348 * @param {number} srcOff The offset to the first point to be transformed.349 * @param {!Array.<number>} dst The array into which to store the transformed350 *     point pairs.351 * @param {number} dstOff The offset of the location of the first transformed352 *     point in the destination array.353 * @param {number} numPts The number of points to tranform.354 */355goog.graphics.AffineTransform.prototype.transform = function(src, srcOff, dst,356    dstOff, numPts) {357  var i = srcOff;358  var j = dstOff;359  var srcEnd = srcOff + 2 * numPts;360  while (i < srcEnd) {361    var x = src[i++];362    var y = src[i++];363    dst[j++] = x * this.m00_ + y * this.m01_ + this.m02_;364    dst[j++] = x * this.m10_ + y * this.m11_ + this.m12_;365  }366};367/**368 * @return {number} The determinant of this transform.369 */370goog.graphics.AffineTransform.prototype.getDeterminant = function() {371  return this.m00_ * this.m11_ - this.m01_ * this.m10_;372};373/**374 * Returns whether the transform is invertible. A transform is not invertible375 * if the determinant is 0 or any value is non-finite or NaN.376 *377 * @return {boolean} Whether the transform is invertible.378 */379goog.graphics.AffineTransform.prototype.isInvertible = function() {380  var det = this.getDeterminant();381  return goog.math.isFiniteNumber(det) &&382      goog.math.isFiniteNumber(this.m02_) &&383      goog.math.isFiniteNumber(this.m12_) &&384      det != 0;385};386/**387 * @return {!goog.graphics.AffineTransform} An AffineTransform object388 *     representing the inverse transformation.389 */390goog.graphics.AffineTransform.prototype.createInverse = function() {391  var det = this.getDeterminant();392  return new goog.graphics.AffineTransform(393      this.m11_ / det,394      -this.m10_ / det,395      -this.m01_ / det,396      this.m00_ / det,397      (this.m01_ * this.m12_ - this.m11_ * this.m02_) / det,398      (this.m10_ * this.m02_ - this.m00_ * this.m12_) / det);399};400/**401 * Creates a transform representing a scaling transformation.402 *403 * @param {number} sx The x-axis scaling factor.404 * @param {number} sy The y-axis scaling factor.405 * @return {!goog.graphics.AffineTransform} A transform representing a scaling406 *     transformation.407 */408goog.graphics.AffineTransform.getScaleInstance = function(sx, sy) {409  return new goog.graphics.AffineTransform().setToScale(sx, sy);410};411/**412 * Creates a transform representing a translation transformation.413 *414 * @param {number} dx The distance to translate in the x direction.415 * @param {number} dy The distance to translate in the y direction.416 * @return {!goog.graphics.AffineTransform} A transform representing a417 *     translation transformation.418 */419goog.graphics.AffineTransform.getTranslateInstance = function(dx, dy) {420  return new goog.graphics.AffineTransform().setToTranslation(dx, dy);421};422/**423 * Creates a transform representing a shearing transformation.424 *425 * @param {number} shx The x-axis shear factor.426 * @param {number} shy The y-axis shear factor.427 * @return {!goog.graphics.AffineTransform} A transform representing a shearing428 *     transformation.429 */430goog.graphics.AffineTransform.getShearInstance = function(shx, shy) {431  return new goog.graphics.AffineTransform().setToShear(shx, shy);432};433/**434 * Creates a transform representing a rotation transformation.435 *436 * @param {number} theta The angle of rotation measured in radians.437 * @param {number} x The x coordinate of the anchor point.438 * @param {number} y The y coordinate of the anchor point.439 * @return {!goog.graphics.AffineTransform} A transform representing a rotation440 *     transformation.441 */442goog.graphics.AffineTransform.getRotateInstance = function(theta, x, y) {443  return new goog.graphics.AffineTransform().setToRotation(theta, x, y);444};445/**446 * Sets this transform to a scaling transformation.447 *448 * @param {number} sx The x-axis scaling factor.449 * @param {number} sy The y-axis scaling factor.450 * @return {!goog.graphics.AffineTransform} This affine transform.451 */452goog.graphics.AffineTransform.prototype.setToScale = function(sx, sy) {453  return this.setTransform(sx, 0, 0, sy, 0, 0);454};455/**456 * Sets this transform to a translation transformation.457 *458 * @param {number} dx The distance to translate in the x direction.459 * @param {number} dy The distance to translate in the y direction.460 * @return {!goog.graphics.AffineTransform} This affine transform.461 */462goog.graphics.AffineTransform.prototype.setToTranslation = function(dx, dy) {463  return this.setTransform(1, 0, 0, 1, dx, dy);464};465/**466 * Sets this transform to a shearing transformation.467 *468 * @param {number} shx The x-axis shear factor.469 * @param {number} shy The y-axis shear factor.470 * @return {!goog.graphics.AffineTransform} This affine transform.471 */472goog.graphics.AffineTransform.prototype.setToShear = function(shx, shy) {473  return this.setTransform(1, shy, shx, 1, 0, 0);474};475/**476 * Sets this transform to a rotation transformation.477 *478 * @param {number} theta The angle of rotation measured in radians.479 * @param {number} x The x coordinate of the anchor point.480 * @param {number} y The y coordinate of the anchor point.481 * @return {!goog.graphics.AffineTransform} This affine transform.482 */483goog.graphics.AffineTransform.prototype.setToRotation = function(theta, x, y) {484  var cos = Math.cos(theta);485  var sin = Math.sin(theta);486  return this.setTransform(cos, sin, -sin, cos,487      x - x * cos + y * sin, y - x * sin - y * cos);488};489/**490 * Compares two affine transforms for equality.491 *492 * @param {goog.graphics.AffineTransform} tx The other affine transform.493 * @return {boolean} whether the two transforms are equal.494 */495goog.graphics.AffineTransform.prototype.equals = function(tx) {496  if (this == tx) {497    return true;498  }499  if (!tx) {500    return false;501  }502  return this.m00_ == tx.m00_ &&503      this.m01_ == tx.m01_ &&504      this.m02_ == tx.m02_ &&505      this.m10_ == tx.m10_ &&506      this.m11_ == tx.m11_ &&507      this.m12_ == tx.m12_;..._LookupTransformResult.py
Source:_LookupTransformResult.py  
1# This Python file uses the following encoding: utf-82"""autogenerated by genpy from tf2_msgs/LookupTransformResult.msg. Do not edit."""3import sys4python3 = True if sys.hexversion > 0x03000000 else False5import genpy6import struct7import geometry_msgs.msg8import tf2_msgs.msg9import std_msgs.msg10class LookupTransformResult(genpy.Message):11  _md5sum = "3fe5db6a19ca9cfb675418c5ad875c36"12  _type = "tf2_msgs/LookupTransformResult"13  _has_header = False #flag to mark the presence of a Header object14  _full_text = """# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======15geometry_msgs/TransformStamped transform16tf2_msgs/TF2Error error17================================================================================18MSG: geometry_msgs/TransformStamped19# This expresses a transform from coordinate frame header.frame_id20# to the coordinate frame child_frame_id21#22# This message is mostly used by the 23# <a href="http://www.ros.org/wiki/tf">tf</a> package. 24# See its documentation for more information.25Header header26string child_frame_id # the frame id of the child frame27Transform transform28================================================================================29MSG: std_msgs/Header30# Standard metadata for higher-level stamped data types.31# This is generally used to communicate timestamped data 32# in a particular coordinate frame.33# 34# sequence ID: consecutively increasing ID 35uint32 seq36#Two-integer timestamp that is expressed as:37# * stamp.sec: seconds (stamp_secs) since epoch (in Python the variable is called 'secs')38# * stamp.nsec: nanoseconds since stamp_secs (in Python the variable is called 'nsecs')39# time-handling sugar is provided by the client library40time stamp41#Frame this data is associated with42# 0: no frame43# 1: global frame44string frame_id45================================================================================46MSG: geometry_msgs/Transform47# This represents the transform between two coordinate frames in free space.48Vector3 translation49Quaternion rotation50================================================================================51MSG: geometry_msgs/Vector352# This represents a vector in free space. 53# It is only meant to represent a direction. Therefore, it does not54# make sense to apply a translation to it (e.g., when applying a 55# generic rigid transformation to a Vector3, tf2 will only apply the56# rotation). If you want your data to be translatable too, use the57# geometry_msgs/Point message instead.58float64 x59float64 y60float64 z61================================================================================62MSG: geometry_msgs/Quaternion63# This represents an orientation in free space in quaternion form.64float64 x65float64 y66float64 z67float64 w68================================================================================69MSG: tf2_msgs/TF2Error70uint8 NO_ERROR = 071uint8 LOOKUP_ERROR = 172uint8 CONNECTIVITY_ERROR = 273uint8 EXTRAPOLATION_ERROR = 374uint8 INVALID_ARGUMENT_ERROR = 475uint8 TIMEOUT_ERROR = 576uint8 TRANSFORM_ERROR = 677uint8 error78string error_string79"""80  __slots__ = ['transform','error']81  _slot_types = ['geometry_msgs/TransformStamped','tf2_msgs/TF2Error']82  def __init__(self, *args, **kwds):83    """84    Constructor. Any message fields that are implicitly/explicitly85    set to None will be assigned a default value. The recommend86    use is keyword arguments as this is more robust to future message87    changes.  You cannot mix in-order arguments and keyword arguments.88    The available fields are:89       transform,error90    :param args: complete set of field values, in .msg order91    :param kwds: use keyword arguments corresponding to message field names92    to set specific fields.93    """94    if args or kwds:95      super(LookupTransformResult, self).__init__(*args, **kwds)96      #message fields cannot be None, assign default values for those that are97      if self.transform is None:98        self.transform = geometry_msgs.msg.TransformStamped()99      if self.error is None:100        self.error = tf2_msgs.msg.TF2Error()101    else:102      self.transform = geometry_msgs.msg.TransformStamped()103      self.error = tf2_msgs.msg.TF2Error()104  def _get_types(self):105    """106    internal API method107    """108    return self._slot_types109  def serialize(self, buff):110    """111    serialize message into buffer112    :param buff: buffer, ``StringIO``113    """114    try:115      _x = self116      buff.write(_struct_3I.pack(_x.transform.header.seq, _x.transform.header.stamp.secs, _x.transform.header.stamp.nsecs))117      _x = self.transform.header.frame_id118      length = len(_x)119      if python3 or type(_x) == unicode:120        _x = _x.encode('utf-8')121        length = len(_x)122      if python3:123        buff.write(struct.pack('<I%sB'%length, length, *_x))124      else:125        buff.write(struct.pack('<I%ss'%length, length, _x))126      _x = self.transform.child_frame_id127      length = len(_x)128      if python3 or type(_x) == unicode:129        _x = _x.encode('utf-8')130        length = len(_x)131      if python3:132        buff.write(struct.pack('<I%sB'%length, length, *_x))133      else:134        buff.write(struct.pack('<I%ss'%length, length, _x))135      _x = self136      buff.write(_struct_7dB.pack(_x.transform.transform.translation.x, _x.transform.transform.translation.y, _x.transform.transform.translation.z, _x.transform.transform.rotation.x, _x.transform.transform.rotation.y, _x.transform.transform.rotation.z, _x.transform.transform.rotation.w, _x.error.error))137      _x = self.error.error_string138      length = len(_x)139      if python3 or type(_x) == unicode:140        _x = _x.encode('utf-8')141        length = len(_x)142      if python3:143        buff.write(struct.pack('<I%sB'%length, length, *_x))144      else:145        buff.write(struct.pack('<I%ss'%length, length, _x))146    except struct.error as se: self._check_types(struct.error("%s: '%s' when writing '%s'" % (type(se), str(se), str(locals().get('_x', self)))))147    except TypeError as te: self._check_types(ValueError("%s: '%s' when writing '%s'" % (type(te), str(te), str(locals().get('_x', self)))))148  def deserialize(self, str):149    """150    unpack serialized message in str into this message instance151    :param str: byte array of serialized message, ``str``152    """153    try:154      if self.transform is None:155        self.transform = geometry_msgs.msg.TransformStamped()156      if self.error is None:157        self.error = tf2_msgs.msg.TF2Error()158      end = 0159      _x = self160      start = end161      end += 12162      (_x.transform.header.seq, _x.transform.header.stamp.secs, _x.transform.header.stamp.nsecs,) = _struct_3I.unpack(str[start:end])163      start = end164      end += 4165      (length,) = _struct_I.unpack(str[start:end])166      start = end167      end += length168      if python3:169        self.transform.header.frame_id = str[start:end].decode('utf-8')170      else:171        self.transform.header.frame_id = str[start:end]172      start = end173      end += 4174      (length,) = _struct_I.unpack(str[start:end])175      start = end176      end += length177      if python3:178        self.transform.child_frame_id = str[start:end].decode('utf-8')179      else:180        self.transform.child_frame_id = str[start:end]181      _x = self182      start = end183      end += 57184      (_x.transform.transform.translation.x, _x.transform.transform.translation.y, _x.transform.transform.translation.z, _x.transform.transform.rotation.x, _x.transform.transform.rotation.y, _x.transform.transform.rotation.z, _x.transform.transform.rotation.w, _x.error.error,) = _struct_7dB.unpack(str[start:end])185      start = end186      end += 4187      (length,) = _struct_I.unpack(str[start:end])188      start = end189      end += length190      if python3:191        self.error.error_string = str[start:end].decode('utf-8')192      else:193        self.error.error_string = str[start:end]194      return self195    except struct.error as e:196      raise genpy.DeserializationError(e) #most likely buffer underfill197  def serialize_numpy(self, buff, numpy):198    """199    serialize message with numpy array types into buffer200    :param buff: buffer, ``StringIO``201    :param numpy: numpy python module202    """203    try:204      _x = self205      buff.write(_struct_3I.pack(_x.transform.header.seq, _x.transform.header.stamp.secs, _x.transform.header.stamp.nsecs))206      _x = self.transform.header.frame_id207      length = len(_x)208      if python3 or type(_x) == unicode:209        _x = _x.encode('utf-8')210        length = len(_x)211      if python3:212        buff.write(struct.pack('<I%sB'%length, length, *_x))213      else:214        buff.write(struct.pack('<I%ss'%length, length, _x))215      _x = self.transform.child_frame_id216      length = len(_x)217      if python3 or type(_x) == unicode:218        _x = _x.encode('utf-8')219        length = len(_x)220      if python3:221        buff.write(struct.pack('<I%sB'%length, length, *_x))222      else:223        buff.write(struct.pack('<I%ss'%length, length, _x))224      _x = self225      buff.write(_struct_7dB.pack(_x.transform.transform.translation.x, _x.transform.transform.translation.y, _x.transform.transform.translation.z, _x.transform.transform.rotation.x, _x.transform.transform.rotation.y, _x.transform.transform.rotation.z, _x.transform.transform.rotation.w, _x.error.error))226      _x = self.error.error_string227      length = len(_x)228      if python3 or type(_x) == unicode:229        _x = _x.encode('utf-8')230        length = len(_x)231      if python3:232        buff.write(struct.pack('<I%sB'%length, length, *_x))233      else:234        buff.write(struct.pack('<I%ss'%length, length, _x))235    except struct.error as se: self._check_types(struct.error("%s: '%s' when writing '%s'" % (type(se), str(se), str(locals().get('_x', self)))))236    except TypeError as te: self._check_types(ValueError("%s: '%s' when writing '%s'" % (type(te), str(te), str(locals().get('_x', self)))))237  def deserialize_numpy(self, str, numpy):238    """239    unpack serialized message in str into this message instance using numpy for array types240    :param str: byte array of serialized message, ``str``241    :param numpy: numpy python module242    """243    try:244      if self.transform is None:245        self.transform = geometry_msgs.msg.TransformStamped()246      if self.error is None:247        self.error = tf2_msgs.msg.TF2Error()248      end = 0249      _x = self250      start = end251      end += 12252      (_x.transform.header.seq, _x.transform.header.stamp.secs, _x.transform.header.stamp.nsecs,) = _struct_3I.unpack(str[start:end])253      start = end254      end += 4255      (length,) = _struct_I.unpack(str[start:end])256      start = end257      end += length258      if python3:259        self.transform.header.frame_id = str[start:end].decode('utf-8')260      else:261        self.transform.header.frame_id = str[start:end]262      start = end263      end += 4264      (length,) = _struct_I.unpack(str[start:end])265      start = end266      end += length267      if python3:268        self.transform.child_frame_id = str[start:end].decode('utf-8')269      else:270        self.transform.child_frame_id = str[start:end]271      _x = self272      start = end273      end += 57274      (_x.transform.transform.translation.x, _x.transform.transform.translation.y, _x.transform.transform.translation.z, _x.transform.transform.rotation.x, _x.transform.transform.rotation.y, _x.transform.transform.rotation.z, _x.transform.transform.rotation.w, _x.error.error,) = _struct_7dB.unpack(str[start:end])275      start = end276      end += 4277      (length,) = _struct_I.unpack(str[start:end])278      start = end279      end += length280      if python3:281        self.error.error_string = str[start:end].decode('utf-8')282      else:283        self.error.error_string = str[start:end]284      return self285    except struct.error as e:286      raise genpy.DeserializationError(e) #most likely buffer underfill287_struct_I = genpy.struct_I288_struct_3I = struct.Struct("<3I")...convertTransform.js
Source:convertTransform.js  
...75    if (params.removeUseless) {76        data = removeUseless(data);77    }78    if (data.length) {79        item.attr(attrName).value = js2transform(data, params);80    } else {81        item.removeAttr(attrName);82    }83}84/**85 * Defines precision to work with certain parts.86 * transformPrecision - for scale and four first matrix parameters (needs a better precision due to multiplying),87 * floatPrecision - for translate including two last matrix and rotate parameters,88 * degPrecision - for rotate and skew. By default it's equal to (rougly)89 * transformPrecision - 2 or floatPrecision whichever is lower. Can be set in params.90 *91 * @param {Array} transforms input array92 * @param {Object} params plugin params93 * @return {Array} output array94 */95function definePrecision(data, params) {96    /* jshint validthis: true */97    var matrixData = data.reduce(getMatrixData, []),98        significantDigits = params.transformPrecision;99    // Clone params so it don't affect other elements transformations.100    params = EXTEND({}, params);101    // Limit transform precision with matrix one. Calculating with larger precision doesn't add any value.102    if (matrixData.length) {103        params.transformPrecision = Math.min(params.transformPrecision,104            Math.max.apply(Math, matrixData.map(floatDigits)) || params.transformPrecision);105        significantDigits = Math.max.apply(Math, matrixData.map(function(n) {106            return String(n).replace(/\D+/g, '').length; // Number of digits in a number. 123.45 â 5107        }));108    }109    // No sense in angle precision more then number of significant digits in matrix.110    if (!('degPrecision' in params)) {111        params.degPrecision = Math.max(0, Math.min(params.floatPrecision, significantDigits - 2));112    }113    floatRound = params.floatPrecision >= 1 && params.floatPrecision < 20 ?114        smartRound.bind(this, params.floatPrecision) :115        round;116    degRound = params.degPrecision >= 1 && params.floatPrecision < 20 ?117        smartRound.bind(this, params.degPrecision) :118        round;119    transformRound = params.transformPrecision >= 1 && params.floatPrecision < 20 ?120        smartRound.bind(this, params.transformPrecision) :121        round;122    return params;123}124/**125 * Gathers four first matrix parameters.126 *127 * @param {Array} a array of data128 * @param {Object} transform129 * @return {Array} output array130 */131function getMatrixData(a, b) {132    return b.name == 'matrix' ? a.concat(b.data.slice(0, 4)) : a;133}134/**135 * Returns number of digits after the point. 0.125 â 3136 */137function floatDigits(n) {138    return (n = String(n)).slice(n.indexOf('.')).length - 1;139}140/**141 * Convert transforms to the shorthand alternatives.142 *143 * @param {Array} transforms input array144 * @param {Object} params plugin params145 * @return {Array} output array146 */147function convertToShorts(transforms, params) {148    for(var i = 0; i < transforms.length; i++) {149        var transform = transforms[i];150        // convert matrix to the short aliases151        if (152            params.matrixToTransform &&153            transform.name === 'matrix'154        ) {155            var decomposed = matrixToTransform(transform, params);156            if (decomposed != transform &&157                js2transform(decomposed, params).length <= js2transform([transform], params).length) {158                transforms.splice.apply(transforms, [i, 1].concat(decomposed));159            }160            transform = transforms[i];161        }162        // fixed-point numbers163        // 12.754997 â 12.755164        roundTransform(transform);165        // convert long translate transform notation to the shorts one166        // translate(10 0) â translate(10)167        if (168            params.shortTranslate &&169            transform.name === 'translate' &&170            transform.data.length === 2 &&171            !transform.data[1]172        ) {173            transform.data.pop();174        }175        // convert long scale transform notation to the shorts one176        // scale(2 2) â scale(2)177        if (178            params.shortScale &&179            transform.name === 'scale' &&180            transform.data.length === 2 &&181            transform.data[0] === transform.data[1]182        ) {183            transform.data.pop();184        }185        // convert long rotate transform notation to the short one186        // translate(cx cy) rotate(a) translate(-cx -cy) â rotate(a cx cy)187        if (188            params.shortRotate &&189            transforms[i - 2] &&190            transforms[i - 2].name === 'translate' &&191            transforms[i - 1].name === 'rotate' &&192            transforms[i].name === 'translate' &&193            transforms[i - 2].data[0] === -transforms[i].data[0] &&194            transforms[i - 2].data[1] === -transforms[i].data[1]195        ) {196            transforms.splice(i - 2, 3, {197                name: 'rotate',198                data: [199                    transforms[i - 1].data[0],200                    transforms[i - 2].data[0],201                    transforms[i - 2].data[1]202                ]203            });204            // splice compensation205            i -= 2;206            transform = transforms[i];207        }208    }209    return transforms;210}211/**212 * Remove useless transforms.213 *214 * @param {Array} transforms input array215 * @return {Array} output array216 */217function removeUseless(transforms) {218    return transforms.filter(function(transform) {219        // translate(0), rotate(0[, cx, cy]), skewX(0), skewY(0)220        if (221            ['translate', 'rotate', 'skewX', 'skewY'].indexOf(transform.name) > -1 &&222            (transform.data.length == 1 || transform.name == 'rotate') &&223            !transform.data[0] ||224            // translate(0, 0)225            transform.name == 'translate' &&226            !transform.data[0] &&227            !transform.data[1] ||228            // scale(1)229            transform.name == 'scale' &&230            transform.data[0] == 1 &&231            (transform.data.length < 2 || transform.data[1] == 1) ||232            // matrix(1 0 0 1 0 0)233            transform.name == 'matrix' &&234            transform.data[0] == 1 &&235            transform.data[3] == 1 &&236            !(transform.data[1] || transform.data[2] || transform.data[4] || transform.data[5])237        ) {238            return false;239        }240        return true;241    });242}243/**244 * Convert transforms JS representation to string.245 *246 * @param {Array} transformJS JS representation array247 * @param {Object} params plugin params248 * @return {String} output string249 */250function js2transform(transformJS, params) {251    var transformString = '';252    // collect output value string253    transformJS.forEach(function(transform) {254        roundTransform(transform);255        transformString += (transformString && ' ') + transform.name + '(' + cleanupOutData(transform.data, params) + ')';256    });257    return transformString;258}259function roundTransform(transform) {260    switch (transform.name) {261        case 'translate':262            transform.data = floatRound(transform.data);263            break;264        case 'rotate':...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
