質問編集履歴

4

円や三角形を描画しているところを見つけやすいようにコメントをコードの中に追加しました。

2017/06/26 06:17

投稿

TRON1216
TRON1216

スコア18

test CHANGED
File without changes
test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
  h01dBrush3 = (HBRUSH)SelectObject(hdc, hBrush3);
88
88
 
89
- Ellipse( hdc, 293.5-7.479, 281-7.479, 293.5+7.479, 281+7.479);
89
+ Ellipse( hdc, 293.5-7.479, 281-7.479, 293.5+7.479, 281+7.479); //ウィンドウの中心にシアンの色の円(地球)を描画
90
90
 
91
91
  DeleteObject(hPen3);
92
92
 
@@ -280,9 +280,9 @@
280
280
 
281
281
 
282
282
 
283
- if ( channel== 1 ) Ellipse(hdc, j[k]-2.039, y[k]-2.039, j[k]+2.039, y[k]+2.039);
283
+ if ( channel== 1 ) Ellipse(hdc, j[k]-2.039, y[k]-2.039, j[k]+2.039, y[k]+2.039); //黄色の円(月)を描画
284
-
284
+
285
- if ( channel== 4 ) Ellipse(hdc, j[k]-0.1, y[k]-0.1, j[k]+0.1, y[k]+0.1);
285
+ if ( channel== 4 ) Ellipse(hdc, j[k]-0.1, y[k]-0.1, j[k]+0.1, y[k]+0.1); //緑の円(探査機)を描画
286
286
 
287
287
  if ( channel== 2 ) {
288
288
 
@@ -322,7 +322,7 @@
322
322
 
323
323
  }
324
324
 
325
-
325
+ //太陽の方向を三角形(矢印)で描画
326
326
 
327
327
  }
328
328
 

3

添付コードについてもう少し丁寧な補足をしました。

2017/06/26 06:17

投稿

TRON1216
TRON1216

スコア18

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ![イメージ説明](e0d140da4a53056fb60461ffaebe46aa.jpeg)
6
6
 
7
- ソースコードに関しては、三つのウィンドウプロシージャのうち、xy平面についてのもの(WndProc3.cpp)、メモリ軸を描画する関数(disp_axes2.cpp)、xy座標を描画する関数(disp_xy.cpp)を添付しておきます。xz、yz、についても、これとコードはほぼ同じです。
7
+ ソースコードに関しては、三つのウィンドウプロシージャのうち、xy平面についてのもの(WndProc3.cpp)、メモリ軸を描画する関数(disp_axes2.cpp)、xy座標を描画する関数(disp_xy.cpp)を添付しておきます。xz、yz、についても、これとコードはほぼ同じです。残り二つのウィンドウプロシージャと、xz、yz座標を描画する関数のコードも載せたかったのですが、最大文字数に達してしまい、全てを添付できませんでした。ご了承ください。
8
8
 
9
9
  ```ここに言語を入力
10
10
 

2

ウィンドウプロシージャとメモリ軸を描画する関数、座標を描画する関数のコードを添付しました。

2017/06/26 06:12

投稿

TRON1216
TRON1216

スコア18

test CHANGED
File without changes
test CHANGED
@@ -4,4 +4,446 @@
4
4
 
5
5
  ![イメージ説明](e0d140da4a53056fb60461ffaebe46aa.jpeg)
6
6
 
7
+ ソースコードに関しては、三つのウィンドウプロシージャのうち、xy平面についてのもの(WndProc3.cpp)、メモリ軸を描画する関数(disp_axes2.cpp)、xy座標を描画する関数(disp_xy.cpp)を添付しておきます。xz、yz、についても、これとコードはほぼ同じです。
8
+
9
+ ```ここに言語を入力
10
+
11
+ WndProc3.cpp
12
+
13
+
14
+
15
+ #include "kobayashi.h"
16
+
17
+ #define ID_MYTIMER 1
18
+
19
+
20
+
21
+
22
+
23
+ LRESULT CALLBACK WndProc3( HWND hWnd3, UINT msg, WPARAM wp, LPARAM lp )
24
+
25
+ {
26
+
27
+ HDC hdc;
28
+
29
+ PAINTSTRUCT ps;
30
+
31
+ HPEN hPen3,h01dPen3;
32
+
33
+ HBRUSH hBrush3, h01dBrush3;
34
+
35
+
36
+
37
+
38
+
39
+ RECT rect;// ウィンドウの描画領域を格納する構造体
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+ switch (msg) {
48
+
49
+ case WM_CREATE:
50
+
51
+ SetTimer(hWnd3, 1, 50, NULL);
52
+
53
+ break;
54
+
55
+
56
+
57
+ case WM_TIMER:
58
+
59
+ if (wp != 1)
60
+
61
+ return (DefWindowProc(hWnd3, msg, wp, lp));
62
+
63
+ k +=1;
64
+
65
+ InvalidateRect(hWnd3, NULL, TRUE);
66
+
67
+ break;
68
+
69
+
70
+
71
+ case WM_PAINT:
72
+
73
+ hdc = BeginPaint( hWnd3, &ps );// 画面のデバイスコンテキストを得て描画
74
+
75
+ GetClientRect( hWnd3, &rect );// ウィンドウの描画領域を得る
76
+
77
+
78
+
79
+ PatBlt( hdc, 0, 0, rect.right, rect.bottom, BLACKNESS );// 最初に黒く塗りつぶす
80
+
81
+ hPen3 = CreatePen(PS_SOLID, 10, RGB(0,160,233));
82
+
83
+ h01dPen3 = (HPEN)SelectObject(hdc, hPen3);
84
+
85
+ hBrush3 = CreateSolidBrush(RGB(0,160,233));
86
+
87
+ h01dBrush3 = (HBRUSH)SelectObject(hdc, hBrush3);
88
+
89
+ Ellipse( hdc, 293.5-7.479, 281-7.479, 293.5+7.479, 281+7.479);
90
+
91
+ DeleteObject(hPen3);
92
+
93
+
94
+
95
+ if ( IsDlgButtonChecked( hDlg, IDC_CHECK_DISPLAY1 ) == BST_CHECKED ) disp_xy( hdc, rect, hDlg, 1 );// データを表示する
96
+
97
+ if ( IsDlgButtonChecked( hDlg, IDC_CHECK_DISPLAY2 ) == BST_CHECKED ) disp_xy( hdc, rect, hDlg, 2 );// データを表示する
98
+
99
+ if ( IsDlgButtonChecked( hDlg, IDC_CHECK_DISPLAY3 ) == BST_CHECKED ) disp_xy( hdc, rect, hDlg, 3 );// データを表示する
100
+
101
+ if ( IsDlgButtonChecked( hDlg, IDC_CHECK_DISPLAY4 ) == BST_CHECKED ) disp_xy( hdc, rect, hDlg, 4 );// データを表示する
102
+
103
+ disp_axes2( hdc, rect );
104
+
105
+
106
+
107
+ EndPaint( hWnd3, &ps );// 描画終り
108
+
109
+
110
+
111
+ ReleaseDC( hWnd3, hdc );// 画面のデバイスコンテキストhdcを破棄する
112
+
113
+ break;
114
+
115
+
116
+
117
+ case WM_LBUTTONDOWN:
118
+
119
+ KillTimer(hWnd5, 1);
120
+
121
+ KillTimer(hWnd4, 1);
122
+
123
+ KillTimer(hWnd3, 1);
124
+
125
+ KillTimer(hWnd2, 1);
126
+
127
+ sprintf_s(szBuf, 256, "月面高度%12.2ekm %d番目のデータ",EQL_MOON[k]-1737,k);
128
+
129
+ MessageBox(NULL, szBuf, "位置情報", MB_OK);
130
+
131
+ break;
132
+
133
+
134
+
135
+ case WM_RBUTTONDOWN:
136
+
137
+ SendMessage(hWnd5, WM_CREATE, 0,0);
138
+
139
+ SendMessage(hWnd4, WM_CREATE, 0,0);
140
+
141
+ SendMessage(hWnd3, WM_CREATE, 0,0);
142
+
143
+ SendMessage(hWnd2, WM_CREATE, 0,0);
144
+
145
+ break;
146
+
147
+
148
+
149
+ case WM_DESTROY:
150
+
151
+ KillTimer(hWnd3, 1);
152
+
153
+ PostQuitMessage(0);
154
+
155
+ break;
156
+
157
+ default:
158
+
159
+ return (DefWindowProc(hWnd3, msg, wp, lp));
160
+
161
+ }
162
+
163
+ return 0;
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+ }
172
+
173
+
174
+
175
+ ```
176
+
177
+
178
+
179
+ ```ここに言語を入力
180
+
181
+ disp_xy.cpp
182
+
183
+
184
+
185
+ #include "kobayashi.h"
186
+
187
+ #define _USE_MATH_DEFINES
188
+
189
+ #include <math.h>
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+ // xy平面にデータを表示する関数
198
+
199
+ BOOL disp_xy( HDC hdc, RECT rect, HWND hDlg, int channel )
200
+
201
+ {
202
+
203
+ COLORREF color;
204
+
205
+
206
+
207
+ if ( (channel < 1) || (channel > 4) ) return FALSE;// チャンネル指定が間違っていた場合
208
+
209
+
210
+
211
+ // プロット色を決める
212
+
213
+ if ( channel == 1 ) color = RGB(255,153,0);// チャンネル1はYellow
214
+
215
+ if ( channel == 2 ) color = RGB(228,0,127);// チャンネル2はMagenta
216
+
217
+ if ( channel == 3 ) color = RGB(0,160,233);// チャンネル3はCyan
218
+
219
+ if ( channel == 4 ) color = RGB(51,153,102);// チャンネル4は緑
220
+
221
+ HPEN hPen_xy = CreatePen( PS_SOLID, 9, color);
222
+
7
- ソースコードに関しては、どこが問題なか見当がつかず、かといってプログラム全て添付するのも大変なので、載せていません。
223
+ SelectObject( hdc, hPen_xy );// hdcで上記ペン使うために選ぶ
224
+
225
+ HBRUSH hBrush_xy, h01dBrush_xy;
226
+
227
+ hBrush_xy = CreateSolidBrush(color);
228
+
229
+ h01dBrush_xy = (HBRUSH)SelectObject(hdc, hBrush_xy);
230
+
231
+
232
+
233
+ int nop= rect.right - rect.left + 1;
234
+
235
+
236
+
237
+ double ppd= (rect.bottom - rect.top)/10.0;// 縦方向1div当たり何ピクセルか
238
+
239
+
240
+
241
+ if ( channel == 4 )
242
+
243
+ j[k] = (int)( ((double)rect.right/2.0) + ((double)XEQL[k]/100000*(nop/10.0)+ 0.5) );
244
+
245
+ if ( channel == 1 )
246
+
247
+ j[k] = (int)( ((double)rect.right/2.0) + ((double)XMOON[k]/100000*(nop/10.0)+ 0.5) );
248
+
249
+ if ( channel == 2 ){
250
+
251
+ j[k] = (int)( 293.5/*((double)rect.right/2.0)*/ + 275*cos(a3[k]) );
252
+
253
+ if(XSUN[k]<0)
254
+
255
+ j[k] = 293.5-(j[k]-293.5);
256
+
257
+ }
258
+
259
+
260
+
261
+
262
+
263
+ if ( channel == 4 )
264
+
265
+ y[k] = (int)( ((double)rect.bottom/2.0) - ((double)YEQL[k]/100000)*ppd + 0.5 );
266
+
267
+ if ( channel == 1 )
268
+
269
+ y[k] = (int)( ((double)rect.bottom/2.0) - ((double)YMOON[k]/100000)*ppd + 0.5 );
270
+
271
+ if ( channel == 2 ){
272
+
273
+ y[k] = (int)( 281-275*sin(a3[k]) );
274
+
275
+ if(XSUN[k]<0)
276
+
277
+ y[k] = 281+(281-y[k]);
278
+
279
+
280
+
281
+
282
+
283
+ if ( channel== 1 ) Ellipse(hdc, j[k]-2.039, y[k]-2.039, j[k]+2.039, y[k]+2.039);
284
+
285
+ if ( channel== 4 ) Ellipse(hdc, j[k]-0.1, y[k]-0.1, j[k]+0.1, y[k]+0.1);
286
+
287
+ if ( channel== 2 ) {
288
+
289
+ HPEN hPen_SUN = CreatePen( PS_SOLID, 0, RGB(228,0,127));
290
+
291
+ SelectObject( hdc, hPen_SUN );
292
+
293
+ HBRUSH hBrush_SUN, h01dBrush_SUN;
294
+
295
+ hBrush_SUN = CreateSolidBrush( RGB(228,0,127));
296
+
297
+ h01dBrush_SUN = (HBRUSH)SelectObject(hdc, hBrush_SUN);
298
+
299
+ if(XSUN[k]>0 && YSUN[k]>0){
300
+
301
+ POINT pt[3]={{j[k],y[k]}, {j[k]-15*cos(a3[k]-M_PI/12),y[k]+15*sin(a3[k]-M_PI/12)}, {j[k]-15*sin(5*M_PI/12-a3[k]),y[k]+15*cos(5*M_PI/12-a3[k])}};
302
+
303
+ Polygon(hdc, pt, 3);
304
+
305
+ }
306
+
307
+ if(XSUN[k]<0 && YSUN[k]>0){
308
+
309
+ POINT pt[3]={{j[k],y[k]}, {j[k]+15*sin(a3[k]+5*M_PI/12),y[k]+15*cos(a3[k]+5*M_PI/12)}, {j[k]+15*cos(-M_PI/12-a3[k]),y[k]+15*sin(-M_PI/12-a3[k])}};
310
+
311
+ Polygon(hdc, pt, 3);
312
+
313
+ }
314
+
315
+ if(XSUN[k]<0 && YSUN[k]<0){
316
+
317
+ POINT pt[3]={{j[k],y[k]}, {j[k]+15*cos(a3[k]-M_PI/12),y[k]-15*sin(a3[k]-M_PI/12)}, {j[k]+15*sin(5*M_PI/12-a3[k]),y[k]-15*cos(5*M_PI/12-a3[k])}};
318
+
319
+ Polygon(hdc, pt, 3);
320
+
321
+ DeleteObject( hPen_SUN );
322
+
323
+ }
324
+
325
+
326
+
327
+ }
328
+
329
+
330
+
331
+ DeleteObject( hPen_xy );// ペンを破棄する
332
+
333
+
334
+
335
+
336
+
337
+ return TRUE;// 戻り値TRUEを返す
338
+
339
+ }
340
+
341
+
342
+
343
+
344
+
345
+ ```
346
+
347
+
348
+
349
+ ```ここに言語を入力disp_axes2.cpp
350
+
351
+ #include "kobayashi.h"
352
+
353
+
354
+
355
+ // ウィンドウ中に目盛軸を描く関数
356
+
357
+ BOOL disp_axes2( HDC hdc, RECT rect )
358
+
359
+ {
360
+
361
+ int i, x, y;// forで使う変数iと、縦横のグリッド線を引くときのx座標とy座標
362
+
363
+
364
+
365
+ HPEN hPen_a = CreatePen( PS_DOT, 0, RGB(0,0,0));// 黒色、破線のペンを作る(注:白と黒の破線になる)
366
+
367
+ SelectObject( hdc, hPen_a );// hdcで上記のペンを使うために選ぶ
368
+
369
+ double hdiv = (double)(rect.right - rect.left)/10.0;
370
+
371
+ double vdiv = (double)(rect.bottom - rect.top)/10.0;
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+
383
+ for ( i=0; i<=10; i++ ) {// 縦線を描く
384
+
385
+ x = (int)( hdiv * (double)i + 0.5 );
386
+
387
+ MoveToEx(hdc, x, rect.top, NULL);//ペンを移動する
388
+
389
+ LineTo(hdc, x, rect.bottom);//線を引く
390
+
391
+
392
+
393
+ if ( i == 0 )
394
+
395
+ TextOut(hdc, x, rect.bottom-20, "-5*10^5",7);
396
+
397
+ if ( i == 5 )
398
+
399
+ TextOut(hdc, x, rect.bottom-20, "0",1);
400
+
401
+ if ( i == 9 )
402
+
403
+ TextOut(hdc, x, rect.bottom-20, "5*10^5",6);
404
+
405
+ }
406
+
407
+
408
+
409
+ for ( i=0; i<=10; i++ ) {// 横線を描く
410
+
411
+ y = (int)( vdiv * (double)i + 0.5 );
412
+
413
+ MoveToEx(hdc, rect.left, y, NULL);
414
+
415
+ LineTo(hdc, rect.right, y);
416
+
417
+ if ( i == 0 ){
418
+
419
+ TextOut(hdc, rect.left, y, "5*10^5",6);
420
+
421
+ }
422
+
423
+ if ( i == 5 ){
424
+
425
+ TextOut(hdc, rect.left, y, "0",1);
426
+
427
+ }
428
+
429
+
430
+
431
+ }
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+ DeleteObject( hPen_a );// ペンを破棄する
440
+
441
+
442
+
443
+ return TRUE;
444
+
445
+ }
446
+
447
+
448
+
449
+ ```

1

写真を直接載せました

2017/06/26 06:07

投稿

TRON1216
TRON1216

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,7 @@
1
- ある物体の円運動をタイマーを使って描画させるプログラムを作っています。xーy平面での運動を描画するウィンドウ、xーz平面での描画のウィンドウ、yーz平面での描画のウィンドウ計3つ出して、座標データのファイルを選択すると、3つのウィンドウに円運動が描画される流れにしました。実行できたのですが、なぜか運動の途中(全座標データがプロットされる前)に物体塗られている色が白色になったりするバグといいますかエラーが起きます。ウィンドウを一つだけ出して、実行した時は全座標データがプロットされるまで問題なく描画されました。ですが3つウィンドウを出すとこのような謎の現象が起きます。何が原因なのか検討もつかず、どなたかアドバイスいただけないでしょうか、、? 開発環境は、Visual studio C++です。下のリンクは正常な描画の時の写真と、エラー(白くなる)時の写真です。状況がイメージしやすいかなと思い添付します。
1
+ ある物体の円運動をタイマーを使って描画させるプログラムを作っています。xーy平面での運動を描画するウィンドウ、xーz平面での描画のウィンドウ、yーz平面での描画のウィンドウ計3つ出して、座標データのファイルを選択すると、3つのウィンドウに円運動が描画される流れにしました。実行できたのですが、なぜか運動の途中(全座標データがプロットされる前)に物体塗られている色が白色になったりするバグといいますかエラーが起きます。ウィンドウを一つだけ出して、実行した時は全座標データがプロットされるまで問題なく描画されました。ですが3つウィンドウを出すとこのような謎の現象が起きます。何が原因なのか検討もつかず、どなたかアドバイスいただけないでしょうか、、? 開発環境は、Visual studio C++です。下は正常な描画の時の写真と、エラー(白くなる)時の写真です。状況がイメージしやすいかなと思い添付します。
2
2
 
3
- https://www.evernote.com/shard/s343/nl/2147483647/c1932bc4-9c8d-40c8-b06d-a70fbbdd49c8/
3
+ ![イメージ説明](1729e4bf203fe286eae2113c8a28084d.jpeg)
4
4
 
5
-
5
+ ![イメージ説明](e0d140da4a53056fb60461ffaebe46aa.jpeg)
6
6
 
7
7
  ソースコードに関しては、どこが問題なのか見当がつかず、かといってプログラム全てを添付するのも大変なので、載せていません。