Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: tracing/tracing/base/math.html

Issue 2771723003: [tracing] Move math utilities from base into their own subdirectory (attempt 2) (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tracing/tracing/base/bbox2_test.html ('k') | tracing/tracing/base/math/bbox2.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <!--
3 Copyright (c) 2014 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
6 -->
7 <link rel="import" href="/tracing/base/base.html">
8 <script src="/gl-matrix-min.js"></script>
9
10 <script>
11 'use strict';
12
13 // In node, the script-src for gl-matrix-min above brings in glmatrix into
14 // a module, instead of into the global scope. Whereas, Tracing code
15 // assumes that glMatrix is in the global scope. So, in Node only, we
16 // require() it in, and then take all its exports and shove them into the
17 // global scope by hand.
18 (function(global) {
19 if (tr.isNode) {
20 var glMatrixAbsPath = HTMLImportsLoader.hrefToAbsolutePath(
21 '/gl-matrix-min.js');
22 var glMatrixModule = require(glMatrixAbsPath);
23 for (var exportName in glMatrixModule) {
24 global[exportName] = glMatrixModule[exportName];
25 }
26 }
27 })(this);
28 </script>
29
30 <script>
31 'use strict';
32
33 tr.exportTo('tr.b', function() {
34 var PREFERRED_NUMBER_SERIES_MULTIPLIERS = [1, 2, 5, 10];
35
36 /* Returns true when x and y are within delta of each other. */
37 function approximately(x, y, delta) {
38 if (delta === undefined)
39 delta = 1e-9;
40 return Math.abs(x - y) < delta;
41 }
42
43 function clamp(x, lo, hi) {
44 return Math.min(Math.max(x, lo), hi);
45 }
46
47 function lerp(percentage, lo, hi) {
48 var range = hi - lo;
49 return lo + percentage * range;
50 }
51
52 function normalize(value, lo, hi) {
53 return (value - lo) / (hi - lo);
54 }
55
56 function deg2rad(deg) {
57 return (Math.PI * deg) / 180.0;
58 }
59
60 /* The Gauss error function gives the probability that a measurement (which is
61 * under the influence of normally distributed errors with standard deviation
62 * sigma = 1) is less than x from the mean value of the standard normal
63 * distribution.
64 * https://www.desmos.com/calculator/t1v4bdpske
65 *
66 * @param {number} x A tolerance for error.
67 * @return {number} The probability that a measurement is less than |x| from
68 * the mean value of the standard normal distribution.
69 */
70 function erf(x) {
71 // save the sign of x
72 // erf(-x) = -erf(x);
73 var sign = (x >= 0) ? 1 : -1;
74 x = Math.abs(x);
75
76 // constants
77 var a1 = 0.254829592;
78 var a2 = -0.284496736;
79 var a3 = 1.421413741;
80 var a4 = -1.453152027;
81 var a5 = 1.061405429;
82 var p = 0.3275911;
83
84 // Abramowitz and Stegun formula 7.1.26
85 // maximum error: 1.5e-7
86 var t = 1.0 / (1.0 + p * x);
87 var y = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t *
88 Math.exp(-x * x);
89 return sign * y;
90 }
91
92 var tmpVec2 = vec2.create();
93 var tmpVec2b = vec2.create();
94 var tmpVec4 = vec4.create();
95 var tmpMat2d = mat2d.create();
96
97 vec2.createFromArray = function(arr) {
98 if (arr.length !== 2)
99 throw new Error('Should be length 2');
100 var v = vec2.create();
101 vec2.set(v, arr[0], arr[1]);
102 return v;
103 };
104
105 vec2.createXY = function(x, y) {
106 var v = vec2.create();
107 vec2.set(v, x, y);
108 return v;
109 };
110
111 vec2.toString = function(a) {
112 return '[' + a[0] + ', ' + a[1] + ']';
113 };
114
115 vec2.addTwoScaledUnitVectors = function(out, u1, scale1, u2, scale2) {
116 // out = u1 * scale1 + u2 * scale2
117 vec2.scale(tmpVec2, u1, scale1);
118 vec2.scale(tmpVec2b, u2, scale2);
119 vec2.add(out, tmpVec2, tmpVec2b);
120 };
121
122 vec2.interpolatePiecewiseFunction = function(points, x) {
123 if (x < points[0][0])
124 return points[0][1];
125 for (var i = 1; i < points.length; ++i) {
126 if (x < points[i][0]) {
127 var percent = normalize(x, points[i - 1][0], points[i][0]);
128 return lerp(percent, points[i - 1][1], points[i][1]);
129 }
130 }
131 return points[points.length - 1][1];
132 };
133
134 vec3.createXYZ = function(x, y, z) {
135 var v = vec3.create();
136 vec3.set(v, x, y, z);
137 return v;
138 };
139
140 vec3.toString = function(a) {
141 return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';
142 };
143
144 mat2d.translateXY = function(out, x, y) {
145 vec2.set(tmpVec2, x, y);
146 mat2d.translate(out, out, tmpVec2);
147 };
148
149 mat2d.scaleXY = function(out, x, y) {
150 vec2.set(tmpVec2, x, y);
151 mat2d.scale(out, out, tmpVec2);
152 };
153
154 vec4.unitize = function(out, a) {
155 out[0] = a[0] / a[3];
156 out[1] = a[1] / a[3];
157 out[2] = a[2] / a[3];
158 out[3] = 1;
159 return out;
160 };
161
162 vec2.copyFromVec4 = function(out, a) {
163 vec4.unitize(tmpVec4, a);
164 vec2.copy(out, tmpVec4);
165 };
166
167 /**
168 * @param {number} x
169 * @param {number=} opt_base Defaults to 10
170 * @return {number}
171 */
172 function logOrLog10(x, base) {
173 if (base === 10) return Math.log10(x);
174 return Math.log(x) / Math.log(base);
175 }
176
177 /**
178 * @param {number} x
179 * @param {number=} opt_base Defaults to 10
180 * @return {number}
181 */
182 function lesserPower(x, opt_base) {
183 var base = opt_base || 10;
184 return Math.pow(base, Math.floor(logOrLog10(x, base)));
185 }
186
187 /**
188 * @param {number} x
189 * @param {number=} opt_base Defaults to 10
190 * @return {number}
191 */
192 function greaterPower(x, opt_base) {
193 var base = opt_base || 10;
194 return Math.pow(base, Math.ceil(logOrLog10(x, base)));
195 }
196
197 function lesserWholeNumber(x) {
198 if (x === 0) return 0;
199 const pow10 = (x < 0) ? -lesserPower(-x) : lesserPower(x);
200 return pow10 * Math.floor(x / pow10);
201 }
202
203 function greaterWholeNumber(x) {
204 if (x === 0) return 0;
205 const pow10 = (x < 0) ? -lesserPower(-x) : lesserPower(x);
206 return pow10 * Math.ceil(x / pow10);
207 }
208
209 /**
210 * Uses the 1-2-5 series to find the closest prefered number to min
211 * whose absolute value is at least the absolute value of |min|.
212 * https://en.wikipedia.org/wiki/Preferred_number
213 */
214 function preferredNumberLargerThanMin(min) {
215 var absMin = Math.abs(min);
216 // The conservative guess is the largest power of 10 less than
217 // or equal to |absMin|.
218 var conservativeGuess = tr.b.lesserPower(absMin);
219 var minPreferedNumber = undefined;
220 for (var multiplier of PREFERRED_NUMBER_SERIES_MULTIPLIERS) {
221 var tightenedGuess = conservativeGuess * multiplier;
222 if (tightenedGuess >= absMin) {
223 minPreferedNumber = tightenedGuess;
224 break;
225 }
226 }
227 if (minPreferedNumber === undefined) {
228 throw new Error('Could not compute preferred number for ' + min);
229 }
230 if (min < 0) minPreferedNumber *= -1;
231 return minPreferedNumber;
232 }
233
234 return {
235 approximately,
236 clamp,
237 lerp,
238 normalize,
239 deg2rad,
240 erf,
241 lesserPower,
242 greaterPower,
243 lesserWholeNumber,
244 greaterWholeNumber,
245 preferredNumberLargerThanMin,
246 };
247 });
248 </script>
OLDNEW
« no previous file with comments | « tracing/tracing/base/bbox2_test.html ('k') | tracing/tracing/base/math/bbox2.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698