質問編集履歴
4
月と星を同時に描画できていた時の実行結果の一例など加えました
test
CHANGED
File without changes
|
test
CHANGED
@@ -452,8 +452,18 @@
|
|
452
452
|
|
453
453
|
図1:月と星を同時に描画した時
|
454
454
|
|
455
|
-
![イメージ説明](
|
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
ダイアログプロシージャを追加しましたがそれ以外は文字数制限のため一旦削除しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,48 +4,32 @@
|
|
4
4
|
|
5
5
|
```C++
|
6
6
|
|
7
|
-
typedef struct{
|
8
|
-
|
9
|
-
|
7
|
+
//様々な作業の中心となるダイアログ
|
10
|
-
|
11
|
-
|
8
|
+
|
12
|
-
|
13
|
-
BYTE *lpBmpData;
|
14
|
-
|
15
|
-
BITMAPINFO bmi;
|
16
|
-
|
17
|
-
char *fname;
|
18
|
-
|
19
|
-
int fsize;
|
20
|
-
|
21
|
-
} IMG;
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
L
|
9
|
+
BOOL CALLBACK MyDlgProc( HWND hDlg, UINT msg, WPARAM wp, LPARAM lp )
|
26
10
|
|
27
11
|
{
|
28
12
|
|
29
|
-
IMG g_img;
|
30
|
-
|
31
|
-
|
13
|
+
char *fname; // ファイル名
|
14
|
+
|
32
|
-
|
15
|
+
static FILE *fp; // FILEへのポインタ
|
16
|
+
|
33
|
-
|
17
|
+
static FILE *fp1;
|
34
|
-
|
35
|
-
|
18
|
+
|
36
|
-
|
37
|
-
|
19
|
+
|
38
|
-
|
39
|
-
|
20
|
+
|
40
|
-
|
41
|
-
double x,y,z,r;
|
42
|
-
|
43
|
-
int a, b, ab;
|
44
|
-
|
45
|
-
|
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
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
s
|
96
|
-
|
97
|
-
s
|
98
|
-
|
99
|
-
|
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,
|
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
|
-
|
421
|
+
|
166
|
-
|
422
|
+
|
423
|
+
|
424
|
+
|
167
|
-
//
|
425
|
+
case IDCANCEL: //右上の×クリックで終了
|
168
|
-
|
169
|
-
|
426
|
+
|
170
|
-
|
171
|
-
g_img.bmi.bmiHeader.biWidth = 988;
|
172
|
-
|
173
|
-
g_img.bmi.bmiHeader.biHeight = -741;
|
174
|
-
|
175
|
-
|
427
|
+
PostQuitMessage(0);
|
176
|
-
|
177
|
-
|
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
|
-
|
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
|
-
|
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
|
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
星を描画する関数を載せました。
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
実行結果一例を載せました。
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)
|