/// <summary> /// Face 의 면적을 계산한다. /// 단, 다각형의 면적 계산은 정확하지 않다. (개선 필요함) /// /// 면적계산을 상대좌표를 상관이 없기 때문에 사용한다. /// </summary> /// <returns>Face 면적</returns> public double calcArea(CFace face) { double dArea = 0; double minX = 0; double maxX = 0; double minY = 0; double maxY = 0; /// Rectangle 은 4 좌표의 평균점을 사용한다. if (face.FaceType == EMFaceType.RECTANGLE) { face.getMinMaxX(ref minX, ref maxX); face.getMinMaxY(ref minY, ref maxY); /// 가로, 세로 곱 return((maxX - minX) * (maxY - minY)); } /// Polygon 의 다각형 면적 계산은 단순한 형상에서만 가능하고 오차가 있는 것으로 판단된다. /// 추후 : 검증하라. else { /// The last vertex is the 'previous' one to the first int j = face.RelativePointList.Count - 1; for (int i = 0; i < face.RelativePointList.Count; i++) { dArea += (face.RelativePointList[j].m_dX + face.RelativePointList[i].m_dX) * (face.RelativePointList[j].m_dY - face.RelativePointList[i].m_dY); j = i; /// j is previous vertex to i } return(Math.Abs(dArea / 2.0f)); } }
/// <summary> /// Face 의 면적을 계산한다. /// /// 면적계산을 상대좌표를 상관이 없기 때문에 사용한다. public double calcArea(CFace face) { double dArea = 0; double minX = 0; double maxX = 0; double minY = 0; double maxY = 0; /// Rectangle 은 4 좌표의 평균점을 사용한다. if (face.FaceType == EMFaceType.RECTANGLE) { face.getMinMaxX(ref minX, ref maxX); face.getMinMaxY(ref minY, ref maxY); /// 가로, 세로 곱 dArea = Math.Abs((maxX - minX) * (maxY - minY)); } // 다각형 면적계산 알고리즘 : https://mathworld.wolfram.com/PolygonArea.html else { // 가장 마지막 항 (xn*y1 과 yn*x1) 을 첫번째로 우선처리하기 위한 설정한다. // // - 계산 순서는 점이 3개라면 자료의 수식 순서와 달리 아래와 같이 마지막항이 가장 앞으로 위치한다. // x3y1 + x1y2 + x2y3 // y3x1 + y1x2 + y2x3 int j = face.RelativePointList.Count - 1; for (int i = 0; i < face.RelativePointList.Count; i++) { dArea += (face.RelativePointList[j].X * face.RelativePointList[i].Y) - (face.RelativePointList[j].Y * face.RelativePointList[i].X); j = i; /// j is previous vertex to i } dArea = Math.Abs(dArea / 2.0f); } return(dArea); }