回答編集履歴

1

コード追加

2020/06/03 07:28

投稿

fana
fana

スコア11673

test CHANGED
@@ -17,3 +17,199 @@
17
17
  N段のピラミッドに関して各箱を置くべき座標を列挙してみるとよいでしょう.
18
18
 
19
19
  何パターンかのNに関する座標値を眺めてみて,**それらの座標値に法則性を見出してから**「だったら forでこう書けば良いんじゃね?」という実装に移ると良いでしょう.
20
+
21
+
22
+
23
+ ---
24
+
25
+
26
+
27
+ 追記:コード案
28
+
29
+
30
+
31
+ ```C++
32
+
33
+ //様子が見やすいようにてきとーに回転してみる用の角度
34
+
35
+ double RotAngle = 0;
36
+
37
+
38
+
39
+ void OnTimer(int)
40
+
41
+ {//回転量を変更して再描画を促す
42
+
43
+ RotAngle += 1;
44
+
45
+ if( RotAngle > 360 )RotAngle -= 360;
46
+
47
+ glutPostRedisplay();
48
+
49
+ glutTimerFunc( 50, OnTimer, 0 );
50
+
51
+ }
52
+
53
+
54
+
55
+ //
56
+
57
+ void display(void)
58
+
59
+ {
60
+
61
+ glClear(GL_COLOR_BUFFER_BIT);
62
+
63
+ glLoadIdentity();
64
+
65
+ //視点設定:見やすい位置に調整してどうぞ
66
+
67
+ gluLookAt(0.0, 2.0, 13.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
68
+
69
+ //様子が見やすいようにY軸まわりに回転してみる(回転量はOnTimerで一定時間ごとに変更している)
70
+
71
+ glRotated( RotAngle, 0,1,0 );
72
+
73
+
74
+
75
+ {//座標がわかりやすいように原点から3軸方向に線を描画
76
+
77
+ glBegin( GL_LINES );
78
+
79
+ {
80
+
81
+ const double AxisLength = 3.5; //線の長さ.てきとー.
82
+
83
+ glColor3d( 1,0,0 ); glVertex3d( 0,0,0 ); glVertex3d( AxisLength,0,0 );
84
+
85
+ glColor3d( 0,1,0 ); glVertex3d( 0,0,0 ); glVertex3d( 0,AxisLength,0 );
86
+
87
+ glColor3d( 0,0,1 ); glVertex3d( 0,0,0 ); glVertex3d( 0,0,AxisLength );
88
+
89
+ }
90
+
91
+ glEnd();
92
+
93
+ }
94
+
95
+ {//ピラミッド描画
96
+
97
+ const int N = 5; //これがピラミッドの段数
98
+
99
+ const double UnitSize = 0.5; //全体的なサイズ(ピラミッド最上段のCubeのサイズ)
100
+
101
+ glColor3d( 1,1,1 );
102
+
103
+
104
+
105
+ for( int i=0; i<N; ++i )//N段分のループ
106
+
107
+ {
108
+
109
+ glPushMatrix();
110
+
111
+ {
112
+
113
+ //段に応じてY方向に位置をずらす
114
+
115
+ const double Y_Offset = (i+0.5) * UnitSize;
116
+
117
+ glTranslated( 0, Y_Offset, 0 );
118
+
119
+ //段に応じて,XY方向の大きさを決める
120
+
121
+ const double XZ_Scale = UnitSize * (N - i);
122
+
123
+ glScaled( XZ_Scale, UnitSize, XZ_Scale );
124
+
125
+ //
126
+
127
+ glutWireCube( 1 );
128
+
129
+ }
130
+
131
+ glPopMatrix();
132
+
133
+ }
134
+
135
+ }
136
+
137
+ glFlush();
138
+
139
+ }
140
+
141
+
142
+
143
+ void resize(int w, int h)
144
+
145
+ {
146
+
147
+ glViewport(0, 0, w, h);
148
+
149
+ glMatrixMode(GL_PROJECTION);
150
+
151
+ glLoadIdentity();
152
+
153
+ gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
154
+
155
+ glMatrixMode(GL_MODELVIEW);
156
+
157
+ }
158
+
159
+
160
+
161
+ void keyboard(unsigned char key, int x, int y)
162
+
163
+ {
164
+
165
+ switch (key)
166
+
167
+ {//qキーかESCキーで終了させる
168
+
169
+ case 'q':
170
+
171
+ case 'Q':
172
+
173
+ case '\033': /* '\033' は ESC の ASCII コード */
174
+
175
+ exit(0);
176
+
177
+ default:
178
+
179
+ break;
180
+
181
+ }
182
+
183
+ }
184
+
185
+
186
+
187
+ int main(int argc, char *argv[])
188
+
189
+ {
190
+
191
+ glutInit(&argc, argv);
192
+
193
+ glutInitDisplayMode(GLUT_RGBA);
194
+
195
+ glutCreateWindow(argv[0]);
196
+
197
+ glutDisplayFunc(display);
198
+
199
+ glutReshapeFunc(resize);
200
+
201
+ //glutMouseFunc(mouse);
202
+
203
+ glutKeyboardFunc(keyboard);
204
+
205
+ glutTimerFunc( 50, OnTimer, 0 );
206
+
207
+ glClearColor(0, 0, 0, 1.0);
208
+
209
+ glutMainLoop();
210
+
211
+ return 0;
212
+
213
+ }
214
+
215
+ ```