view gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java @ 469:62fc63d0f71d

Added a new State in Product Verticalprofile in Timeseriespoints. Now it will be displayed the Years where measurements happened and than only the dates of the chosen Year will be fetched and displayed. gnv-artifacts/trunk@532 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Tue, 12 Jan 2010 12:42:53 +0000
parents f7038820df2e
children 9a828e5a2390
line wrap: on
line source
package de.intevation.gnv.raster;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

import gnu.trove.TIntObjectHashMap;
import gnu.trove.TIntHashSet;
import gnu.trove.TObjectProcedure;

import de.intevation.gnv.math.IJKey;

import de.intevation.gnv.raster.Vectorizer.Edge;

/**
 * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
 */
public class IsoProducer
extends      AbstractProducer
{
    public interface AttributeGenerator {

        Object generateAttribute(int neighbor1, int neighbor2);

    } // interface AttributeGenerator

    protected HashMap<Edge, Integer>            open;
    protected HashMap<IJKey, TIntObjectHashMap> commonOpen;
    protected HashMap<IJKey, ArrayList<Edge>>   complete;

    protected int    width;
    protected int    height;

    public IsoProducer(
        double minX, double minY,
        double maxX, double maxY
    ) {
        super(minX, minY, maxX, maxY);

        open       = new HashMap<Edge, Integer>();
        commonOpen = new HashMap<IJKey, TIntObjectHashMap>();
        complete   = new HashMap<IJKey, ArrayList<Edge>>();
    }

    public void handleRings(
        List<Edge> rings, 
        int        value, 
        int        width,
        int        height
    ) {
        if (value == -1) {
            return;
        }
        this.width  = width;
        this.height = height;

        Integer v = Integer.valueOf(value);

        for (Edge head: rings) {
            Edge current = head;
            do {
                Integer neighbor = open.remove(current);

                if (neighbor != null) {
                    IJKey pair = new IJKey(value, neighbor.intValue());
                    pair.sort();

                    TIntObjectHashMap co = commonOpen.get(pair);

                    if (co == null) {
                        commonOpen.put(pair, co = new TIntObjectHashMap());
                    }

                    Edge edge = new Edge(current);

                    Edge otherA = (Edge)co.remove(edge.a);
                    if (otherA != null) {
                        otherA.chain(edge, edge.a);
                    }

                    Edge otherB = (Edge)co.remove(edge.b);
                    if (otherB != null) {
                        otherB.chain(edge, edge.b);
                    }

                    if (edge.isComplete()) {
                        ArrayList list = complete.get(pair);
                        if (list == null) {
                            complete.put(pair, list = new ArrayList());
                        }
                        list.add(Vectorizer.simplify(edge, width));
                    }
                    else {
                        if (otherA == null) {
                            co.put(edge.a, edge);
                        }
                        if (otherB == null) {
                            co.put(edge.b, edge);
                        }
                    }
                }
                else {
                    Edge edge = new Edge(current.b, current.a);
                    open.put(edge, v);
                }

                current = current.next;
            }
            while (current != head);
        } // for all rings

    } // handleRings

    protected HashSet<IJKey> joinPairs() {
        HashSet<IJKey> pairs = new HashSet<IJKey>();
        pairs.addAll(complete  .keySet());
        pairs.addAll(commonOpen.keySet());
        return pairs;
    }

    protected static ArrayList<Edge> headList(TIntObjectHashMap map) {
        final ArrayList<Edge> headList = new ArrayList<Edge>();
        map.forEachValue(new TObjectProcedure() {
            TIntHashSet headSet = new TIntHashSet();
            public boolean execute(Object value) {
                Edge head = ((Edge)value).head();
                if (headSet.add(head.a)) {
                    headList.add(head);
                }
                return true;
            }
        });
        return headList;
    }

    public void clear() {
        open.clear();
        complete.clear();
        commonOpen.clear();
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org