Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / tin / smoothTinBezier / SmoothTinBezierAlgorithm.java @ 59

History | View | Annotate | Download (7 KB)

1
/**
2
 *    @author              Josef Bezdek, ZCU Plzen
3
 *          @version             1.0
4
 *    @since                 JDK1.5
5
 */
6

    
7

    
8
package es.unex.sextante.tin.smoothTinBezier;
9

    
10
import java.util.TreeMap;
11

    
12
import com.vividsolutions.jts.geom.Coordinate;
13
import com.vividsolutions.jts.geom.GeometryFactory;
14
import com.vividsolutions.jts.geom.LinearRing;
15
import com.vividsolutions.jts.index.strtree.STRtree;
16

    
17
import es.unex.sextante.additionalInfo.AdditionalInfoNumericalValue;
18
import es.unex.sextante.additionalInfo.AdditionalInfoVectorLayer;
19
import es.unex.sextante.core.GeoAlgorithm;
20
import es.unex.sextante.core.Sextante;
21
import es.unex.sextante.dataObjects.IFeature;
22
import es.unex.sextante.dataObjects.IFeatureIterator;
23
import es.unex.sextante.dataObjects.IRecord;
24
import es.unex.sextante.dataObjects.IVectorLayer;
25
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
26
import es.unex.sextante.outputs.OutputVectorLayer;
27

    
28
public class SmoothTinBezierAlgorithm
29
         extends
30
            GeoAlgorithm {
31

    
32
   public static final String TIN        = "TIN";
33
   public static final String TINB       = "TINB";
34
   public static final String LoD        = "LoD";
35
   public static final String Smooth     = "Smooth";
36

    
37
   private IVectorLayer       m_Triangles;
38
   private IVectorLayer       m_TrianglesOut;
39
   private int                m_LoD;
40
   private double             m_Smooth;
41

    
42
   private STRtree            trianglesIndex;
43
   Coordinate[][]             triangles;
44
   TreeMap                    breakLines = new TreeMap();
45
   Bezier                     miniBezierTriangles[];
46

    
47

    
48
   @Override
49
   public void defineCharacteristics() {
50

    
51
      setName(Sextante.getText("Bezier_surface"));
52
      setGroup(Sextante.getText("TIN"));
53
      setUserCanDefineAnalysisExtent(false);
54
      final String[] sDistance = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
55

    
56
      try {
57
         m_Parameters.addInputVectorLayer(TIN, Sextante.getText("TIN"), AdditionalInfoVectorLayer.SHAPE_TYPE_POLYGON, true);
58

    
59
         m_Parameters.addSelection(LoD, Sextante.getText("Level_of_detail"), sDistance);
60
         m_Parameters.addNumericalValue(Smooth, Sextante.getText("Smoothing_coef"),
61
                  AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE, 1, 0.1, 1);
62

    
63
         addOutputVectorLayer(TINB, Sextante.getText("Result"), OutputVectorLayer.SHAPE_TYPE_POLYGON);
64
      }
65
      catch (final Exception e) {
66
         Sextante.addErrorToLog(e);
67
      }
68

    
69
   }
70

    
71

    
72
   @Override
73
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
74

    
75
      int i;
76
      int iShapeCount;
77
      double scaleZ = Double.NEGATIVE_INFINITY;
78

    
79

    
80
      m_Triangles = m_Parameters.getParameterValueAsVectorLayer(TIN);
81
      m_LoD = m_Parameters.getParameterValueAsInt(LoD);
82
      m_Smooth = m_Parameters.getParameterValueAsDouble(Smooth);
83

    
84
      final Class types[] = { Integer.class, String.class, Integer.class };
85
      final String sNames[] = { "ID", "HardLines", "type" };
86
      m_TrianglesOut = getNewVectorLayer(TINB, m_Triangles.getName() + "_bezier", IVectorLayer.SHAPE_TYPE_POLYGON, types, sNames);
87

    
88

    
89
      i = 0;
90
      iShapeCount = m_Triangles.getShapesCount();
91
      triangles = new Coordinate[iShapeCount][3];
92
      IFeatureIterator iter = m_Triangles.iterator();
93
      try {
94
         //                        dd.addField(Integer.class);
95
         //                        PageStore ps = new MemoryPageStore(dd);
96
         trianglesIndex = new STRtree();
97
         while (iter.hasNext()) {
98
            final IFeature feature = iter.next();
99
            //TODO: this is supposed to be TIN input, so we should check an throw an error if
100
            //TODO: we get a polygon which is not a triangle!
101

    
102
            final IRecord record = feature.getRecord();
103
            if (((String) record.getValue(1)) == "Y") {
104
               breakLines.put(i, record.getValue(2));
105
            }
106

    
107
            triangles[i][0] = (Coordinate) feature.getGeometry().getCoordinates()[0].clone();
108
            triangles[i][1] = (Coordinate) feature.getGeometry().getCoordinates()[1].clone();
109
            triangles[i][2] = (Coordinate) feature.getGeometry().getCoordinates()[2].clone();
110
            //TODO: add fake Z-coordinates (0.0) if this is a 2D input TIN
111

    
112
            //                                data = new Data(dd);
113
            //                                data.addValue(i);
114

    
115
            //trianglesIndex.insert(trianglePolygon.getEnvelopeInternal(), new Integer(i));
116
            trianglesIndex.insert(feature.getGeometry().getEnvelopeInternal(), new Integer(i));
117

    
118
            /* DEBUG */
119
            System.err.println("TRIANGLE " + i + " = " + triangles[i][0] + ", " + triangles[i][1] + ", " + triangles[i][2]);
120

    
121
            for (int k = 0; k < 2; k++) {
122
               final double diffZ = triangles[i][k].z - triangles[i][k + 1].z;
123
               final double diffXY = Math.sqrt(Math.pow((triangles[i][k].x - triangles[i][k + 1].x), 2)
124
                                               + Math.pow((triangles[i][k].y - triangles[i][k + 1].y), 2));
125

    
126
               //TODO: if
127
               if (scaleZ < Math.abs(diffZ / diffXY)) {
128
                  scaleZ = Math.abs(diffZ / diffXY);
129
               }
130
            }
131
            setProgress(i, 2 * iShapeCount);
132
            i++;
133
         }
134
         iter.close();
135
      }
136
      catch (final Exception e) {
137
         e.printStackTrace();
138
      }
139

    
140
      // TODO: what happens if we have only fake Z coordinates (=0.0) ???
141
      // TODO: in that case, scaleZ*m_smooth (see below) will be = 0
142
      // TODO: would that be a problem?
143
      System.err.println("SCALEZ = " + scaleZ);
144

    
145
      m_Triangles = null;
146
      iter = null;
147
      final BezierSurface bezierSurface = new BezierSurface(triangles, trianglesIndex, breakLines, scaleZ * m_Smooth, m_LoD + 1);
148

    
149

    
150
      int indexOfInterpolatedTriangles = 0;
151
      while (bezierSurface.hasNext()) {
152
         setProgress(i++, 2 * iShapeCount);
153
         final Coordinate newTin[][] = bezierSurface.nextTrinagle();
154
         System.err.println("GOT " + newTin.length + " TRIANGLES");
155
         for (int l = 0; l < newTin.length; l++) {
156
            final Object[] record = { new Integer(indexOfInterpolatedTriangles), "", -1 };
157
            final GeometryFactory gf = new GeometryFactory();
158
            final Coordinate[] coords = new Coordinate[4];
159
            for (int m = 0; m < 3; m++) {
160
               coords[m] = newTin[l][m];
161
               if (coords[m] != null) {
162
                  /* DEBUG */
163
                  System.err.println(coords[m]);
164
               }
165

    
166
            }
167
            coords[3] = newTin[l][0];
168

    
169
            /* DEBUG */
170
            System.err.println(coords[3]);
171

    
172
            /* BUG */
173
            //TODO: for some reason, bezierSurface.nextTriangle() only writes invalid triangles into newTin[][]
174
            //TODO: this leads to gf.createLinearRing() falling over
175
            final LinearRing ring = gf.createLinearRing(coords);
176
            m_TrianglesOut.addFeature(gf.createPolygon(ring, null), record);
177
            indexOfInterpolatedTriangles++;
178
         }
179
      }
180
      return !m_Task.isCanceled();
181
   }
182

    
183
}