teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ついでに

2020/07/05 06:59

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -5,4 +5,76 @@
5
5
  for(j = 0; j < 9; j++){
6
6
  out_buf[j][8 - i] = in_buf[i][j];
7
7
  }
8
+ ```
9
+
10
+ ついでに
11
+ -----
12
+
13
+ 以下のように座標値変換(回転後の座標値を求める方法)でもできます。
14
+ ```C++
15
+ #include <stdio.h>
16
+ #include <string.h>
17
+
18
+ #define SIZE 3
19
+
20
+ // 座標値を時計回りに90度回転
21
+ void rot90( int *px, int *py)
22
+ {
23
+ int x(*px), y(*py);
24
+ *px = SIZE - y - 1;
25
+ *py = x;
26
+ }
27
+
28
+ // 座標値を回転
29
+ // direc : 0=反時計, 1=時計回り
30
+ // angle : x90度
31
+ void rot( int *px, int *py, int direc, int angle)
32
+ {
33
+ int lop = direc == 1 ? (angle % 4) : (4 - (angle % 4));
34
+ for( int i = 0; i < lop; i++){
35
+ rot90( px, py);
36
+ }
37
+ }
38
+
39
+ // 図形を回転
40
+ void rotate( char src[][SIZE+1], char dst[][SIZE+1], int direc, int angle)
41
+ {
42
+ for( int y = 0; y < SIZE; y++){
43
+ for( int x = 0; x < SIZE; x++){
44
+ char c = src[y][x];
45
+ int dx(x), dy(y);
46
+ rot( &dx, &dy, direc, angle);
47
+ dst[dy][dx] = c;
48
+ }
49
+ }
50
+ }
51
+
52
+ // 図形をprint
53
+ void print( char s[][SIZE+1])
54
+ {
55
+ for( int y = 0; y < SIZE; y++){
56
+ printf("%s\n", s[y]);
57
+ }
58
+ }
59
+
60
+ int main(void)
61
+ {
62
+ char src[SIZE][SIZE+1] = { "-+-",
63
+ "+++",
64
+ "---"};
65
+ char dst[SIZE][SIZE+1];
66
+
67
+ for( int direc = 0; direc < 2; direc++){
68
+ for( int angle = 0; angle < 4; angle++){
69
+ memset( dst, 0, sizeof(dst));
70
+ printf("direc=%d, angle=%d\n", direc, angle);
71
+ printf("src=====\n");
72
+ print( src);
73
+ rotate( src, dst, direc, angle);
74
+ printf("dst=====\n");
75
+ print( dst);
76
+ }
77
+ }
78
+ return 0;
79
+ }
8
80
  ```