2017-03-21 1 views
1

저는 현재 작업하고있는 Java 애플릿 프로젝트에 icosphere를 생성하려고합니다. 저는 20 면체에 대해 세분화 된 작업을했습니다.하지만 일단 단위 구상에 투영하려고하면 메쉬의 뾰족한 엉망이 생깁니다. 내가 올바르게 프로젝트에 솔루션을 온라인으로 보았다, 그리고 내가 다음 공식 사용한다고 말했습니다 : * 반경/크기가 새를 찾는 점을20 면체를 구로 세분하는 방법

내 코드를 가지고 정상화 포인트 = X/Y/Z 값을 다음 단위 구체 점이다

private Point3D createMiddlePoint(Point3D p1, Point3D p2){ 
    // not in cache, calculate it 
    Point3D middle = new Point3D(
     (int)((p1.x + p2.x)/2.0), 
     (int)((p1.y + p2.y)/2.0), 
     (int)((p1.z + p2.z)/2.0)); 

    // add vertex makes sure point is on unit sphere (Problem lies in these two statements) 
    double magnitude = Math.sqrt(Math.pow(middle.x-centerX,2)+Math.pow(middle.y-centerY,2)+Math.pow(middle.z,2)); 
    middle = new Point3D((int)((double)middle.x *size/(double)magnitude), (int)((double)middle.y/(double)magnitude), (int)((double)middle.z/(double)magnitude)); 

    return middle; 
}` 

센터 X와 센터 Y는 면체/구의 중심이고, 크기가 면체의 직경이고, I는 수식에 변수를 통합하는 데 어려움 오전 위.

도움을 주시면 감사하겠습니다.

답변

0

내가 잘못한 것을 알았습니다. 내 크기 변수는 실제로는 그렇지 않을 때 원의 직경이라고 가정했습니다. 그래서이를 해결하기 위해 구의 지름이 실제로 3 면체에서 20 면체와 교차하는 크기 * (1 + Math.sqrt (5))/2 인 것을 발견했습니다. 거기에서 구형 영역을 채우도록 내 다음 정점을 2/3 축소했습니다. 코드는 다음과 같습니다 : ` public void create (int recursionLevel) { int size = 2/3 * (1.0 + Math.sqrt (5.0))/2.0);

이이 이루어졌다 방법에 대한 자세한 내용은
vertices.add(new Point3D((-size*2/3 + centerX), t + centerY, 0)); 
    vertices.add(new Point3D(size*2/3 + centerX, t + centerY, 0)); 
    vertices.add(new Point3D(-size*2/3 + centerX, -t + centerY, 0)); 
    vertices.add(new Point3D(size*2/3 + centerX, -t + centerY, 0)); 

    vertices.add(new Point3D(centerX, -size*2/3 + centerY, t)); 
    vertices.add(new Point3D(centerX, size*2/3 + centerY, t)); 
    vertices.add(new Point3D(centerX, -size*2/3 + centerY, -t)); 
    vertices.add(new Point3D(centerX, size*2/3 + centerY, -t)); 

    vertices.add(new Point3D(t + centerX, centerY, -size)); 
    vertices.add(new Point3D(t + centerX, centerY, size)); 
    vertices.add(new Point3D(-t + centerX, centerY, -size)); 
    vertices.add(new Point3D(-t + centerX, centerY, size)); 



    // 5 faces around point 0 
    faces.add(new Triangle(vertices.get(0),vertices.get(11),vertices.get(5))); 
    faces.add(new Triangle(vertices.get(0), vertices.get(5), vertices.get(1))); 
    faces.add(new Triangle(vertices.get(0), vertices.get(1), vertices.get(7))); 
    faces.add(new Triangle(vertices.get(0), vertices.get(7), vertices.get(10))); 
    faces.add(new Triangle(vertices.get(0), vertices.get(10), vertices.get(11))); 

    // 5 adjacent faces 
    faces.add(new Triangle(vertices.get(1), vertices.get(5), vertices.get(9))); 
    faces.add(new Triangle(vertices.get(5), vertices.get(11), vertices.get(4))); 
    faces.add(new Triangle(vertices.get(11), vertices.get(10), vertices.get(2))); 
    faces.add(new Triangle(vertices.get(10), vertices.get(7), vertices.get(6))); 
    faces.add(new Triangle(vertices.get(7), vertices.get(1), vertices.get(8))); 

    // 5 faces around point 3 
    faces.add(new Triangle(vertices.get(3), vertices.get(9), vertices.get(4))); 
    faces.add(new Triangle(vertices.get(3), vertices.get(4), vertices.get(2))); 
    faces.add(new Triangle(vertices.get(3), vertices.get(2), vertices.get(6))); 
    faces.add(new Triangle(vertices.get(3), vertices.get(6), vertices.get(8))); 
    faces.add(new Triangle(vertices.get(3), vertices.get(8), vertices.get(9))); 

    // 5 adjacent faces 
    faces.add(new Triangle(vertices.get(4), vertices.get(9), vertices.get(5))); 
    faces.add(new Triangle(vertices.get(2), vertices.get(4), vertices.get(11))); 
    faces.add(new Triangle(vertices.get(6), vertices.get(2), vertices.get(10))); 
    faces.add(new Triangle(vertices.get(8), vertices.get(6), vertices.get(7))); 
    faces.add(new Triangle(vertices.get(9), vertices.get(8), vertices.get(1))); 

    Point3D a; 
    Point3D b; 
    Point3D c; 
    for (int i = 0; i < recursionLevel; i++) { 
     ArrayList<Face2D> faces2 = new ArrayList<Face2D>(); 
     while(faces.size() != 0){ 
      a = createMiddlePoint(faces.get(0).vertices[0], faces.get(0).vertices[1]); 
      b = createMiddlePoint(faces.get(0).vertices[1], faces.get(0).vertices[2]); 
      c = createMiddlePoint(faces.get(0).vertices[2], faces.get(0).vertices[0]); 

      faces2.add(new Triangle(faces.get(0).vertices[0], a, c)); 
      faces2.add(new Triangle(faces.get(0).vertices[1], b, a)); 
      faces2.add(new Triangle(faces.get(0).vertices[2], c, b)); 
      faces2.add(new Triangle(a, b, c)); 
      faces.remove(0); 
     } 
     System.out.println("Recursion Level: " + i + ", Faces:" + faces2.size()); 
     //System.out.println("" + (System.currentTimeMillis() - startTime)); 
     faces = faces2; 
    } 
} 

private Point3D createMiddlePoint(Point3D p1, Point3D p2){ 
    Point3D middle = new Point3D(
     (int)((p1.x + p2.x)/2.0 - centerX), 
     (int)((p1.y + p2.y)/2.0 - centerY), 
     (int)((p1.z + p2.z)/2.0)); 
    if(radius == -1){ 
     radius = (size*(1.0 + Math.sqrt(5.0)))/2; 
    } 
    // add vertex makes sure point is on unit sphere (Problem lies in these two statements) 
    double magnitude = Math.sqrt(Math.pow(middle.x,2)+Math.pow(middle.y,2)+Math.pow(middle.z,2)); 

    return new Point3D((int)((middle.x)*radius/magnitude) + centerX, (int)((middle.y)*radius/magnitude) + centerY, (int)(middle.z*radius/magnitude)); 
} 

방문 http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html

관련 문제