2016-08-07 15 views
2

私はDelaunay三角測量を行う方法を見つけましたが、入力が何であるかはよく分かりませんint[] x, int[] y, int[] z。あなたのコメントでは、それは問題を変換し、放物面にポイントを持ち上げると同様関数getEdgesの入力は何を意味しますか?

import java.awt.Point; 
import java.util.Iterator; 
import java.util.TreeSet; 

public class DelaunayTriangulation{ 
    int[][] adjMatrix; 

    DelaunayTriangulation(int size){ 
     this.adjMatrix = new int[size][size]; 
    } 
    public int[][] getAdj(){ 
     return this.adjMatrix; 
    } 
    // n = Number of points 
    // adjMatrix = what point is connected to what (double) 

    public TreeSet getEdges(int n, int[] x, int[] y, int[] z){ 
     TreeSet result = new TreeSet(); 

     if(n == 2){ 
      this.adjMatrix[0][1] = 1; 
      this.adjMatrix[1][0] = 1; 
      result.add(new GraphEdge(new GraphPoint(x[0], y[0]), new GraphPoint(x[1], y[1]))); 

      return result; 
     } 

     for(int i = 0; i < n - 2; i++){ 
      for(int j = i + 1; j < n; j++){ 
       for (int k = i + 1; k < n; k++){ 
        if(j == k){ 
         continue; 
        } 
        int xn = (y[j] - y[i]) * (z[k] - z[i]) - (y[k] - y[i]) * (z[j] - z[i]); 
        int yn = (x[k] - x[i]) * (z[j] - z[i]) - (x[j] - x[i]) * (z[k] - z[i]); 
        int zn = (x[j] - x[i]) * (y[k] - y[i]) - (x[k] - x[i]) * (y[j] - y[i]); 
        boolean flag; 
        if(flag = (zn < 0 ? 1 : 0) != 0){ 
         for(int m = 0; m < n; m++){ 
          flag = (flag) && ((x[m] - x[i]) * xn + (y[m] - y[i]) * yn + (z[m] - z[i]) * zn <= 0); 
         } 
        } 

        if (!flag){ 
         continue; 
        } 
        result.add(new GraphEdge(new GraphPoint(x[i], y[i]), new GraphPoint(x[j], y[j]))); 
        result.add(new GraphEdge(new GraphPoint(x[j], y[j]), new GraphPoint(x[k], y[k]))); 
        result.add(new GraphEdge(new GraphPoint(x[k], y[k]), new GraphPoint(x[i], y[i]))); 
        this.adjMatrix[i][j] = 1; 
        this.adjMatrix[j][i] = 1; 
        this.adjMatrix[k][i] = 1; 
        this.adjMatrix[i][k] = 1; 
        this.adjMatrix[j][k] = 1; 
        this.adjMatrix[k][j] = 1; 
       } 
      } 
     } 
     return result; 
    } 

    public TreeSet getEdges(TreeSet pointsSet){ 
     if((pointsSet != null) && (pointsSet.size() > 0)){ 
      int n = pointsSet.size(); 

      int[] x = new int[n]; 
      int[] y = new int[n]; 
      int[] z = new int[n]; 

      int i = 0; 

      Iterator iterator = pointsSet.iterator(); 
      while (iterator.hasNext()){ 
       Point point = (Point)iterator.next(); 

       x[i] = (int)point.getX(); 
       y[i] = (int)point.getY(); 
       z[i] = (x[i] * x[i] + y[i] * y[i]); 

       i++; 
      } 
      return getEdges(n, x, y, z); 
     } 
     return null; 
    } 
} 

答えて

1

その後、下の凸包を取り、第三座標を省略し2dに戻ってそれを投影します。

+0

これに加えて質問に直接答えると、x []とy []は点のx y座標です。zはx^2 + y^2です。 – doominabox1

+0

ありがとう!私もこれを追加したい。 3Dオブジェクトの凸包を見つけることは非常に複雑に思えます。http://stackoverflow.com/questions/18416861/how-to-find-convex-hull-in-a-3-dimensional-space – Bytemain

+1

n^3時間賢明な順番で、三角測量を行うより良い方法を知っていますか? – doominabox1

関連する問題