質問編集履歴

4

月と星を同時に描画できていた時の実行結果の一例など加えました

2018/10/25 11:42

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
File without changes
test CHANGED
@@ -452,8 +452,18 @@
452
452
 
453
453
  図1:月と星を同時に描画した時
454
454
 
455
- ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)
455
+ ![イメージ説明](eee4e337be9fcfa83f38fddb22ddff72.png)
456
456
 
457
457
  図2:星だけ描画した時
458
458
 
459
459
  ![イメージ説明](7b8e78fcbb71c2a805cf5d49d5d9069b.png)
460
+
461
+
462
+
463
+ star[i].x += (rect.right - rect.left) / 2;
464
+
465
+ star[i].y += (rect.bottom - rect.top) / 2;
466
+
467
+ と書き換えると
468
+
469
+ ![![イメージ説明](7f6fff1504f5f970efddd0872df1d79d.png)](46849720638852e605c4c7f37f3cfe60.png)

3

ダイアログプロシージャを追加しましたがそれ以外は文字数制限のため一旦削除しました

2018/10/25 11:42

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
File without changes
test CHANGED
@@ -4,48 +4,32 @@
4
4
 
5
5
  ```C++
6
6
 
7
- typedef struct{
8
-
9
- HINSTANCE hInst_bitmap;
7
+ //様々な作業の中心となるダイアログ
10
-
11
- HWND hWnd_bitmap;
8
+
12
-
13
- BYTE *lpBmpData;
14
-
15
- BITMAPINFO bmi;
16
-
17
- char *fname;
18
-
19
- int fsize;
20
-
21
- } IMG;
22
-
23
-
24
-
25
- LRESULT CALLBACK WndProc_bitmap( HWND hWnd_bitmap, UINT msg, WPARAM wp, LPARAM lp )
9
+ BOOL CALLBACK MyDlgProc( HWND hDlg, UINT msg, WPARAM wp, LPARAM lp )
26
10
 
27
11
  {
28
12
 
29
- IMG g_img;
30
-
31
- g_img.lpBmpData = NULL;
13
+ char *fname; // ファイル名
14
+
32
-
15
+ static FILE *fp; // FILEへのポインタ
16
+
33
- PAINTSTRUCT ps;
17
+ static FILE *fp1;
34
-
35
- HDC hdc, hdc_mem;
18
+
36
-
37
- HBITMAP hBmp;
19
+
38
-
39
- HBITMAP hBmp2;
20
+
40
-
41
- double x,y,z,r;
42
-
43
- int a, b, ab;
44
-
45
- double lam1,lam2,lam3;
21
+ int year, month, day, hour, min, sec; //ETを秒で求めたい年, 月, 日, 時, 分, 秒(UTC)
22
+
23
+
46
24
 
47
25
  int i;
48
26
 
27
+ double Time;
28
+
29
+ double Time_now;
30
+
31
+ double dt;
32
+
49
33
  double theta;
50
34
 
51
35
  double RA, DEC; //赤経、赤
@@ -54,49 +38,181 @@
54
38
 
55
39
 
56
40
 
57
- switch (msg) {
58
-
59
-
60
-
61
- case WM_CREATE:
62
-
63
- free(g_img.lpBmpData);
64
-
65
- break;
66
-
67
-
68
-
69
- case WM_TIMER:
70
-
71
- if (wp != ID_MYTIMER)
72
-
73
- return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
74
-
75
- g = g++;
76
-
77
-
78
-
79
- eql.x = rh[g].XEQL;
80
-
81
- eql.y = rh[g].YEQL;
82
-
83
- eql.z = rh[g].ZEQL;
84
-
85
-
86
-
87
- moon.x = rh[g].XMOON;
88
-
89
- moon.y = rh[g].YMOON;
90
-
91
- moon.z = rh[g].ZMOON;
92
-
93
-
94
-
95
- sun.x = rh[g].XSUN;
96
-
97
- sun.y = rh[g].YSUN;
98
-
99
- sun.z = rh[g].ZSUN;
41
+ switch(msg){
42
+
43
+ case WM_INITDIALOG:
44
+
45
+
46
+
47
+ //2019年12月26日12時0分0秒(UTC)に初期設定する。
48
+
49
+ SetDlgItemInt(hDlg, IDC_EDIT_Y, 2019, FALSE);
50
+
51
+ SetDlgItemInt(hDlg, IDC_EDIT_M, 12, FALSE);
52
+
53
+ SetDlgItemInt(hDlg, IDC_EDIT_D, 26, FALSE);
54
+
55
+ SetDlgItemInt(hDlg, IDC_EDIT_H, 12, FALSE);
56
+
57
+ SetDlgItemInt(hDlg, IDC_EDIT_MIN, 0, FALSE);
58
+
59
+ SetDlgItemInt(hDlg, IDC_EDIT_S, 0, FALSE);
60
+
61
+
62
+
63
+ CheckDlgButton( hDlg, IDC_CHECK_DISPLAY1, BST_UNCHECKED);
64
+
65
+
66
+
67
+ return TRUE;
68
+
69
+
70
+
71
+ case WM_COMMAND:
72
+
73
+ switch(LOWORD(wp)){
74
+
75
+ case IDC_BUTTON_OPEN1: // CH1のファイルを開く処理
76
+
77
+ if( fname = filename() ){
78
+
79
+ if ( fp ) fclose ( fp );
80
+
81
+ fopen_s ( &fp, fname, "r" );
82
+
83
+ //read_data(hDlg, fp, 1);
84
+
85
+ // MessageBox(NULL ,"座標ファイル読み込み成功", "CH1", MB_OK);// ファイルをテキスト読み込みモードで開く
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+ if (fname = filename()) {
94
+
95
+ if (fp1) fclose(fp1);
96
+
97
+ fopen_s(&fp1, fname, "r");
98
+
99
+ read_star(hDlg, fp1, 1);
100
+
101
+ //MessageBox(NULL, "星のデータ読み込み成功", "CH1", MB_OK);
102
+
103
+ fclose(fp1);
104
+
105
+ }
106
+
107
+
108
+
109
+ if (read_data(hDlg, fp, 1)) // CH1で読み込む
110
+
111
+ CheckDlgButton(hDlg, IDC_CHECK_DISPLAY1, BST_CHECKED);// チェックボタンを「表示」とする
112
+
113
+
114
+
115
+ fclose( fp );
116
+
117
+ InvalidateRect(hWnd, NULL, TRUE);
118
+
119
+ }
120
+
121
+
122
+
123
+
124
+
125
+ return TRUE;
126
+
127
+
128
+
129
+ case ID_OK://OKボタンが押された
130
+
131
+ //MessageBox(NULL ,"座標ファイル読み込み成功", "CH1", MB_OK);
132
+
133
+ //Time = et(year, month, day, hour, min, sec)/*GetDlgItemInt(hDlg, IDC_EDIT_ET, NULL, FALSE)*/;
134
+
135
+
136
+
137
+ year = GetDlgItemInt(hDlg, IDC_EDIT_Y, NULL, FALSE); //エディットボックスから年を読み込む
138
+
139
+ month = GetDlgItemInt(hDlg, IDC_EDIT_M, NULL, FALSE); //以下同様
140
+
141
+ day = GetDlgItemInt(hDlg, IDC_EDIT_D, NULL, FALSE);
142
+
143
+ hour = GetDlgItemInt(hDlg, IDC_EDIT_H, NULL, FALSE);
144
+
145
+ min = GetDlgItemInt(hDlg, IDC_EDIT_MIN, NULL, FALSE);
146
+
147
+ sec = GetDlgItemInt(hDlg, IDC_EDIT_S, NULL, FALSE);
148
+
149
+
150
+
151
+ //関数etに上記を引数として渡すと、秒で表されたElapsed Timeが戻される。
152
+
153
+ Time = et(year, month, day, hour, min, sec);
154
+
155
+
156
+
157
+ for(i=0; i<=total_n; i++){
158
+
159
+ if(rh[i].ET > Time){
160
+
161
+ g = i-1;
162
+
163
+ dt = Time - rh[g].ET;
164
+
165
+ //sprintf_s(szBuf, 256, "%d", g);
166
+
167
+ //MessageBox(NULL, szBuf, "超える直前のデータの番号", MB_OK);
168
+
169
+ break;
170
+
171
+ }
172
+
173
+
174
+
175
+ }
176
+
177
+
178
+
179
+ //sprintf_s(szBuf, 256, "%d %lf",g , dt);
180
+
181
+ //MessageBox(NULL, szBuf, "データ", MB_OK);
182
+
183
+
184
+
185
+ //sprintf_s(szBuf, 256, "%lf", haET);
186
+
187
+ //MessageBox(NULL, szBuf, "元データ", MB_OK);
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+ eql.x = rh[g].VXEQL * dt + rh[g].XEQL;
196
+
197
+ eql.y = rh[g].VYEQL * dt + rh[g].YEQL;
198
+
199
+ eql.z = rh[g].VZEQL * dt + rh[g].ZEQL;
200
+
201
+
202
+
203
+ moon.x = rh[g].VXMOON * dt + rh[g].XMOON;
204
+
205
+ moon.y = rh[g].VYMOON * dt + rh[g].YMOON;
206
+
207
+ moon.z = rh[g].VZMOON * dt + rh[g].ZMOON;
208
+
209
+
210
+
211
+ sun.x = rh[g].VXSUN * dt + rh[g].XSUN;
212
+
213
+ sun.y = rh[g].VYSUN * dt + rh[g].YSUN;
214
+
215
+ sun.z = rh[g].VZSUN * dt + rh[g].ZSUN;
100
216
 
101
217
 
102
218
 
@@ -108,11 +224,61 @@
108
224
 
109
225
 
110
226
 
227
+ //sprintf_s(szBuf, 256, "%lf %lf %lf %lf %lf %lf", eql.x , eql.y, eql.z, moon.x, moon.y, moon.z);
228
+
229
+ //MessageBox(NULL, szBuf, "eql.x, moon.x", MB_OK);
230
+
231
+
232
+
233
+ EQL_MOON = sqrtf((moon.x - eql.x)*(moon.x - eql.x) + (moon.y - eql.y)*(moon.y - eql.y) + (moon.z - eql.z)*(moon.z - eql.z));
234
+
235
+ SUN_MOON = sqrtf(sun.x * sun.x + sun.y * sun.y + sun.z * sun.z);
236
+
237
+ EARTH_MOON = sqrtf(moon.x * moon.x + moon.y * moon.y + moon.z * moon.z);
238
+
239
+
240
+
241
+ //t = 360*3474/(2*M_PI*EQL_MOON);//視直径を計算
242
+
243
+ s = (3474.0*0.00005) / EQL_MOON; //月の相対的な大きさを計算
244
+
245
+
246
+
247
+ //sprintf_s(szBuf, 256, "%lf %lf", EQL_MOON, s);
248
+
249
+ //MessageBox(NULL, szBuf, "EQL_MOON, s", MB_OK);
250
+
251
+
252
+
253
+ for(i=0; i<=total_n2; i++){
254
+
255
+ RA = 2*M_PI*(h[i].RA_h + h[i].RA_m/60 + h[i].RA_s/3600)/24; //単位を時で統一
256
+
257
+ DEC = 2*M_PI*(h[i].Dec_d + h[i].Dec_m/60 + h[i].Dec_s/3600)/360; //単位を度で統一
258
+
259
+ if (h[i].Dec_sig == FALSE) {
260
+
261
+ DEC = -DEC;
262
+
263
+ }
264
+
265
+ koukei = atan2(sin(M_PI*23.43 / 180)*sin(DEC)+cos(M_PI*23.43 / 180)*cos(DEC)*sin(RA),cos(DEC)*cos(RA)); //単位はrad
266
+
267
+ if (koukei < 0) {
268
+
269
+ koukei = koukei + 2 * M_PI; //単位はrad
270
+
271
+ }
272
+
273
+ koui = asin(cos(M_PI*23.43 / 180)*sin(DEC) - sin(M_PI*23.43 / 180)*cos(DEC)*sin(RA));
274
+
275
+
276
+
111
- star[i].x = cos(koui)*cos(koukei);
277
+ star[i].x = cos(koui)*cos(koukei);
112
-
278
+
113
- star[i].y = cos(koui)*sin(koukei);
279
+ star[i].y = cos(koui)*sin(koukei);
114
-
280
+
115
- star[i].z = sin(koui);
281
+ star[i].z = sin(koui);
116
282
 
117
283
  }
118
284
 
@@ -152,374 +318,138 @@
152
318
 
153
319
 
154
320
 
321
+ //座標変換3
322
+
323
+ theta = atan2(eql.x, eql.z);
324
+
325
+ eql = Cordi_Trans3(eql,theta);
326
+
327
+ sun = Cordi_Trans3(sun,theta);
328
+
329
+ earth = Cordi_Trans3(earth,theta);
330
+
331
+ for(i=0; i<=total_n2; i++){
332
+
333
+ star[i] = Cordi_Trans3(star[i], theta);
334
+
335
+ }
336
+
337
+
338
+
339
+ //座標変換4
340
+
341
+ theta = atan2(-sun.x, sun.y);
342
+
343
+ eql = Cordi_Trans2(eql,theta);
344
+
345
+ sun = Cordi_Trans2(sun,theta);
346
+
347
+ earth = Cordi_Trans2(earth,theta);
348
+
349
+ for(i=0; i<=total_n2; i++){
350
+
351
+ star[i] = Cordi_Trans2(star[i], theta);
352
+
353
+ if(star[i].z < 0){
354
+
355
+ star[i].x = star[i].x * (-50 / star[i].z);
356
+
357
+ star[i].y = star[i].y * (-50 / star[i].z);
358
+
359
+
360
+
361
+ star[i].x = (star[i].x) / 2 * (988.5 / 10);
362
+
363
+ star[i].y = (star[i].y) / 2 * (741 / 10);
364
+
365
+ }
366
+
367
+ }
368
+
369
+
370
+
371
+ if(sun.y > 0){
372
+
373
+ theta = atan2(-sun.x, sun.y) + M_PI;
374
+
375
+ eql = Cordi_Trans2(eql,theta);
376
+
377
+ sun = Cordi_Trans2(sun,theta);
378
+
379
+ earth = Cordi_Trans2(earth,theta);
380
+
381
+ for(i=0; i<=total_n2; i++){
382
+
383
+ star[i] = Cordi_Trans2(star[i], theta);
384
+
385
+ if(star[i].z < 0){
386
+
387
+ star[i].x = star[i].x * (-50 / star[i].z);
388
+
389
+ star[i].y = star[i].y * (-50 / star[i].z);
390
+
391
+
392
+
393
+ star[i].x = (star[i].x) / 2 * (988.5 / 10);
394
+
395
+ star[i].y = (star[i].y) / 2 * (741 / 10);
396
+
397
+ }
398
+
399
+ }
400
+
401
+ }
402
+
403
+
404
+
405
+
406
+
407
+ //sprintf_s(szBuf, 256, "%lf %lf", star[5].x, star[5].y);
408
+
409
+ //MessageBox(NULL, szBuf, "変換後データ", MB_OK);
410
+
411
+
412
+
413
+
414
+
415
+ //g = GetDlgItemInt( hDlg, IDC_EDIT_header2, &number, FALSE );
416
+
155
- InvalidateRect(hWnd_bitmap, NULL, FALSE);
417
+ InvalidateRect(hWnd_bitmap, NULL, TRUE);
156
-
157
- free(g_img.lpBmpData);
158
-
159
-
160
418
 
161
419
  return TRUE;
162
420
 
163
-
164
-
165
- case WM_PAINT:
421
+
166
-
422
+
423
+
424
+
167
- //月をビトマップ形式描画していく作業
425
+ case IDCANCEL: //右上の×クリ終了
168
-
169
- g_img.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
426
+
170
-
171
- g_img.bmi.bmiHeader.biWidth = 988;
172
-
173
- g_img.bmi.bmiHeader.biHeight = -741;
174
-
175
- g_img.bmi.bmiHeader.biPlanes = 1;
427
+ PostQuitMessage(0);
176
-
177
- g_img.bmi.bmiHeader.biBitCount = 32;
428
+
178
-
179
- g_img.bmi.bmiHeader.biCompression = BI_RGB;
180
-
181
- g_img.bmi.bmiHeader.biSizeImage = 988*741* 4;
182
-
183
- g_img.bmi.bmiHeader.biXPelsPerMeter = 3704;
184
-
185
- g_img.bmi.bmiHeader.biYPelsPerMeter = 3704;
186
-
187
- g_img.bmi.bmiHeader.biClrUsed = 0;
188
-
189
- g_img.bmi.bmiHeader.biClrImportant = 0;
190
-
191
-
192
-
193
- g_img.lpBmpData = (BYTE *)malloc(988 * 741 * 4);
194
-
195
-
196
-
197
- RECT rect;
198
-
199
-
200
-
201
- hdc = BeginPaint(hWnd_bitmap, &ps);
202
-
203
- GetClientRect(hWnd_bitmap, &rect);
204
-
205
- hdc_mem = CreateCompatibleDC(hdc);
429
+ DestroyWindow (hWnd);
206
-
207
-
208
-
209
- for (a = 0; a < 741; a++) {
210
-
211
- for (b = 0; b < 988; b++) {
212
430
 
213
431
 
214
432
 
215
- ab = a*(988 * 4) + b * 4; //始めの項が行数、次の項が左から何ビット目かを表す。(blueの位置を決めている)
216
-
217
-
218
-
219
- //以下は月の縁(円)の内側のピクセルに対する処理(太陽に照らされている部分、地球照の影響を受ける部分、暗い部分それぞれに色をつけている)
220
-
221
- if ((b - (rect.right - rect.left )/2)*(b -( rect.right - rect.left) / 2) + ((rect.bottom - rect.top)/2 - a)*((rect.bottom - rect.top)/2 - a) <= (s / 4 * 1000000 * (rect.right - rect.left) / 10 + 0.5)*(s / 4 * 1000000 * (rect.right - rect.left) / 10 + 0.5)) {
222
-
223
-
224
-
225
- x = b - (rect.right - rect.left) / 2;
226
-
227
- y = (rect.bottom - rect.top)/2 - a;
228
-
229
- z = sqrtf(-(x*x) - (y*y) + (s / 4 * 1000000 * (rect.right - rect.left) / 10 + 0.5)*(s / 4 * 1000000 * (rect.right - rect.left) / 10 + 0.5));
230
-
231
- r = sqrtf(x*x + y*y + z*z);
232
-
233
-
234
-
235
- lam1 = (x*sun.x + y*sun.y + z*sun.z) / (r*SUN_MOON); //太陽の方向との内積
236
-
237
- lam2 = (x*earth.x + y*earth.y + z*earth.z) / (r*EARTH_MOON); //地球の方向との内積
238
-
239
- lam3 = (x*eql.x + y*eql.y + z*eql.z) / (r*EQL_MOON); //EQLの方向との内積
240
-
241
-
242
-
243
- if (lam2 > 0) { //地球に照らされている部分を水色で塗る
244
-
245
- g_img.lpBmpData[ab] = 224;
246
-
247
- g_img.lpBmpData[ab + 1] = 204;
248
-
249
- g_img.lpBmpData[ab + 2] = 157;
250
-
251
- g_img.lpBmpData[ab + 3] = 0;
433
+ DestroyWindow (hDlg);
434
+
435
+ return TRUE;
436
+
437
+
252
438
 
253
439
  }
254
440
 
255
-
256
-
257
- if (lam1 > 0) {//太陽に照らされている部分を黄色で塗る
258
-
259
- g_img.lpBmpData[ab] = 0;
260
-
261
- g_img.lpBmpData[ab + 1] = 100;
262
-
263
- g_img.lpBmpData[ab + 2] = 100;
264
-
265
- g_img.lpBmpData[ab + 3] = 0;
266
-
267
- }
268
-
269
-
270
-
271
- if (!(lam1 >= 0 || lam2 >= 0)) {
272
-
273
- g_img.lpBmpData[ab] = 179;
274
-
275
- g_img.lpBmpData[ab + 1] = 179;
276
-
277
- g_img.lpBmpData[ab + 2] = 179;
278
-
279
- g_img.lpBmpData[ab + 3] = 0;
280
-
281
- }
282
-
283
-
284
-
285
- }
286
-
287
-
288
-
289
- //以下は月の縁(円)の外側に対する処理(宇宙空間なので黒色で塗りつぶしている)
290
-
291
- if ((b - (rect.right - rect.left)/2)*(b - (rect.right - rect.left) / 2) + ((rect.bottom - rect.top)/2 - a)*((rect.bottom - rect.top)/2 - a) > (s / 4 * 1000000 * (rect.right - rect.left) / 10 + 0.5)*(s / 4 * 1000000 * (rect.right - rect.left) / 10 + 0.5)) {
292
-
293
- g_img.lpBmpData[ab] = 0;
294
-
295
- g_img.lpBmpData[ab + 1] = 0;
296
-
297
- g_img.lpBmpData[ab + 2] = 0;
298
-
299
- g_img.lpBmpData[ab + 3] = 0;
300
-
301
-
302
-
303
- }
304
-
305
- }
306
-
307
- }
308
-
309
-
310
-
311
- hBmp = CreateDIBitmap(hdc, &(g_img.bmi.bmiHeader), CBM_INIT, g_img.lpBmpData, &(g_img.bmi), DIB_RGB_COLORS);
312
-
313
- free(g_img.lpBmpData);
314
-
315
- SelectObject(hdc_mem, hBmp);
316
-
317
- SetStretchBltMode(hdc, COLORONCOLOR);
318
-
319
- StretchBlt(hdc, 0, 0, 988, 741, hdc_mem, 0, 0, 988, 741, SRCCOPY);
320
-
321
-
322
-
323
- //メモリ軸を描画する関数を作り、ここで呼び出している(これはうまく描画できた)
324
-
325
- disp_axes2(hdc, rect);
326
-
327
-
328
-
329
- //星の座標データを描画する関数を作り、ここで呼び出している(月をビットマップ形式で描画しない時は星がちゃんと描画されるが、月をビットマップ形式で描画すると消える)
330
-
331
- disp_star_xy(hdc, rect, hDlg);
332
-
333
-
334
-
335
- DeleteDC(hdc);
336
-
337
- DeleteDC(hdc_mem);
338
-
339
- DeleteObject(hBmp);
340
-
341
- EndPaint(hWnd_bitmap, &ps);
342
-
343
- ReleaseDC(hWnd_bitmap, hdc);
344
-
345
- break;
346
-
347
-
348
-
349
- case WM_DESTROY:
350
-
351
- if (++g = NULL)
352
-
353
- KillTimer(hWnd_bitmap, ID_MYTIMER);
354
-
355
- PostQuitMessage(0);
356
-
357
- free(g_img.lpBmpData);
358
-
359
-
360
-
361
- break;
362
-
363
-
364
-
365
- default:
366
-
367
- return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
441
+ return TRUE;
368
442
 
369
443
 
370
444
 
371
445
  }
372
446
 
373
- return 0;
447
+ return FALSE;
374
-
375
-
376
448
 
377
449
  }
378
450
 
379
451
  ```
380
452
 
381
- 星を描画する関数については以下になります。
382
-
383
- ```C++
384
-
385
- // 星の座標データを1チャンネル分ウィンドウに表示する関数
386
-
387
- BOOL disp_star_xy(HDC hdc, RECT rect, HWND hDlg) //ただし、xy平面に描画する関数
388
-
389
- {
390
-
391
- COLORREF color;
392
-
393
- HPEN hPen_xy;
394
-
395
- int i;
396
-
397
-
398
-
399
- color = RGB(255,255, 255);/*RGB(255,241,0)*/ // チャンネル1は黄色
400
-
401
- hPen_xy = CreatePen(PS_SOLID, 9, color);
402
-
403
- SelectObject(hdc, hPen_xy); // hdcで上記のペンを使うために選ぶ
404
-
405
- HBRUSH hBrush_xy, h01dBrush_xy;
406
-
407
- hBrush_xy = CreateSolidBrush(color);
408
-
409
- h01dBrush_xy = (HBRUSH)SelectObject(hdc, hBrush_xy);
410
-
411
- int nop = rect.right - rect.left + 1; //横方向のピクセル数を求める?
412
-
413
- double ppd = (rect.bottom - rect.top) / 10.0; // 縦方向1div当たり何ピクセルか
414
-
415
-
416
-
417
- for(i=0; i<=total_n2; i++){
418
-
419
- star[i].x = star[i].x - (rect.right-rect.left)/2;
420
-
421
- star[i].y = (rect.bottom - rect.top) / 2 - star[i].y;
422
-
423
- int m;
424
-
425
- if(h[i].Mag < 0.0){
426
-
427
-
428
-
429
- for (m = 0; m <= 8; m += 1) {
430
-
431
- SetPixel(hdc, star[i].x - m, star[i].y, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
432
-
433
- SetPixel(hdc, star[i].x, star[i].y - m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
434
-
435
- SetPixel(hdc, star[i].x, star[i].y, /*RGB(255, 255, 255)*/RGB(228, 0, 127));
436
-
437
- SetPixel(hdc, star[i].x + m, star[i].y, RGB(228, 0, 127)/* RGB(255, 255, 255)*/);
438
-
439
- SetPixel(hdc, star[i].x, star[i].y + m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
440
-
441
- }
442
-
443
- }
444
-
445
-
446
-
447
- else if(h[i].Mag < 2.0){
448
-
449
- for (m = 0; m <= 6; m += 1) {
450
-
451
- SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
452
-
453
- SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
454
-
455
- SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
456
-
457
- SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
458
-
459
- SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
460
-
461
- }
462
-
463
- }
464
-
465
-
466
-
467
- else if (h[i].Mag < 4.0) {
468
-
469
- for (m = 0; m <= 4; m += 1) {
470
-
471
- SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
472
-
473
- SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
474
-
475
- SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
476
-
477
- SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
478
-
479
- SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
480
-
481
- }
482
-
483
- }
484
-
485
-
486
-
487
- else {
488
-
489
- SetPixel(hdc, star[i].x - 2, star[i].y, RGB(255, 255, 255));
490
-
491
- SetPixel(hdc, star[i].x, star[i].y - 2, RGB(255, 255, 255));
492
-
493
- SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
494
-
495
- SetPixel(hdc, star[i].x + 2, star[i].y, RGB(255, 255, 255));
496
-
497
- SetPixel(hdc, star[i].x, star[i].y + 2, RGB(255, 255, 255));
498
-
499
- }
500
-
501
-
502
-
503
- }
504
-
505
-
506
-
507
- DeleteObject(hPen_xy); // ペンを破棄する
508
-
509
- DeleteObject(hBrush_xy);
510
-
511
- DeleteObject(h01dBrush_xy);
512
-
513
-
514
-
515
- return TRUE; // 戻り値TRUEを返す
516
-
517
- }
518
-
519
-
520
-
521
- ```
522
-
523
453
  図1:月と星を同時に描画した時
524
454
 
525
455
  ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)

2

星を描画する関数を載せました。

2018/10/24 16:25

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
File without changes
test CHANGED
@@ -378,6 +378,148 @@
378
378
 
379
379
  ```
380
380
 
381
+ 星を描画する関数については以下になります。
382
+
383
+ ```C++
384
+
385
+ // 星の座標データを1チャンネル分ウィンドウに表示する関数
386
+
387
+ BOOL disp_star_xy(HDC hdc, RECT rect, HWND hDlg) //ただし、xy平面に描画する関数
388
+
389
+ {
390
+
391
+ COLORREF color;
392
+
393
+ HPEN hPen_xy;
394
+
395
+ int i;
396
+
397
+
398
+
399
+ color = RGB(255,255, 255);/*RGB(255,241,0)*/ // チャンネル1は黄色
400
+
401
+ hPen_xy = CreatePen(PS_SOLID, 9, color);
402
+
403
+ SelectObject(hdc, hPen_xy); // hdcで上記のペンを使うために選ぶ
404
+
405
+ HBRUSH hBrush_xy, h01dBrush_xy;
406
+
407
+ hBrush_xy = CreateSolidBrush(color);
408
+
409
+ h01dBrush_xy = (HBRUSH)SelectObject(hdc, hBrush_xy);
410
+
411
+ int nop = rect.right - rect.left + 1; //横方向のピクセル数を求める?
412
+
413
+ double ppd = (rect.bottom - rect.top) / 10.0; // 縦方向1div当たり何ピクセルか
414
+
415
+
416
+
417
+ for(i=0; i<=total_n2; i++){
418
+
419
+ star[i].x = star[i].x - (rect.right-rect.left)/2;
420
+
421
+ star[i].y = (rect.bottom - rect.top) / 2 - star[i].y;
422
+
423
+ int m;
424
+
425
+ if(h[i].Mag < 0.0){
426
+
427
+
428
+
429
+ for (m = 0; m <= 8; m += 1) {
430
+
431
+ SetPixel(hdc, star[i].x - m, star[i].y, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
432
+
433
+ SetPixel(hdc, star[i].x, star[i].y - m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
434
+
435
+ SetPixel(hdc, star[i].x, star[i].y, /*RGB(255, 255, 255)*/RGB(228, 0, 127));
436
+
437
+ SetPixel(hdc, star[i].x + m, star[i].y, RGB(228, 0, 127)/* RGB(255, 255, 255)*/);
438
+
439
+ SetPixel(hdc, star[i].x, star[i].y + m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
440
+
441
+ }
442
+
443
+ }
444
+
445
+
446
+
447
+ else if(h[i].Mag < 2.0){
448
+
449
+ for (m = 0; m <= 6; m += 1) {
450
+
451
+ SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
452
+
453
+ SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
454
+
455
+ SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
456
+
457
+ SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
458
+
459
+ SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
460
+
461
+ }
462
+
463
+ }
464
+
465
+
466
+
467
+ else if (h[i].Mag < 4.0) {
468
+
469
+ for (m = 0; m <= 4; m += 1) {
470
+
471
+ SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
472
+
473
+ SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
474
+
475
+ SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
476
+
477
+ SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
478
+
479
+ SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
480
+
481
+ }
482
+
483
+ }
484
+
485
+
486
+
487
+ else {
488
+
489
+ SetPixel(hdc, star[i].x - 2, star[i].y, RGB(255, 255, 255));
490
+
491
+ SetPixel(hdc, star[i].x, star[i].y - 2, RGB(255, 255, 255));
492
+
493
+ SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
494
+
495
+ SetPixel(hdc, star[i].x + 2, star[i].y, RGB(255, 255, 255));
496
+
497
+ SetPixel(hdc, star[i].x, star[i].y + 2, RGB(255, 255, 255));
498
+
499
+ }
500
+
501
+
502
+
503
+ }
504
+
505
+
506
+
507
+ DeleteObject(hPen_xy); // ペンを破棄する
508
+
509
+ DeleteObject(hBrush_xy);
510
+
511
+ DeleteObject(h01dBrush_xy);
512
+
513
+
514
+
515
+ return TRUE; // 戻り値TRUEを返す
516
+
517
+ }
518
+
519
+
520
+
521
+ ```
522
+
381
523
  図1:月と星を同時に描画した時
382
524
 
383
525
  ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)

1

実行結果一例を載せました。

2018/10/20 05:35

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
File without changes
test CHANGED
@@ -377,3 +377,11 @@
377
377
  }
378
378
 
379
379
  ```
380
+
381
+ 図1:月と星を同時に描画した時
382
+
383
+ ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)
384
+
385
+ 図2:星だけ描画した時
386
+
387
+ ![イメージ説明](7b8e78fcbb71c2a805cf5d49d5d9069b.png)