본문 바로가기
programming | development/unity

삼각함수로 원 그리기

by foooo828 2022. 7. 15.

유니티에서 라이다 디버깅 뷰어용으로 쓸 원그리기

삼각함수를 활용하면 된다

반지름이 r 일때 길이가 1 인 벡터와 평행하고 길이는 r 배 만큼 증가했으므로 (x , y)는 스칼라 곱셈에 의해 $r\cdot (cos \theta , sin \theta) $가 됨

삼각함수 내용 정리 :  https://8trian8.tistory.com/93

 

[이득우 게임수학] 삼각함수

4.1 삼각함수$\theta$ : 한 각이 직각인 삼각형에서 밑변과 빗변의 사이각삼각비 : 직각삼각형을 구성하는 세 변에서 두 변을 뽑아 각각의 비럐관계를 나타낸것사인 Sine $sin\theta$ =$a \over c$코사인 Cos

8trian8.tistory.com

 

유니티 코드

public static class TrigonometricFunctions
{
    // 1° = π⁄180 
    const float Rad = (Mathf.PI * 2) / 360;

    // 데카르트 좌표계 버전
    // 파라미터 : 앵커 포지션, 각도분해능, 그릴 각도, 반지름 
    public static Vector3[] Cartasian2DCircleLineGroup(Vector3 anchorPosition, int drawCount, float offset,
        float radius)
    {
        Vector3[] pointGroup = new Vector3[drawCount];
        for (int i = 0; i < drawCount; i++)
        {
            var dro = i * Rad + offset;
            // 엥커위치 + 각도방향벡터 * 반지름값
            pointGroup[i] = anchorPosition + new Vector3(Mathf.Cos(dro), Mathf.Sin(dro), 0) * radius;
        }
        return pointGroup;
    }
}

void Cartesian_Draw2DCircle()
{
    int drawCount = (int) (degree / angularResolution);
    var lineGroup = TrigonometricFunctions.Cartasian2DCircleLineGroup(anchorPosition, drawCount, offset, radius);
    for (int i = 0; i < degree; i++)
    {
        Debug.DrawLine(anchorPosition, lineGroup[i]);
    }
}

 

극좌표계 버전

public static class TrigonometricFunctions
{
  // 1° = π⁄180 
    const float Rad = (Mathf.PI * 2) / 360;

    .
    .

    // 극 좌표계 버전
    public static Vector3[] Polar2DCircleLineGroup(Vector3 anchorPosition, float[] radius, float offset)
    {
        Vector3[] pointGroup = new Vector3[radius.Length];
        for (int i = 0; i < radius.Length; i++)
        {
            var dro = i * Rad + offset;
            pointGroup[i] =anchorPosition+ new Vector3(radius[i] * Mathf.Cos(dro), radius[i] * Mathf.Sin(dro), 0);
        }
        return pointGroup;
    }
}
    void Polar_Draw2DCircle()
    {
        int drawCount = (int) (degree / angularResolution);
        var dataGroup = CreateDistanceDataWithCurve(drawCount);
        var lineGroup = TrigonometricFunctions.Polar2DCircleLineGroup(anchorPosition, dataGroup, offset);
        for (int i = 0; i < drawCount; i++)
        {
            Debug.DrawLine(anchorPosition, lineGroup[i]);
        }
    }

// 애니메이션 커브로 데이터 만들기
float[] CreateDistanceDataWithCurve(int count)
{
    var testCoordinate = new float[count];
    for (int i = 0; i < count; i++)
    {
        float n = (1f / count) * i;
        testCoordinate[i] = curve.Evaluate(n) * radius;
    }
    return testCoordinate;
}

'programming | development > unity' 카테고리의 다른 글

Unity AnimationCurve 활용  (0) 2023.04.18
Unity + Realsense F200  (0) 2022.06.14
HDRP Raytracing 세팅  (0) 2022.03.14
Unity + OpenCV OpticalFlowPyrLK + Visual Effect Graph  (0) 2022.03.10
Component Inspector 항목들  (0) 2022.02.26

댓글