Hamutaro
공부 좀 해라★彡/DirectX

Direct 2D 별 그리기★

요미 ★ 2024. 2. 29.

목차

더럽지만..내가 그림판으로 그린 그림.. 먼저 보면..

Direct 2D 별 그리기★
후덜덜 광기

기본적으로 다각형(그 중에서 삼각형, 오각형) 그리는 법을 알아야 한다. 
삼각형의 가운데 중간점을 찍을 수 있으면 쉽게 풀릴 수 있다.

현재 각도 랑 다음 각도의 반을 나눠서 cos하면 해당 길이를 알 수 있다 하지만 길이도 반이 되야 하므로 또 반으로 나눠줌

//main.cpp

//가운데 정점 구하는 법
cos((angle + nextAngle) *0.5f) * 0.5f, sin((angle + nextAngle) *0.5f) * 0.5f

이것만 구해주면 쉽다.

0->2->1
0->3->2 ... 이런 식으로 가다가 마지막에는 1 정점으로 가줘야 한다.

따라서 아래와 같은 코드가 만들어집니다! 

//main.cpp

FOR(count * 2) //#define FOR(n) for(int i = 0 ; i < n ; i++)
{
    indices.push_back(0); // 중심점 인덱스
    if (i + 1 < count * 2)
        indices.push_back(i + 2);
    else
        indices.push_back(1); // 마지막 모서리의 다음은 첫 번째 모서리로 연결
    indices.push_back(i + 1);
}

 

 

총 코드 ↓ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ ☆★ 

//main.cpp

UINT count = 5; // 버텍스 갯수
//Polygon : 정점 3개로 이루어진 3차원 상의 평면
//정점순서의 시계방향을 앞면으로 하며 앞면만 출력
float stepAngle = XM_2PI / count; // 2Pi나누기 count
//360/5 = 73

VertexColor center(0, 0, 0, 1, 1); // 원점과 색상 //(점x,점y,색R,색G,색B)

vertices.push_back(center); //center 추가 //0 index

//각 버텍스 설정 
FOR(count)
{
    float angle = stepAngle * i;        
    float nextAngle = stepAngle * (i + 1);
    // 현재 모서리의 정점 추가
    vertices.emplace_back(cos(angle), sin(angle), 0, 0, 1); 
    // 현재 모서리의 다음 모서리 정점 추가
    //현재랑 다음 모서리의 가운데 정점
    vertices.emplace_back(cos((angle + nextAngle) *0.5f) * 0.5f, sin((angle + nextAngle) *0.5f) * 0.5f, 0, 0, 1);
}

vertexBuffer = new VertexBuffer(vertices.data(), sizeof(VertexColor), vertices.size());

//0->2->1
//0->3->2
//...
//0->10->1
FOR(count * 2)
{
    indices.push_back(0); // 중심점 인덱스
    if (i + 1 < count * 2)
        indices.push_back(i + 2);
    else
        indices.push_back(1); // 마지막 모서리의 다음은 첫 번째 모서리로 연결
    indices.push_back(i + 1);
}

Direct 2D 별 그리기★
결과~