Exemplo n.º 1
0
        /// <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));
            }
        }
Exemplo n.º 2
0
        /// <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);
        }