CS 145 Lecture 14 – Testing and conditionals via collision detection
Agenda
- lab switcharoo
- collision detection
- test-driven development
Collision detection
- Suppose you have two horizontal line segments in the same line. (Or two pens.) When are they intersecting?
- Suppose you have two circles. When are they intersecting?
- Suppose you have two rectangles. When are they intersecting?
Code
CollisionUtilities.java
package lecture;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class CollisionUtilities {
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(new File("/home/cjohnson/Desktop/lines.txt"));
while (in.hasNextDouble()) {
double leftA = in.nextDouble();
double rightA = in.nextDouble();
double leftB = in.nextDouble();
double rightB = in.nextDouble();
boolean expected = in.nextBoolean();
boolean actual = isColliding(leftA, rightA, leftB, rightB);
if (actual != expected) {
System.out.printf("[%f, %f] vs. [%f, %f] expected: " + expected + ", actual: " + actual + "%n", leftA, rightA, leftB, rightB);
}
}
in.close();
}
/**
* Checks whether two 1-D line segments intersect.
*
* @param leftA
* Left bounds of line segment A, assumed < rightA
* @param rightA
* Right bounds of line segment A
* @param leftB
* Left bounds of line segment B, assumed < rightB
* @param rightB
* Right bounds of line segment B
* @return True if they collide, false otherwise
*/
public static boolean isColliding(double leftA,
double rightA,
double leftB,
double rightB) {
return !(leftB > rightA || rightB < leftA);
}
}
Test-driven development
Here’s by far the best strategy for writing a method with minimal headache:
- Write its specification. What does it need to do? What does it needs from the outside world? What does it give back the outside world?
- Write its signature/interface.
- Write tests.
- Implement it.
- Execute your tests.