public static CoordinateMatrix plane(
            Coordinate p, 
            Coordinate d1, Double uStart, Double uEnd, Double uStep,
            Coordinate d2, Double vStart, Double vEnd, Double vStep) 
            throws LengthException {

        assert uEnd > uStart;
        assert vEnd > vStart;
        assert uStep > 0.0;
        assert vStep > 0.0;

        int numberOfRows = 3;
        int numberOfColumns = (int) Math.ceil(((uEnd - uStart) / uStep) * ((vEnd - vStart) / vStep));

        if ((p.getLength() != numberOfRows) || 
            (d1.getLength() != numberOfRows) ||
            (d2.getLength() != numberOfRows)) 
            throw new LengthException("Coordinate must be of length 4");

        CoordinateMatrix newMatrix = new CoordinateMatrix(numberOfRows,
                                                          numberOfColumns);

        CoordinateMatrix.Iterator matrixIterator = newMatrix.new Iterator();

        for (Double i = uStart; i < uEnd; i += uStep) {
            for (Double j = vStart; j < vEnd; j += vStep) {
                try {
                    matrixIterator.set(p.add(d1.mul(i).add(d2.mul(j))));
                    matrixIterator.next();
                } catch (IteratorException e) {
                    assert false : "Fatal programming error";
                } catch (LengthException e) {
                    assert false : "Fatal programming error";
                }
            }
        }

        return newMatrix;
    }