public int yOf(int x) throws IllegalArgumentException {
        //trivial rejections
        if (x < this.lefterVertex().centerX()
                || x > this.righterVertex().centerX()) {
            throw new IllegalArgumentException("x out of range: "
                    + x);
        }
        if (this.isVertical()) {
            throw new IllegalArgumentException("Vertical lines have too many "
                    + "ys.");
        }

        //I can find the y of my endpoints with the best of them
        if (x == this.getStart().centerX()) {
            return this.getStart().centerY();
        }
        if (x == this.getEnd().centerX()) {
            return this.getEnd().centerY();
        }

        //What's my slope?
        double m = this.getStart().centerY() / this.getEnd().centerY();

        //Start at the start vertex and move toward the end some ways.
        int y;
        //If the end is higher than the start, I'll be moving upward.
        if (this.getEnd().isAbove(this.getStart())) {
            try {
                y = (int) Math.round(this.getStart().centerY() - (m * x));
            } catch (ArithmeticException ex) {
                throw new IllegalArgumentException(ex);
            }
        } else {
            //The end is lower than the start. Move downward.
            try {
                y = (int) Math.round(this.getStart().centerY() + (m * x));
            } catch (ArithmeticException ex) {
                throw new IllegalArgumentException(ex);
            }
        }
        //Java's coordinate system uses only positive numbers.
        if (y < 0) {
            throw new IllegalArgumentException("Oh dear, somehow you've "
                    + "gotten all the way down here with an x that doesn't "
                    + "give a legitimate y.");
        }
        return y;
    }