* @param aPI
     * @param x
     * @param twoPI
     * @param decimalPlacePrecision
     * @param a_Generic_BigDecimal
     * @param aRoundingMode
     * @return
     */
    protected static BigDecimal sinAngleBetweenZeroAndPI(
            BigDecimal x,
            BigDecimal aPI,
            BigDecimal twoPI,
            Generic_BigDecimal a_Generic_BigDecimal,
            int decimalPlacePrecision,
            RoundingMode aRoundingMode) {
        BigDecimal aPIBy2 = Generic_BigDecimal.divideRoundIfNecessary(
                aPI,
                BigInteger.valueOf(2),
                decimalPlacePrecision + 2,
                aRoundingMode);
        // sinx = 1-(x^3)/(3!)+(x^5)/(5!)-(x^7)/(7!)+... (1)
        Generic_BigInteger aGeneric_BigInteger = a_Generic_BigDecimal._Generic_BigInteger;
        if (x.compareTo(BigDecimal.ZERO) != -1 && x.compareTo(aPIBy2) != 1) {
            BigDecimal precision = new BigDecimal(BigInteger.ONE, decimalPlacePrecision + 4);
            BigDecimal sinx = new BigDecimal(x.toString());
            int factor = 3;
            BigInteger factorial;
            BigDecimal power;
            boolean alternator = true;
            while (true) {
                factorial = aGeneric_BigInteger.factorial(factor);
                power = Generic_BigDecimal.power(
                        x,
                        factor,
                        decimalPlacePrecision + 2, aRoundingMode);
                BigDecimal division = Generic_BigDecimal.divideRoundIfNecessary(
                        power,
                        factorial,
                        decimalPlacePrecision + 2, aRoundingMode);
                if (division.compareTo(precision) != -1) {
                    if (alternator) {
                        alternator = false;
                        sinx = sinx.subtract(division);
                    } else {
                        alternator = true;
                        sinx = sinx.add(division);
                    }
                } else {
                    break;
                }
                factor += 2;
            }
            sinx = Generic_BigDecimal.roundIfNecessary(
                    sinx, decimalPlacePrecision, aRoundingMode);
            return sinx;
        }
        return null;
    }