質問編集履歴
4
月と星を同時に描画できていた時の実行結果の一例など加えました
title
CHANGED
File without changes
|
body
CHANGED
@@ -225,6 +225,11 @@
|
|
225
225
|
}
|
226
226
|
```
|
227
227
|
図1:月と星を同時に描画した時
|
228
|
-

|
229
229
|
図2:星だけ描画した時
|
230
|
-

|
230
|
+

|
231
|
+
|
232
|
+
star[i].x += (rect.right - rect.left) / 2;
|
233
|
+
star[i].y += (rect.bottom - rect.top) / 2;
|
234
|
+
と書き換えると
|
235
|
+
](46849720638852e605c4c7f37f3cfe60.png)
|
3
ダイアログプロシージャを追加しましたがそれ以外は文字数制限のため一旦削除しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,61 +1,144 @@
|
|
1
1
|
ビットマップ形式でペイントしたお月様の背景に星を描画したいと考えています。月を描画せずに星だけ描画することはできるのですが、ビットマップ形式で月とその背景の宇宙空間を描画し、その上から星を描画しようとすると、月と宇宙空間は正しく描画されますが星が描画されません。星は座標データを読み込みSetPixel関数を用いて十字架の形で描画させています。ビットマップ形式での描画とただの図形(星)の描画を同じウィンドウで行うには何か書き方のポイントとかがあるのでしょうか?(星を描画する関数の呼び出すタイミングがおかしいとか)何かアドバイスがあればよろしくお願い致します。
|
2
2
|
|
3
3
|
```C++
|
4
|
-
typedef struct{
|
5
|
-
|
4
|
+
//様々な作業の中心となるダイアログ
|
6
|
-
|
5
|
+
BOOL CALLBACK MyDlgProc( HWND hDlg, UINT msg, WPARAM wp, LPARAM lp )
|
6
|
+
{
|
7
|
-
|
7
|
+
char *fname; // ファイル名
|
8
|
+
static FILE *fp; // FILEへのポインタ
|
8
|
-
|
9
|
+
static FILE *fp1;
|
9
|
-
char *fname;
|
10
|
-
int fsize;
|
11
|
-
} IMG;
|
12
10
|
|
13
|
-
|
11
|
+
int year, month, day, hour, min, sec; //ETを秒で求めたい年, 月, 日, 時, 分, 秒(UTC)
|
14
|
-
|
12
|
+
|
15
|
-
IMG g_img;
|
16
|
-
g_img.lpBmpData = NULL;
|
17
|
-
PAINTSTRUCT ps;
|
18
|
-
HDC hdc, hdc_mem;
|
19
|
-
HBITMAP hBmp;
|
20
|
-
HBITMAP hBmp2;
|
21
|
-
double x,y,z,r;
|
22
|
-
int a, b, ab;
|
23
|
-
double lam1,lam2,lam3;
|
24
13
|
int i;
|
14
|
+
double Time;
|
15
|
+
double Time_now;
|
16
|
+
double dt;
|
25
17
|
double theta;
|
26
18
|
double RA, DEC; //赤経、赤
|
27
19
|
double koukei, koui; //黄経、黄緯
|
28
20
|
|
29
|
-
switch
|
21
|
+
switch(msg){
|
22
|
+
case WM_INITDIALOG:
|
30
23
|
|
31
|
-
case WM_CREATE:
|
32
|
-
|
24
|
+
//2019年12月26日12時0分0秒(UTC)に初期設定する。
|
33
|
-
break;
|
34
|
-
|
35
|
-
case WM_TIMER:
|
36
|
-
|
25
|
+
SetDlgItemInt(hDlg, IDC_EDIT_Y, 2019, FALSE);
|
37
|
-
|
26
|
+
SetDlgItemInt(hDlg, IDC_EDIT_M, 12, FALSE);
|
38
|
-
|
27
|
+
SetDlgItemInt(hDlg, IDC_EDIT_D, 26, FALSE);
|
39
|
-
|
28
|
+
SetDlgItemInt(hDlg, IDC_EDIT_H, 12, FALSE);
|
29
|
+
SetDlgItemInt(hDlg, IDC_EDIT_MIN, 0, FALSE);
|
40
|
-
|
30
|
+
SetDlgItemInt(hDlg, IDC_EDIT_S, 0, FALSE);
|
41
|
-
eql.y = rh[g].YEQL;
|
42
|
-
eql.z = rh[g].ZEQL;
|
43
31
|
|
32
|
+
CheckDlgButton( hDlg, IDC_CHECK_DISPLAY1, BST_UNCHECKED);
|
33
|
+
|
44
|
-
|
34
|
+
return TRUE;
|
45
|
-
moon.y = rh[g].YMOON;
|
46
|
-
moon.z = rh[g].ZMOON;
|
47
35
|
|
36
|
+
case WM_COMMAND:
|
48
|
-
|
37
|
+
switch(LOWORD(wp)){
|
38
|
+
case IDC_BUTTON_OPEN1: // CH1のファイルを開く処理
|
49
|
-
|
39
|
+
if( fname = filename() ){
|
50
|
-
|
40
|
+
if ( fp ) fclose ( fp );
|
41
|
+
fopen_s ( &fp, fname, "r" );
|
42
|
+
//read_data(hDlg, fp, 1);
|
43
|
+
// MessageBox(NULL ,"座標ファイル読み込み成功", "CH1", MB_OK);// ファイルをテキスト読み込みモードで開く
|
51
44
|
|
45
|
+
|
46
|
+
|
47
|
+
if (fname = filename()) {
|
48
|
+
if (fp1) fclose(fp1);
|
49
|
+
fopen_s(&fp1, fname, "r");
|
50
|
+
read_star(hDlg, fp1, 1);
|
51
|
+
//MessageBox(NULL, "星のデータ読み込み成功", "CH1", MB_OK);
|
52
|
+
fclose(fp1);
|
53
|
+
}
|
54
|
+
|
55
|
+
if (read_data(hDlg, fp, 1)) // CH1で読み込む
|
56
|
+
CheckDlgButton(hDlg, IDC_CHECK_DISPLAY1, BST_CHECKED);// チェックボタンを「表示」とする
|
57
|
+
|
58
|
+
fclose( fp );
|
59
|
+
InvalidateRect(hWnd, NULL, TRUE);
|
60
|
+
}
|
61
|
+
|
62
|
+
|
63
|
+
return TRUE;
|
64
|
+
|
65
|
+
case ID_OK://OKボタンが押された
|
66
|
+
//MessageBox(NULL ,"座標ファイル読み込み成功", "CH1", MB_OK);
|
67
|
+
//Time = et(year, month, day, hour, min, sec)/*GetDlgItemInt(hDlg, IDC_EDIT_ET, NULL, FALSE)*/;
|
68
|
+
|
69
|
+
year = GetDlgItemInt(hDlg, IDC_EDIT_Y, NULL, FALSE); //エディットボックスから年を読み込む
|
70
|
+
month = GetDlgItemInt(hDlg, IDC_EDIT_M, NULL, FALSE); //以下同様
|
71
|
+
day = GetDlgItemInt(hDlg, IDC_EDIT_D, NULL, FALSE);
|
72
|
+
hour = GetDlgItemInt(hDlg, IDC_EDIT_H, NULL, FALSE);
|
73
|
+
min = GetDlgItemInt(hDlg, IDC_EDIT_MIN, NULL, FALSE);
|
74
|
+
sec = GetDlgItemInt(hDlg, IDC_EDIT_S, NULL, FALSE);
|
75
|
+
|
76
|
+
//関数etに上記を引数として渡すと、秒で表されたElapsed Timeが戻される。
|
77
|
+
Time = et(year, month, day, hour, min, sec);
|
78
|
+
|
79
|
+
for(i=0; i<=total_n; i++){
|
80
|
+
if(rh[i].ET > Time){
|
81
|
+
g = i-1;
|
82
|
+
dt = Time - rh[g].ET;
|
83
|
+
//sprintf_s(szBuf, 256, "%d", g);
|
84
|
+
//MessageBox(NULL, szBuf, "超える直前のデータの番号", MB_OK);
|
85
|
+
break;
|
86
|
+
}
|
87
|
+
|
88
|
+
}
|
89
|
+
|
90
|
+
//sprintf_s(szBuf, 256, "%d %lf",g , dt);
|
91
|
+
//MessageBox(NULL, szBuf, "データ", MB_OK);
|
92
|
+
|
93
|
+
//sprintf_s(szBuf, 256, "%lf", haET);
|
94
|
+
//MessageBox(NULL, szBuf, "元データ", MB_OK);
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
eql.x = rh[g].VXEQL * dt + rh[g].XEQL;
|
99
|
+
eql.y = rh[g].VYEQL * dt + rh[g].YEQL;
|
100
|
+
eql.z = rh[g].VZEQL * dt + rh[g].ZEQL;
|
101
|
+
|
102
|
+
moon.x = rh[g].VXMOON * dt + rh[g].XMOON;
|
103
|
+
moon.y = rh[g].VYMOON * dt + rh[g].YMOON;
|
104
|
+
moon.z = rh[g].VZMOON * dt + rh[g].ZMOON;
|
105
|
+
|
106
|
+
sun.x = rh[g].VXSUN * dt + rh[g].XSUN;
|
107
|
+
sun.y = rh[g].VYSUN * dt + rh[g].YSUN;
|
108
|
+
sun.z = rh[g].VZSUN * dt + rh[g].ZSUN;
|
109
|
+
|
52
110
|
earth.x = 0;
|
53
111
|
earth.y = 0;
|
54
112
|
earth.z = 0;
|
55
113
|
|
114
|
+
//sprintf_s(szBuf, 256, "%lf %lf %lf %lf %lf %lf", eql.x , eql.y, eql.z, moon.x, moon.y, moon.z);
|
115
|
+
//MessageBox(NULL, szBuf, "eql.x, moon.x", MB_OK);
|
116
|
+
|
117
|
+
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));
|
118
|
+
SUN_MOON = sqrtf(sun.x * sun.x + sun.y * sun.y + sun.z * sun.z);
|
119
|
+
EARTH_MOON = sqrtf(moon.x * moon.x + moon.y * moon.y + moon.z * moon.z);
|
120
|
+
|
121
|
+
//t = 360*3474/(2*M_PI*EQL_MOON);//視直径を計算
|
122
|
+
s = (3474.0*0.00005) / EQL_MOON; //月の相対的な大きさを計算
|
123
|
+
|
124
|
+
//sprintf_s(szBuf, 256, "%lf %lf", EQL_MOON, s);
|
125
|
+
//MessageBox(NULL, szBuf, "EQL_MOON, s", MB_OK);
|
126
|
+
|
127
|
+
for(i=0; i<=total_n2; i++){
|
128
|
+
RA = 2*M_PI*(h[i].RA_h + h[i].RA_m/60 + h[i].RA_s/3600)/24; //単位を時で統一
|
129
|
+
DEC = 2*M_PI*(h[i].Dec_d + h[i].Dec_m/60 + h[i].Dec_s/3600)/360; //単位を度で統一
|
130
|
+
if (h[i].Dec_sig == FALSE) {
|
131
|
+
DEC = -DEC;
|
132
|
+
}
|
133
|
+
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
|
134
|
+
if (koukei < 0) {
|
135
|
+
koukei = koukei + 2 * M_PI; //単位はrad
|
136
|
+
}
|
137
|
+
koui = asin(cos(M_PI*23.43 / 180)*sin(DEC) - sin(M_PI*23.43 / 180)*cos(DEC)*sin(RA));
|
138
|
+
|
56
|
-
|
139
|
+
star[i].x = cos(koui)*cos(koukei);
|
57
|
-
|
140
|
+
star[i].y = cos(koui)*sin(koukei);
|
58
|
-
|
141
|
+
star[i].z = sin(koui);
|
59
142
|
}
|
60
143
|
|
61
144
|
|
@@ -75,190 +158,72 @@
|
|
75
158
|
star[i] = Cordi_Trans2(star[i], theta);
|
76
159
|
}
|
77
160
|
|
161
|
+
//座標変換3
|
162
|
+
theta = atan2(eql.x, eql.z);
|
163
|
+
eql = Cordi_Trans3(eql,theta);
|
164
|
+
sun = Cordi_Trans3(sun,theta);
|
165
|
+
earth = Cordi_Trans3(earth,theta);
|
166
|
+
for(i=0; i<=total_n2; i++){
|
78
|
-
|
167
|
+
star[i] = Cordi_Trans3(star[i], theta);
|
79
|
-
|
168
|
+
}
|
80
169
|
|
170
|
+
//座標変換4
|
171
|
+
theta = atan2(-sun.x, sun.y);
|
172
|
+
eql = Cordi_Trans2(eql,theta);
|
173
|
+
sun = Cordi_Trans2(sun,theta);
|
174
|
+
earth = Cordi_Trans2(earth,theta);
|
175
|
+
for(i=0; i<=total_n2; i++){
|
176
|
+
star[i] = Cordi_Trans2(star[i], theta);
|
81
|
-
|
177
|
+
if(star[i].z < 0){
|
178
|
+
star[i].x = star[i].x * (-50 / star[i].z);
|
179
|
+
star[i].y = star[i].y * (-50 / star[i].z);
|
82
180
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
g_img.bmi.bmiHeader.biWidth = 988;
|
87
|
-
g_img.bmi.bmiHeader.biHeight = -741;
|
88
|
-
g_img.bmi.bmiHeader.biPlanes = 1;
|
89
|
-
g_img.bmi.bmiHeader.biBitCount = 32;
|
90
|
-
g_img.bmi.bmiHeader.biCompression = BI_RGB;
|
91
|
-
g_img.bmi.bmiHeader.biSizeImage = 988*741* 4;
|
92
|
-
g_img.bmi.bmiHeader.biXPelsPerMeter = 3704;
|
93
|
-
g_img.bmi.bmiHeader.biYPelsPerMeter = 3704;
|
94
|
-
g_img.bmi.bmiHeader.biClrUsed = 0;
|
95
|
-
g_img.bmi.bmiHeader.biClrImportant = 0;
|
96
|
-
|
97
|
-
g_img.lpBmpData = (BYTE *)malloc(988 * 741 * 4);
|
98
|
-
|
99
|
-
RECT rect;
|
100
|
-
|
101
|
-
hdc = BeginPaint(hWnd_bitmap, &ps);
|
102
|
-
GetClientRect(hWnd_bitmap, &rect);
|
103
|
-
hdc_mem = CreateCompatibleDC(hdc);
|
104
|
-
|
105
|
-
for (a = 0; a < 741; a++) {
|
106
|
-
for (b = 0; b < 988; b++) {
|
107
|
-
|
108
|
-
ab = a*(988 * 4) + b * 4; //始めの項が行数、次の項が左から何ビット目かを表す。(blueの位置を決めている)
|
109
|
-
|
110
|
-
//以下は月の縁(円)の内側のピクセルに対する処理(太陽に照らされている部分、地球照の影響を受ける部分、暗い部分それぞれに色をつけている)
|
111
|
-
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)) {
|
112
|
-
|
113
|
-
x = b - (rect.right - rect.left) / 2;
|
114
|
-
y = (rect.bottom - rect.top)/2 - a;
|
115
|
-
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));
|
116
|
-
r = sqrtf(x*x + y*y + z*z);
|
117
|
-
|
118
|
-
lam1 = (x*sun.x + y*sun.y + z*sun.z) / (r*SUN_MOON); //太陽の方向との内積
|
119
|
-
lam2 = (x*earth.x + y*earth.y + z*earth.z) / (r*EARTH_MOON); //地球の方向との内積
|
120
|
-
lam3 = (x*eql.x + y*eql.y + z*eql.z) / (r*EQL_MOON); //EQLの方向との内積
|
121
|
-
|
122
|
-
if (lam2 > 0) { //地球に照らされている部分を水色で塗る
|
123
|
-
g_img.lpBmpData[ab] = 224;
|
124
|
-
g_img.lpBmpData[ab + 1] = 204;
|
125
|
-
g_img.lpBmpData[ab + 2] = 157;
|
126
|
-
g_img.lpBmpData[ab + 3] = 0;
|
127
|
-
}
|
128
|
-
|
129
|
-
if (lam1 > 0) {//太陽に照らされている部分を黄色で塗る
|
130
|
-
g_img.lpBmpData[ab] = 0;
|
131
|
-
g_img.lpBmpData[ab + 1] = 100;
|
132
|
-
g_img.lpBmpData[ab + 2] = 100;
|
133
|
-
g_img.lpBmpData[ab + 3] = 0;
|
134
|
-
}
|
135
|
-
|
136
|
-
if (!(lam1 >= 0 || lam2 >= 0)) {
|
137
|
-
g_img.lpBmpData[ab] = 179;
|
138
|
-
g_img.lpBmpData[ab + 1] = 179;
|
139
|
-
g_img.lpBmpData[ab + 2] = 179;
|
140
|
-
g_img.lpBmpData[ab + 3] = 0;
|
141
|
-
}
|
142
|
-
|
181
|
+
star[i].x = (star[i].x) / 2 * (988.5 / 10);
|
182
|
+
star[i].y = (star[i].y) / 2 * (741 / 10);
|
183
|
+
}
|
143
184
|
}
|
144
185
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
186
|
+
if(sun.y > 0){
|
187
|
+
theta = atan2(-sun.x, sun.y) + M_PI;
|
188
|
+
eql = Cordi_Trans2(eql,theta);
|
189
|
+
sun = Cordi_Trans2(sun,theta);
|
190
|
+
earth = Cordi_Trans2(earth,theta);
|
191
|
+
for(i=0; i<=total_n2; i++){
|
192
|
+
star[i] = Cordi_Trans2(star[i], theta);
|
193
|
+
if(star[i].z < 0){
|
194
|
+
star[i].x = star[i].x * (-50 / star[i].z);
|
195
|
+
star[i].y = star[i].y * (-50 / star[i].z);
|
151
196
|
|
197
|
+
star[i].x = (star[i].x) / 2 * (988.5 / 10);
|
198
|
+
star[i].y = (star[i].y) / 2 * (741 / 10);
|
199
|
+
}
|
152
200
|
}
|
153
|
-
|
201
|
+
}
|
154
|
-
}
|
155
202
|
|
156
|
-
hBmp = CreateDIBitmap(hdc, &(g_img.bmi.bmiHeader), CBM_INIT, g_img.lpBmpData, &(g_img.bmi), DIB_RGB_COLORS);
|
157
|
-
free(g_img.lpBmpData);
|
158
|
-
SelectObject(hdc_mem, hBmp);
|
159
|
-
SetStretchBltMode(hdc, COLORONCOLOR);
|
160
|
-
StretchBlt(hdc, 0, 0, 988, 741, hdc_mem, 0, 0, 988, 741, SRCCOPY);
|
161
203
|
|
204
|
+
//sprintf_s(szBuf, 256, "%lf %lf", star[5].x, star[5].y);
|
162
|
-
//
|
205
|
+
//MessageBox(NULL, szBuf, "変換後データ", MB_OK);
|
163
|
-
disp_axes2(hdc, rect);
|
164
206
|
|
165
|
-
//星の座標データを描画する関数を作り、ここで呼び出している(月をビットマップ形式で描画しない時は星がちゃんと描画されるが、月をビットマップ形式で描画すると消える)
|
166
|
-
disp_star_xy(hdc, rect, hDlg);
|
167
207
|
|
168
|
-
DeleteDC(hdc);
|
169
|
-
DeleteDC(hdc_mem);
|
170
|
-
DeleteObject(hBmp);
|
171
|
-
|
208
|
+
//g = GetDlgItemInt( hDlg, IDC_EDIT_header2, &number, FALSE );
|
172
|
-
ReleaseDC(hWnd_bitmap, hdc);
|
173
|
-
break;
|
174
|
-
|
175
|
-
case WM_DESTROY:
|
176
|
-
if (++g = NULL)
|
177
|
-
|
209
|
+
InvalidateRect(hWnd_bitmap, NULL, TRUE);
|
210
|
+
return TRUE;
|
211
|
+
|
212
|
+
|
213
|
+
case IDCANCEL: //右上の×クリックで終了
|
178
|
-
|
214
|
+
PostQuitMessage(0);
|
179
|
-
|
215
|
+
DestroyWindow (hWnd);
|
216
|
+
|
180
|
-
|
217
|
+
DestroyWindow (hDlg);
|
181
|
-
|
218
|
+
return TRUE;
|
182
219
|
|
220
|
+
}
|
183
|
-
|
221
|
+
return TRUE;
|
184
|
-
return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
|
185
222
|
|
186
223
|
}
|
187
|
-
return
|
224
|
+
return FALSE;
|
188
|
-
|
189
225
|
}
|
190
226
|
```
|
191
|
-
星を描画する関数については以下になります。
|
192
|
-
```C++
|
193
|
-
// 星の座標データを1チャンネル分ウィンドウに表示する関数
|
194
|
-
BOOL disp_star_xy(HDC hdc, RECT rect, HWND hDlg) //ただし、xy平面に描画する関数
|
195
|
-
{
|
196
|
-
COLORREF color;
|
197
|
-
HPEN hPen_xy;
|
198
|
-
int i;
|
199
|
-
|
200
|
-
color = RGB(255,255, 255);/*RGB(255,241,0)*/ // チャンネル1は黄色
|
201
|
-
hPen_xy = CreatePen(PS_SOLID, 9, color);
|
202
|
-
SelectObject(hdc, hPen_xy); // hdcで上記のペンを使うために選ぶ
|
203
|
-
HBRUSH hBrush_xy, h01dBrush_xy;
|
204
|
-
hBrush_xy = CreateSolidBrush(color);
|
205
|
-
h01dBrush_xy = (HBRUSH)SelectObject(hdc, hBrush_xy);
|
206
|
-
int nop = rect.right - rect.left + 1; //横方向のピクセル数を求める?
|
207
|
-
double ppd = (rect.bottom - rect.top) / 10.0; // 縦方向1div当たり何ピクセルか
|
208
|
-
|
209
|
-
for(i=0; i<=total_n2; i++){
|
210
|
-
star[i].x = star[i].x - (rect.right-rect.left)/2;
|
211
|
-
star[i].y = (rect.bottom - rect.top) / 2 - star[i].y;
|
212
|
-
int m;
|
213
|
-
if(h[i].Mag < 0.0){
|
214
|
-
|
215
|
-
for (m = 0; m <= 8; m += 1) {
|
216
|
-
SetPixel(hdc, star[i].x - m, star[i].y, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
|
217
|
-
SetPixel(hdc, star[i].x, star[i].y - m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
|
218
|
-
SetPixel(hdc, star[i].x, star[i].y, /*RGB(255, 255, 255)*/RGB(228, 0, 127));
|
219
|
-
SetPixel(hdc, star[i].x + m, star[i].y, RGB(228, 0, 127)/* RGB(255, 255, 255)*/);
|
220
|
-
SetPixel(hdc, star[i].x, star[i].y + m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
|
221
|
-
}
|
222
|
-
}
|
223
|
-
|
224
|
-
else if(h[i].Mag < 2.0){
|
225
|
-
for (m = 0; m <= 6; m += 1) {
|
226
|
-
SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
|
227
|
-
SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
|
228
|
-
SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
|
229
|
-
SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
|
230
|
-
SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
|
231
|
-
}
|
232
|
-
}
|
233
|
-
|
234
|
-
else if (h[i].Mag < 4.0) {
|
235
|
-
for (m = 0; m <= 4; m += 1) {
|
236
|
-
SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
|
237
|
-
SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
|
238
|
-
SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
|
239
|
-
SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
|
240
|
-
SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
|
241
|
-
}
|
242
|
-
}
|
243
|
-
|
244
|
-
else {
|
245
|
-
SetPixel(hdc, star[i].x - 2, star[i].y, RGB(255, 255, 255));
|
246
|
-
SetPixel(hdc, star[i].x, star[i].y - 2, RGB(255, 255, 255));
|
247
|
-
SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
|
248
|
-
SetPixel(hdc, star[i].x + 2, star[i].y, RGB(255, 255, 255));
|
249
|
-
SetPixel(hdc, star[i].x, star[i].y + 2, RGB(255, 255, 255));
|
250
|
-
}
|
251
|
-
|
252
|
-
}
|
253
|
-
|
254
|
-
DeleteObject(hPen_xy); // ペンを破棄する
|
255
|
-
DeleteObject(hBrush_xy);
|
256
|
-
DeleteObject(h01dBrush_xy);
|
257
|
-
|
258
|
-
return TRUE; // 戻り値TRUEを返す
|
259
|
-
}
|
260
|
-
|
261
|
-
```
|
262
227
|
図1:月と星を同時に描画した時
|
263
228
|

|
264
229
|
図2:星だけ描画した時
|
2
星を描画する関数を載せました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -188,6 +188,77 @@
|
|
188
188
|
|
189
189
|
}
|
190
190
|
```
|
191
|
+
星を描画する関数については以下になります。
|
192
|
+
```C++
|
193
|
+
// 星の座標データを1チャンネル分ウィンドウに表示する関数
|
194
|
+
BOOL disp_star_xy(HDC hdc, RECT rect, HWND hDlg) //ただし、xy平面に描画する関数
|
195
|
+
{
|
196
|
+
COLORREF color;
|
197
|
+
HPEN hPen_xy;
|
198
|
+
int i;
|
199
|
+
|
200
|
+
color = RGB(255,255, 255);/*RGB(255,241,0)*/ // チャンネル1は黄色
|
201
|
+
hPen_xy = CreatePen(PS_SOLID, 9, color);
|
202
|
+
SelectObject(hdc, hPen_xy); // hdcで上記のペンを使うために選ぶ
|
203
|
+
HBRUSH hBrush_xy, h01dBrush_xy;
|
204
|
+
hBrush_xy = CreateSolidBrush(color);
|
205
|
+
h01dBrush_xy = (HBRUSH)SelectObject(hdc, hBrush_xy);
|
206
|
+
int nop = rect.right - rect.left + 1; //横方向のピクセル数を求める?
|
207
|
+
double ppd = (rect.bottom - rect.top) / 10.0; // 縦方向1div当たり何ピクセルか
|
208
|
+
|
209
|
+
for(i=0; i<=total_n2; i++){
|
210
|
+
star[i].x = star[i].x - (rect.right-rect.left)/2;
|
211
|
+
star[i].y = (rect.bottom - rect.top) / 2 - star[i].y;
|
212
|
+
int m;
|
213
|
+
if(h[i].Mag < 0.0){
|
214
|
+
|
215
|
+
for (m = 0; m <= 8; m += 1) {
|
216
|
+
SetPixel(hdc, star[i].x - m, star[i].y, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
|
217
|
+
SetPixel(hdc, star[i].x, star[i].y - m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
|
218
|
+
SetPixel(hdc, star[i].x, star[i].y, /*RGB(255, 255, 255)*/RGB(228, 0, 127));
|
219
|
+
SetPixel(hdc, star[i].x + m, star[i].y, RGB(228, 0, 127)/* RGB(255, 255, 255)*/);
|
220
|
+
SetPixel(hdc, star[i].x, star[i].y + m, RGB(228, 0, 127)/*RGB(255, 255, 255)*/);
|
221
|
+
}
|
222
|
+
}
|
223
|
+
|
224
|
+
else if(h[i].Mag < 2.0){
|
225
|
+
for (m = 0; m <= 6; m += 1) {
|
226
|
+
SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
|
227
|
+
SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
|
228
|
+
SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
|
229
|
+
SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
|
230
|
+
SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
|
231
|
+
}
|
232
|
+
}
|
233
|
+
|
234
|
+
else if (h[i].Mag < 4.0) {
|
235
|
+
for (m = 0; m <= 4; m += 1) {
|
236
|
+
SetPixel(hdc, star[i].x - m, star[i].y, RGB(255, 255, 255));
|
237
|
+
SetPixel(hdc, star[i].x, star[i].y - m, RGB(255, 255, 255));
|
238
|
+
SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
|
239
|
+
SetPixel(hdc, star[i].x + m, star[i].y, RGB(255, 255, 255));
|
240
|
+
SetPixel(hdc, star[i].x, star[i].y + m, RGB(255, 255, 255));
|
241
|
+
}
|
242
|
+
}
|
243
|
+
|
244
|
+
else {
|
245
|
+
SetPixel(hdc, star[i].x - 2, star[i].y, RGB(255, 255, 255));
|
246
|
+
SetPixel(hdc, star[i].x, star[i].y - 2, RGB(255, 255, 255));
|
247
|
+
SetPixel(hdc, star[i].x, star[i].y, RGB(255, 255, 255)/*RGB(173, 255, 47)*/);
|
248
|
+
SetPixel(hdc, star[i].x + 2, star[i].y, RGB(255, 255, 255));
|
249
|
+
SetPixel(hdc, star[i].x, star[i].y + 2, RGB(255, 255, 255));
|
250
|
+
}
|
251
|
+
|
252
|
+
}
|
253
|
+
|
254
|
+
DeleteObject(hPen_xy); // ペンを破棄する
|
255
|
+
DeleteObject(hBrush_xy);
|
256
|
+
DeleteObject(h01dBrush_xy);
|
257
|
+
|
258
|
+
return TRUE; // 戻り値TRUEを返す
|
259
|
+
}
|
260
|
+
|
261
|
+
```
|
191
262
|
図1:月と星を同時に描画した時
|
192
263
|

|
193
264
|
図2:星だけ描画した時
|
1
実行結果一例を載せました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -187,4 +187,8 @@
|
|
187
187
|
return 0;
|
188
188
|
|
189
189
|
}
|
190
|
-
```
|
190
|
+
```
|
191
|
+
図1:月と星を同時に描画した時
|
192
|
+

|
193
|
+
図2:星だけ描画した時
|
194
|
+

|