public double getLatticeAngle(double arcFraction) {
        if (arcLattice == null) {
            generateArcLattice();
        }

        if (arcFraction < 0) {
            return 0;
        }

        double hemispherePortion = (int)(arcFraction / 0.5) * Math.PI;

        double remainderArcLength = (arcFraction % 0.5) * latticeArcLength;
        int startI = 0, endI = arcLattice.length - 1, middleI;
        while (endI - startI > 1) {
            middleI = (endI - startI)/2 + startI;
            if (remainderArcLength >= arcLattice[middleI]) {
                startI = middleI;
                continue;
            }
            if (remainderArcLength <= arcLattice[middleI]) {
                endI = middleI;
                continue;
            }
        }
        double remainderPortion = ((remainderArcLength - arcLattice[startI])/(arcLattice[endI] - arcLattice[startI]) + startI)*ARC_ANGLE;

        return (hemispherePortion + remainderPortion) % (Math.PI * 2);
    }