첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 볼록 다각형 여부 구하기

------------------------------------------------------------------------------------------------------------------------

using System.Collections.Generic;

using System.Drawing;

 

#region 외적 구하기 - GetCrossProduct(aX, aY, bX, bY, cX, cY)

 

/// <summary>

/// 외적 구하기

/// </summary>

/// <param name="aX">A X 좌표</param>

/// <param name="aY">A Y 좌표</param>

/// <param name="bX">B X 좌표</param>

/// <param name="bY">B Y 좌표</param>

/// <param name="cX">C X 좌표</param>

/// <param name="cY">C Y 좌표</param>

/// <returns>외적</returns>

/// <remarks>AB×BC 외적을 구합니다.</remarks>

public float GetCrossProduct(float aX, float aY, float bX, float bY, float cX, float cY)

{

    float abX = aX - bX;

    float abY = aY - bY;

    float cbX = cX - bX;

    float cbY = cY - bY;

 

    return (abX * cbY - abY * cbX);

}

 

#endregion

#region 볼록 다각형 여부 구하기 - IsConvexPolygon(sourcePointList)

 

/// <summary>

/// 볼록 다각형 여부 구하기

/// </summary>

/// <param name="sourcePointList">소스 포인트 리스트</param>

/// <returns>볼록 다각형 여부</returns>

public bool IsConvexPolygon(List<PointF> sourcePointList)

{

    bool isNegative = false;

    bool isPositive = false;

 

    int pointCount = sourcePointList.Count;

 

    int bPointIndex;

    int cPointIndex;

 

    for(int aPointIndex = 0; aPointIndex < pointCount; aPointIndex++)

    {

        bPointIndex = (aPointIndex + 1) % pointCount;

        cPointIndex = (bPointIndex + 1) % pointCount;

 

        float crossProduct = GetCrossProduct

        (

            sourcePointList[aPointIndex].X,

            sourcePointList[aPointIndex].Y,

            sourcePointList[bPointIndex].X,

            sourcePointList[bPointIndex].Y,

            sourcePointList[cPointIndex].X,

            sourcePointList[cPointIndex].Y

        );

 

        if(crossProduct < 0)

        {

            isNegative = true;

        }

        else if(crossProduct > 0)

        {

            isPositive = true;

        }

 

        if(isNegative && isPositive)

        {

            return false;

        }

    }

 

    return true;

}

 

#endregion

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요