3D 공간에서 정점 배열로 정의 된 볼록 다각형 (면)의 배열로 정의 된 닫힌 볼록 다면체가 있습니다. 균일 한 밀도를 가정하면서 다면체의 중심을 찾으려고합니다. 지금이 의사 코드의 알고리즘으로 계산합니다.볼록 다면체의 중심체
public Vector3 getCentroid() {
Vector3 centroid = (0, 0, 0);
for (face in faces) {
Vector3 point = face.centroid;
point.multiply(face.area());
centroid.add(point);
}
centroid.divide(faces.size());
return centroid;
}
이것은 기본적으로 얼굴 중심의 가중 평균을 취합니다. 나는 올바른 알고리즘을 온라인으로 찾을 수 없었기 때문에 이것이 올바른지 100 % 확신하지 못했습니다. 누군가 내 알고리즘을 확인하거나 올바른 알고리즘을 사용할 수 있다면 감사하게 생각합니다.
감사합니다.
[편집] 그래서 여기
내가 중심을 찾기 위해 사용하고있는 실제 자바 코드입니다. 다면체를 임의의 점에서 수렴하는 피라미드로 분할합니다. 피라미드 중심의 가중 평균은 다음 공식을 기반으로합니다.
C 모든 = SUM 모든 피라미드 (C 피라미드 * 볼륨 피라미드)/부피 여기서 모든
은 (심하게 코드 주석)이다
// Compute the average of the facial centroids.
// This gives an arbitrary point inside the polyhedron.
Vector3 avgPoint = new Vector3(0, 0, 0);
for (int i = 0; i < faces.size(); i++) {
avgPoint.add(faces.get(i).centroid);
}
avgPoint.divide(faces.size());
// Initialise the centroid and the volume.
centroid = new Vector3(0, 0, 0);
volume = 0;
// Loop through each face.
for (int i = 0; i < faces.size(); i++) {
Face face = faces.get(i);
// Find a vector from avgPoint to the centroid of the face.
Vector3 avgToCentroid = face.centroid.clone();
avgToCentroid.sub(avgPoint);
// Gives the unsigned minimum distance between the face and a parallel plane on avgPoint.
float distance = avgToCentroid.scalarProjection(face.getNormal());
// Finds the volume of the pyramid using V = 1/3 * B * h
// where: B = area of the pyramid base.
// h = pyramid height.
float pyramidVolume = face.getArea() * distance/3;
// Centroid of a pyramid is 1/4 of the height up from the base.
// Using 3/4 here because vector is travelling 'down' the pyramid.
avgToCentroid.multiply(0.75f);
avgToCentroid.add(avgPoint);
// avgToCentroid is now the centroid of the pyramid.
// Weight it by the volume of the pyramid.
avgToCentroid.multiply(pyramidVolume);
volume += pyramidVolume;
}
// Average the weighted sum of pyramid centroids.
centroid.divide(volume);
을
내가 가질 수있는 질문이 있으시면 언제든지 문의 해주십시오. 오류를 지적하거나 오류를 지적하십시오.
matlab code을 게시했습니다. – dmuir
[이 답변] (http://stackoverflow.com/a/4824248/71059)의 "[Edit]" "비슷한 질문에 대한 비트가 잘 보입니다. – AakashM
코드에서 중심을 초기화했지만 루프 내부에서 사용하지 않았습니다. 귀하의 공식에 따르면, 당신은 최종 모든 볼륨의 합계로 그것을 나눕니다. centroid.ad (avgToCentroid)의 모든 avgToCentroid의 중심을 합산해서는 안됩니까? 볼륨과 모든 피라미드 볼륨의 합이 같은가? –