rrenkert@4618: package de.intevation.flys.artifacts.model;
rrenkert@4618: 
rrenkert@4618: import java.util.HashMap;
rrenkert@4618: import java.util.Map;
rrenkert@4618: import java.util.Set;
rrenkert@4618: import java.util.TreeMap;
rrenkert@4618: 
rrenkert@4618: import org.apache.log4j.Logger;
rrenkert@4618: 
rrenkert@4618: import de.intevation.flys.artifacts.math.Linear;
rrenkert@4618: 
rrenkert@4618: 
rrenkert@4618: public class ZoomScale
rrenkert@4618: {
rrenkert@4618:     private static Logger logger = Logger.getLogger(ZoomScale.class);
rrenkert@4618: 
rrenkert@4618:     private HashMap<String, TreeMap<Double, Double>> rivers;
rrenkert@4618: 
rrenkert@4618:     public ZoomScale() {
rrenkert@4618:         this.rivers = new HashMap<String, TreeMap<Double, Double>>();
rrenkert@4618:     }
rrenkert@4618: 
rrenkert@4618:     public ZoomScale(String river) {
rrenkert@4618:         this();
rrenkert@4618:         rivers.put(river, new TreeMap<Double, Double>());
rrenkert@4618:     }
rrenkert@4618: 
rrenkert@4618:     public double getRadius(String river, double lower, double upper) {
rrenkert@4618:         double range = Math.abs(upper) - Math.abs(lower);
rrenkert@4618:         TreeMap<Double, Double> ranges = rivers.get(river);
rrenkert@4618:         if (ranges == null) {
rrenkert@4618:             return 0.001;
rrenkert@4618:         }
rrenkert@4618:         Map.Entry<Double, Double> next = ranges.higherEntry(range);
rrenkert@4618:         Map.Entry<Double, Double> prev = ranges.lowerEntry(range);
rrenkert@4618:         double x0 = 0d;
rrenkert@4618:         double x1 = 0d;
rrenkert@4618:         double y0 = 0d;
rrenkert@4618:         double y1 = 0d;
rrenkert@4618:         if (prev == null && next != null) {
rrenkert@4618:             x1 = next.getKey();
rrenkert@4618:             y1 = next.getValue();
rrenkert@4618:         }
rrenkert@4618:         else if (prev != null && next == null) {
rrenkert@4618:             return prev.getValue();
rrenkert@4618:         }
rrenkert@4618:         else {
rrenkert@4618:             x0 = prev.getKey();
rrenkert@4618:             x1 = next.getKey();
rrenkert@4618:             y0 = prev.getValue();
rrenkert@4618:             y1 = next.getValue();
rrenkert@4618:         }
rrenkert@4618:         return Linear.linear(range, x0, x1, y0, y1);
rrenkert@4618:     }
rrenkert@4618: 
rrenkert@4618:     public void addRiver(String river) {
rrenkert@4618:         if (!this.rivers.containsKey(river)) {
rrenkert@4618:             this.rivers.put(river, new TreeMap<Double, Double>());
rrenkert@4618:         }
rrenkert@4618:     }
rrenkert@4618: 
rrenkert@4618:     public Set<String> getRivers() {
rrenkert@4618:         return this.rivers.keySet();
rrenkert@4618:     }
rrenkert@4618: 
rrenkert@4618:     public void addRange(String river, double range, double radius) {
rrenkert@4618:         if (this.rivers.containsKey(river)) {
rrenkert@4618:             this.rivers.get(river).put(range, radius);
rrenkert@4618:         }
rrenkert@4618:         else {
rrenkert@4618:             this.rivers.put(river, new TreeMap<Double, Double>());
rrenkert@4618:             this.rivers.get(river).put(range, radius);
rrenkert@4618:         }
rrenkert@4618:     }
rrenkert@4618: }