| // Copyright (c) 2001-2010, Purdue University. All rights reserved. |
| // Copyright (C) 2015 Apple Inc. All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are met: |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above copyright |
| // notice, this list of conditions and the following disclaimer in the |
| // documentation and/or other materials provided with the distribution. |
| // * Neither the name of the Purdue University nor the |
| // names of its contributors may be used to endorse or promote products |
| // derived from this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY |
| // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| load("constants.js"); |
| load("util.js"); |
| load("red_black_tree.js"); |
| load("call_sign.js"); |
| load("vector_2d.js"); |
| load("vector_3d.js"); |
| load("motion.js"); |
| load("reduce_collision_set.js"); |
| |
| var makeMotion = (function() { |
| var counter = 0; |
| return function(x1, y1, z1, x2, y2, z2) { |
| return new Motion(new CallSign("foo" + (++counter)), |
| new Vector3D(x1, y1, z1), |
| new Vector3D(x2, y2, z2)); |
| } |
| })(); |
| |
| function drawMotion(motion) { |
| var voxelMap = new RedBlackTree(); |
| drawMotionOnVoxelMap(voxelMap, motion); |
| return voxelMap; |
| } |
| |
| function keys(voxelMap) { |
| var result = "["; |
| var first = true; |
| voxelMap.forEach(function(key, value) { |
| if (first) |
| first = false; |
| else |
| result += ", "; |
| result += key; |
| }); |
| return result + "]"; |
| } |
| |
| function test(x1, y1, z1, x2, y2, z2, expected) { |
| var motion = makeMotion(x1, y1, z1, x2, y2, z2); |
| print(motion + ":"); |
| var actual = keys(drawMotion(motion)); |
| if (expected != actual) |
| throw new Error("Wrong voxel map: " + actual); |
| print(" Got: " + actual); |
| } |
| |
| test(0, 0, 0, 1, 1, 1, "[[0, 0]]"); |
| test(0, 0, 0, 2, 2, 2, "[[0, 0], [0, 2], [2, 0], [2, 2]]"); |
| test(0, 0, 0, 4, 4, 4, "[[0, 0], [0, 2], [2, 0], [2, 2], [2, 4], [4, 2], [4, 4]]"); |
| test(0, 0, 0, 10, 0, 0, "[[0, 0], [2, 0], [4, 0], [6, 0], [8, 0], [10, 0]]"); |
| test(2, 0, 0, 0, 2, 2, "[[0, 0], [0, 2], [2, 0]]"); |
| test(0, 2, 0, 2, 0, 2, "[[0, 0], [0, 2], [2, 0]]"); |
| test(2, 2, 0, 0, 0, 2, "[[0, 0], [0, 2], [2, 0], [2, 2]]"); |
| test(0, 0, 0, 2, 0, 0, "[[0, 0], [2, 0]]"); |
| test(0, 0, 0, 0, 2, 0, "[[0, 0], [0, 2]]"); |
| test(2, 0, 0, 0, 0, 0, "[[0, 0], [2, 0]]"); |
| test(0, 2, 0, 0, 0, 0, "[[0, 0], [0, 2]]"); |