geogebra.kernel.AlgoClasses.java Source code

Java tutorial

Introduction

Here is the source code for geogebra.kernel.AlgoClasses.java

Source

/* 
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
    
This file is part of GeoGebra.
    
This program is free software; you can redistribute it and/or modify it 
under the terms of the GNU General Public License as published by 
the Free Software Foundation.
    
 */

package geogebra.kernel;

import geogebra.kernel.arithmetic.NumberValue;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

import org.apache.commons.math.stat.Frequency;

public class AlgoClasses extends AlgoElement {

    private static final long serialVersionUID = 1L;
    private GeoList dataList; //input
    private GeoNumeric start; //input
    private GeoNumeric width; //input
    private GeoNumeric numClasses; //input

    private GeoList classList; //output   

    // for compute
    private GeoList value = new GeoList(cons);

    AlgoClasses(Construction cons, String label, GeoList dataList, GeoNumeric start, GeoNumeric width,
            GeoNumeric numClasses) {
        super(cons);
        this.dataList = dataList;
        this.start = start;
        this.width = width;
        this.numClasses = numClasses;

        classList = new GeoList(cons);
        setInputOutput();
        compute();
        classList.setLabel(label);

    }

    public String getClassName() {
        return "AlgoClasses";
    }

    protected void setInputOutput() {

        ArrayList<GeoElement> tempList = new ArrayList<GeoElement>();

        tempList.add(dataList);

        if (start != null)
            tempList.add(start);

        if (width != null)
            tempList.add(width);

        if (numClasses != null)
            tempList.add(numClasses);

        input = new GeoElement[tempList.size()];
        input = tempList.toArray(input);

        output = new GeoElement[1];
        output[0] = classList;
        setDependencies(); // done by AlgoElement
    }

    GeoList getResult() {
        return classList;
    }

    protected final void compute() {

        // Validate input arguments
        //=======================================================

        if (!dataList.isDefined() || dataList.size() == 0) {
            classList.setUndefined();
            return;
        }

        if (!(dataList.getElementType() == GeoElement.GEO_CLASS_TEXT
                || dataList.getElementType() == GeoElement.GEO_CLASS_NUMERIC)) {
            classList.setUndefined();
            return;
        }

        classList.setDefined(true);
        classList.clear();

        // Get data max and min 
        //=======================================================

        double minGeoValue = 0;
        double maxGeoValue = 0;
        String minGeoString;
        String maxGeoString;

        if (dataList.getElementType() == GeoElement.GEO_CLASS_NUMERIC) {
            minGeoValue = ((GeoNumeric) dataList.get(0)).getDouble();
            maxGeoValue = ((GeoNumeric) dataList.get(0)).getDouble();
            for (int i = 1; i < dataList.size(); i++) {
                double geoValue = ((GeoNumeric) dataList.get(i)).getDouble();
                minGeoValue = Math.min(geoValue, minGeoValue);
                maxGeoValue = Math.max(geoValue, maxGeoValue);
            }

        } else {
            minGeoString = ((GeoText) dataList.get(0)).toValueString();
            maxGeoString = ((GeoText) dataList.get(0)).toValueString();
            for (int i = 1; i < dataList.size(); i++) {
                String geoString = ((GeoText) dataList.get(i)).toValueString();
                if (geoString.compareTo(minGeoString) < 0)
                    minGeoString = geoString;
                if (geoString.compareTo(maxGeoString) < 0)
                    maxGeoString = geoString;
            }
        }

        // Create class list using number of classes   
        //=======================================================

        if (input.length == 2) {

            int n = (int) numClasses.getDouble();
            if (n < 1)
                classList.setUndefined();

            double width = (maxGeoValue - minGeoValue) / n;
            for (int i = 0; i < n; i++) {
                classList.add(new GeoNumeric(cons, minGeoValue + i * width));
            }
            classList.add(new GeoNumeric(cons, maxGeoValue));

        }

        // Create class list using start and width    
        //=======================================================
        if (input.length == 3) {
            double value = start.getDouble();
            classList.add(new GeoNumeric(cons, value));
            while (value < maxGeoValue) {
                value = value + width.getDouble();
                //System.out.println("value: " + value + "max: " + maxGeoValue);
                classList.add(new GeoNumeric(cons, value));
            }
            if (classList.size() < 2)
                classList.setUndefined();
        }
    }

}