Package org.osm2world.core.map_elevation.data

Source Code of org.osm2world.core.map_elevation.data.EleConnectorGroup

package org.osm2world.core.map_elevation.data;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.osm2world.core.math.PolygonWithHolesXZ;
import org.osm2world.core.math.PolygonXYZ;
import org.osm2world.core.math.SimplePolygonXZ;
import org.osm2world.core.math.TriangleXYZ;
import org.osm2world.core.math.TriangleXZ;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.math.VectorXZ;


/**
* TODO document
*
* This only exists to make it easier for WorldObjects to manage a large
* number of EleConnectors.
*/
public class EleConnectorGroup implements Iterable<EleConnector> {

  //TODO make private
  public final List<EleConnector> eleConnectors;
 
  public EleConnectorGroup() {
    this(new ArrayList<EleConnector>());
  }
 
  private EleConnectorGroup(List<EleConnector> eleConnectors) {
    this.eleConnectors = eleConnectors;
  }
 
  public void addConnectorsFor(Iterable<VectorXZ> positions,
      Object reference, GroundState groundState) {
   
    for (VectorXZ pos : positions) {
      eleConnectors.add(new EleConnector(pos, reference, groundState));
    }
   
  }
 
  public void addConnectorsFor(PolygonWithHolesXZ polygon,
      Object reference, GroundState groundState) {
   
    addConnectorsFor(polygon.getOuter().getVertices(), reference, groundState);
   
    for (SimplePolygonXZ hole : polygon.getHoles()) {
      addConnectorsFor(hole.getVertices(), reference, groundState);
    }
   
  }

  public void addConnectorsForTriangulation(Iterable<TriangleXZ> triangles,
      Object reference, GroundState groundState) {
    //TODO check later whether this method is still necessary
   
    Set<VectorXZ> positions = new HashSet<VectorXZ>();
   
    for (TriangleXZ t : triangles) {
      positions.add(t.v1);
      positions.add(t.v2);
      positions.add(t.v3);
    }
   
    addConnectorsFor(positions, null, groundState);
   
  }

  public void add(EleConnector newConnector) {
   
    eleConnectors.add(newConnector);
       
  }
 
  public void addAll(Iterable<EleConnector> newConnectors) {
   
    for (EleConnector c : newConnectors) {
      eleConnectors.add(c);
    }
   
  }
 
  public EleConnector getConnector(VectorXZ pos) {
    //TODO review this method (parameters sufficient? necessary at all?)
   
    for (EleConnector eleConnector : eleConnectors) {
      if (eleConnector.pos.equals(pos)) {
        return eleConnector;
      }
    }
   
    return null;
    //TODO maybe ... throw new IllegalArgumentException();
   
  }
 
  public List<EleConnector> getConnectors(Iterable<VectorXZ> positions) {
   
    List<EleConnector> connectors = new ArrayList<EleConnector>();
   
    for (VectorXZ pos : positions) {
      EleConnector connector = getConnector(pos);
      connectors.add(connector);
      if (connector == null) {
        throw new IllegalArgumentException();
      }
    }
   
    return connectors;
   
  }

  public VectorXYZ getPosXYZ(VectorXZ pos) {
   
    EleConnector c = getConnector(pos);
   
    if (c != null) {
     
      return c.getPosXYZ();
     
    } else {
     
      return pos.xyz(0);
      //TODO maybe ... throw new IllegalArgumentException();
     
    }
   
  }

  public List<VectorXYZ> getPosXYZ(Collection<VectorXZ> positions) {
   
    List<VectorXYZ> result = new ArrayList<VectorXYZ>(positions.size());
   
    for (VectorXZ pos : positions) {
      result.add(getPosXYZ(pos));
    }
   
    return result;
   
  }

  public PolygonXYZ getPosXYZ(SimplePolygonXZ polygon) {
    return new PolygonXYZ(getPosXYZ(polygon.getVertexLoop()));
  }
 
  public Collection<TriangleXYZ> getTriangulationXYZ(
      Collection<? extends TriangleXZ> trianglesXZ) {
   
    Collection<TriangleXYZ> trianglesXYZ =
        new ArrayList<TriangleXYZ>(trianglesXZ.size());
   
    for (TriangleXZ triangleXZ : trianglesXZ) {
     
      VectorXYZ v1 = getPosXYZ(triangleXZ.v1);
      VectorXYZ v2 = getPosXYZ(triangleXZ.v2);
      VectorXYZ v3 = getPosXYZ(triangleXZ.v3);
     
      if (triangleXZ.isClockwise()) { //TODO: ccw test should not be in here, but maybe in triangulation util
        trianglesXYZ.add(new TriangleXYZ(v3, v2, v1));
      } else  {
        trianglesXYZ.add(new TriangleXYZ(v1, v2, v3));
      }
     
    }
   
    return trianglesXYZ;
   
  }
 
  @Override
  public Iterator<EleConnector> iterator() {
    return eleConnectors.iterator();
  }
 
  public static final EleConnectorGroup EMPTY = new EleConnectorGroup(
      Collections.<EleConnector>emptyList());
 
}
TOP

Related Classes of org.osm2world.core.map_elevation.data.EleConnectorGroup

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.