2017-11-25 12 views
0

나는 c에서 2 차원 어레이 조작으로 실험하고있었습니다. 나는 내 연구를하고 함께했다 특히 2 차원 형태의 현재 위치에서 회전, 그래서 :C에서 직사각형 배열의 2D 회전

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define RAD(x) ((x) * 3.14/180) 

char shape[3][3] = {{1, 1, 1}, 
        {1, 0, 1}, 
        {1, 1, 1}}; 

char nf[5][5]= {{0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}, 
       {0, 0, 0, 0, 0}}; 

char expa[5][5]= {{0, 0, 1, 0, 0}, 
        {0, 1, 0, 1, 0}, 
        {1, 0, 0, 0, 1}, 
        {0, 1, 0, 1, 0}, 
        {0, 0, 1, 0, 0}}; 

void print(int row, int col, char shapein[][col]) { 
    for (int i = 0; i < row; ++i) { 
    for (int j = 0; j < col; ++j) { 
     printf("%c", ((shapein[i][j]) == 1) ? '#' : ' '); 
    } 
    printf("\n"); 
    } 
} 

void main() { 
    int nw = 5; 
    int nh = 5; 

    int xf = nw/2; 
    int yf = nh/2; 
    float angle = RAD(90); 


    for (int i = 0; i < 3; ++i) { 
    for (int j = 0; j < 3; ++j) { 
     int nx = ((i - xf) * cos(angle) - (j - yf) * sin(angle)) + xf; 
     int ny = ((i - xf) * sin(angle) + (j - yf) * cos(angle)) + yf; 

     nf[nx][ny] = shape[i][j]; 
    } 
    } 

    print(5, 5, nf); 
} 

이 같은 출력을 얻을 것으로 예상했다 : 내가 얻을 그러나 무엇

OK output

을 입니다 :

Wrong output

나는 내 연구에서 이해 무슨 짓

: - rotati 원점에서 일어나는 일 (왼쪽 상단을 가정) - 원점 눈금이되도록 이동 된 좌표. - 회전 할 때 출력 배열의 치수를 공백으로 사용합니다.

나는 혼란스럽고, 조금 도움이 필요합니다. 내 코드에서 알 수 있듯이 새로운 원형 치수를 하드 코딩했습니다. "최대 모서리"방법을 사용하지 않고 새로운 회전 치수를 동적으로 계산하는 방법을 알려주는 것이 좋을 것입니다. . 예상

+0

색인을 얻으려면 문자 그대로 각도로 회전하고 있습니까? – coderredoc

+0

그렇습니다. 나는 인덱스를 좌표 – user3414321

답변

1
  1. 는 45 ° 회전 shape 같은 모습을 보여 결과,하지만 당신은 90도까지 각도를 설정합니다.

  2. 부동 소수점 기능을 사용하지만 정수 좌표로 작업하고 있습니다. sincos 루틴은 반드시 근사값을 반환하며 부동 소수점 값이 정수로 변환되면 잘립니다. 아마도 round 함수를 사용하여 반올림을 선호 할 수 있습니다.

  3. xfyfnw/2nh/2를 사용하여 이미지의 중심으로 설정 될 나타나지만 정수이므로, 그 결과, 각각의 경우에 (2)는 실제 중심 250로부터 상당한 거리이다.

추가 오류가 발생할 수 있지만이를 수정하고 계속 작업해야합니다. 또한 코드를 디버깅하는 단계를 수행하십시오. 루프 내부에서 xf, yf, nxny의 각 값을 인쇄하여 계산의 입력과 출력을 볼 수 있습니다. 그것들이 옳은지 아닌지 수동으로 확인하십시오. 그들이 맞지 않다면, 개별 계산을 검토하여 그들이하는 일을 확인하십시오.

+0

으로 고정 시켰고 sin (90) == 1과 cos (90) == 0을 사용하여 코드를 단순화했습니다 ... (실제로 (아주) PI 및 sin 부정확성으로 인해, 그리고 그러한 낮은 (정수) 인덱스에서는 결과가 좋지 않을 것입니다!) –