Skip to content
This repository was archived by the owner on May 11, 2021. It is now read-only.

Commit 6563527

Browse files
author
Jack Toole
committed
Added kpoint.compare for sorting arrays of points
Summary: Added a kpoint.compare function to be used with Array::sort Made kvector.equal more obviously correct for vectors of differing lengths (technically it worked before, but relied upon 0 - undefined returning NaN) Test Plan: Added unit tests Reviewers: alex Reviewed By: alex CC: alpert Differential Revision: http://phabricator.khanacademy.org/D5475
1 parent 157056f commit 6563527

File tree

7 files changed

+101
-2
lines changed

7 files changed

+101
-2
lines changed

khan-exercise.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ window.Khan = (function() {
298298
"matrix-input": ["../third_party/jquery.cursor-position"],
299299
"chemistry": ["math-format"],
300300
"kvector": ["knumber"],
301-
"kpoint": ["kvector"],
301+
"kpoint": ["kvector", "knumber"],
302302
"kline": ["kpoint", "kvector"],
303303
"constructions": ["kmatrix"]
304304
},

test/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
<script src="../utils/kvector.js"></script>
7070
<script src="kvector.js"></script>
7171
<script src="../utils/kpoint.js"></script>
72+
<script src="kpoint.js"></script>
7273
<script src="../utils/kline.js"></script>
7374
<script src="kline.js"></script>
7475
<script src="../utils/answer-types.js"></script>

test/kpoint.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
(function() {
2+
module("kpoint");
3+
4+
var point = KhanUtil.kpoint;
5+
6+
asyncTest('point.compare should return positive if the first element is larger', 1, function() {
7+
var result = point.compare([5, 2], [3, 4]);
8+
strictEqual(result > 0, true);
9+
start();
10+
});
11+
12+
asyncTest('point.compare should return negative if the first element is smaller', 1, function() {
13+
var result = point.compare([2, 2], [4, 0]);
14+
strictEqual(result < 0, true);
15+
start();
16+
});
17+
18+
asyncTest('point.compare should return positive if the second element is larger', 1, function() {
19+
var result = point.compare([5, 2], [5, 1]);
20+
strictEqual(result > 0, true);
21+
start();
22+
});
23+
24+
asyncTest('point.compare should return negative if the second element is smaller', 1, function() {
25+
var result = point.compare([2, 2], [2, 4]);
26+
strictEqual(result < 0, true);
27+
start();
28+
});
29+
30+
asyncTest('point.compare should return positive if the third element is larger', 1, function() {
31+
var result = point.compare([5, 3, -2], [5, 3, -4]);
32+
strictEqual(result > 0, true);
33+
start();
34+
});
35+
36+
asyncTest('point.compare should return negative if the third element is smaller', 1, function() {
37+
var result = point.compare([2, -1, -4], [2, -1, -2]);
38+
strictEqual(result < 0, true);
39+
start();
40+
});
41+
42+
asyncTest('point.compare should return 0 if the vectors are equal', 1, function() {
43+
var result = point.compare([2, 4, 3], [2, 4, 3]);
44+
strictEqual(result, 0);
45+
start();
46+
});
47+
48+
asyncTest('point.compare should return negative if v1 is shorter than v2', 1, function() {
49+
var result = point.compare([2, 4], [2, 4, 3]);
50+
strictEqual(result < 0, true);
51+
start();
52+
});
53+
54+
asyncTest('point.compare should return positive if v1 is longer than v2', 1, function() {
55+
var result = point.compare([2, 4, -2], [2, 2]);
56+
strictEqual(result > 0, true);
57+
start();
58+
});
59+
60+
})();

test/kvector.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@
9393
start();
9494
});
9595

96+
asyncTest('vector.equal should return false on a 2D and 3D vector with a trailing 0', 1, function() {
97+
var result = vector.equal([6, 3, 0], [6, 3]);
98+
strictEqual(result, false);
99+
start();
100+
});
101+
96102
asyncTest("vector.collinear should return true on two collinear vectors of "
97103
+ "the same magnitude but different direction", 1, function() {
98104
var result = vector.collinear([3, 3], [-3, -3]);

utils/knumber.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ var knumber = KhanUtil.knumber = {
1414
MACHINE_EPSILON: MACHINE_EPSILON,
1515

1616
equal: function(x, y, tolerance) {
17+
// Checking for undefined makes this function behave nicely
18+
// with vectors of different lengths that are _.zip'd together
19+
if (x == null || y == null) {
20+
return x === y;
21+
}
1722
if (tolerance == null) {
1823
tolerance = DEFAULT_TOLERANCE;
1924
}

utils/kpoint.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
(function(KhanUtil) {
77

88
var kvector = KhanUtil.kvector;
9+
var knumber = KhanUtil.knumber;
910
$.fn["kpointLoad"] = function() {
1011
kvector = KhanUtil.kvector;
12+
knumber = KhanUtil.knumber;
1113
addKpointExtensions();
1214
};
1315

@@ -63,6 +65,27 @@ var kpoint = KhanUtil.kpoint = {
6365
var projectedPv = kvector.projection(pv, lv);
6466
var reflectedPv = kvector.subtract(kvector.scale(projectedPv, 2), pv);
6567
return kvector.add(line[0], reflectedPv);
68+
},
69+
70+
/**
71+
* Compares two points, returning -1, 0, or 1, for use with
72+
* Array.prototype.sort
73+
*
74+
* Note: This technically doesn't satisfy the total-ordering
75+
* requirements of Array.prototype.sort unless equalityTolerance
76+
* is 0. In some cases very close points that compare within a
77+
* few equalityTolerances could appear in the wrong order.
78+
*/
79+
compare: function(point1, point2, equalityTolerance) {
80+
if (point1.length !== point2.length) {
81+
return point1.length - point2.length;
82+
}
83+
for (var i = 0; i < point1.length; i++) {
84+
if (!knumber.equal(point1[i], point2[i], equalityTolerance)) {
85+
return point1[i] - point2[i];
86+
}
87+
}
88+
return 0;
6689
}
6790
};
6891

utils/kvector.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,12 @@ var kvector = KhanUtil.kvector = {
6868
},
6969

7070
equal: function(v1, v2, tolerance) {
71+
// _.zip will nicely deal with the lengths, going through
72+
// the length of the longest vector. knumber.equal then
73+
// returns false for any number compared to the undefined
74+
// passed in if one of the vectors is shorter.
7175
return _.all(_.zip(v1, v2), function(pair) {
72-
return knumber.equal.call(knumber, pair[0], pair[1], tolerance);
76+
return knumber.equal(pair[0], pair[1], tolerance);
7377
});
7478
},
7579

0 commit comments

Comments
 (0)