teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

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

2018/10/25 11:42

投稿

TRON1216.
TRON1216.

スコア37

title CHANGED
File without changes
body CHANGED
@@ -225,6 +225,11 @@
225
225
  }
226
226
  ```
227
227
  図1:月と星を同時に描画した時
228
- ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)
228
+ ![イメージ説明](eee4e337be9fcfa83f38fddb22ddff72.png)
229
229
  図2:星だけ描画した時
230
- ![イメージ説明](7b8e78fcbb71c2a805cf5d49d5d9069b.png)
230
+ ![イメージ説明](7b8e78fcbb71c2a805cf5d49d5d9069b.png)
231
+
232
+ star[i].x += (rect.right - rect.left) / 2;
233
+ star[i].y += (rect.bottom - rect.top) / 2;
234
+ と書き換えると
235
+ ![![イメージ説明](7f6fff1504f5f970efddd0872df1d79d.png)](46849720638852e605c4c7f37f3cfe60.png)

3

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

2018/10/25 11:42

投稿

TRON1216.
TRON1216.

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,61 +1,144 @@
1
1
  ビットマップ形式でペイントしたお月様の背景に星を描画したいと考えています。月を描画せずに星だけ描画することはできるのですが、ビットマップ形式で月とその背景の宇宙空間を描画し、その上から星を描画しようとすると、月と宇宙空間は正しく描画されますが星が描画されません。星は座標データを読み込みSetPixel関数を用いて十字架の形で描画させています。ビットマップ形式での描画とただの図形(星)の描画を同じウィンドウで行うには何か書き方のポイントとかがあるのでしょうか?(星を描画する関数の呼び出すタイミングがおかしいとか)何かアドバイスがあればよろしくお願い致します。
2
2
 
3
3
  ```C++
4
- typedef struct{
5
- HINSTANCE hInst_bitmap;
4
+ //様々な作業の中心となるダイアログ
6
- HWND hWnd_bitmap;
5
+ BOOL CALLBACK MyDlgProc( HWND hDlg, UINT msg, WPARAM wp, LPARAM lp )
6
+ {
7
- BYTE *lpBmpData;
7
+ char *fname; // ファイル名
8
+ static FILE *fp; // FILEへのポインタ
8
- BITMAPINFO bmi;
9
+ static FILE *fp1;
9
- char *fname;
10
- int fsize;
11
- } IMG;
12
10
 
13
- LRESULT CALLBACK WndProc_bitmap( HWND hWnd_bitmap, UINT msg, WPARAM wp, LPARAM lp )
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 (msg) {
21
+ switch(msg){
22
+ case WM_INITDIALOG:
30
23
 
31
- case WM_CREATE:
32
- free(g_img.lpBmpData);
24
+ //2019年12月26日12時0分0秒(UTC)に初期設定する。
33
- break;
34
-
35
- case WM_TIMER:
36
- if (wp != ID_MYTIMER)
25
+ SetDlgItemInt(hDlg, IDC_EDIT_Y, 2019, FALSE);
37
- return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
26
+ SetDlgItemInt(hDlg, IDC_EDIT_M, 12, FALSE);
38
- g = g++;
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
- eql.x = rh[g].XEQL;
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
- moon.x = rh[g].XMOON;
34
+ return TRUE;
45
- moon.y = rh[g].YMOON;
46
- moon.z = rh[g].ZMOON;
47
35
 
36
+ case WM_COMMAND:
48
- sun.x = rh[g].XSUN;
37
+ switch(LOWORD(wp)){
38
+ case IDC_BUTTON_OPEN1: // CH1のファイルを開く処理
49
- sun.y = rh[g].YSUN;
39
+ if( fname = filename() ){
50
- sun.z = rh[g].ZSUN;
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
- star[i].x = cos(koui)*cos(koukei);
139
+ star[i].x = cos(koui)*cos(koukei);
57
- star[i].y = cos(koui)*sin(koukei);
140
+ star[i].y = cos(koui)*sin(koukei);
58
- star[i].z = sin(koui);
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
- InvalidateRect(hWnd_bitmap, NULL, FALSE);
167
+ star[i] = Cordi_Trans3(star[i], theta);
79
- free(g_img.lpBmpData);
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
- return TRUE;
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
- case WM_PAINT:
84
- //月をビットマップ形式で描画していく作業
85
- g_img.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
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
- 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)) {
147
- g_img.lpBmpData[ab] = 0;
148
- g_img.lpBmpData[ab + 1] = 0;
149
- g_img.lpBmpData[ab + 2] = 0;
150
- g_img.lpBmpData[ab + 3] = 0;
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
- EndPaint(hWnd_bitmap, &ps);
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
- KillTimer(hWnd_bitmap, ID_MYTIMER);
209
+ InvalidateRect(hWnd_bitmap, NULL, TRUE);
210
+ return TRUE;
211
+
212
+
213
+ case IDCANCEL: //右上の×クリックで終了
178
- PostQuitMessage(0);
214
+ PostQuitMessage(0);
179
- free(g_img.lpBmpData);
215
+ DestroyWindow (hWnd);
216
+
180
-
217
+ DestroyWindow (hDlg);
181
- break;
218
+ return TRUE;
182
219
 
220
+ }
183
- default:
221
+ return TRUE;
184
- return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
185
222
 
186
223
  }
187
- return 0;
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
  ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)
264
229
  図2:星だけ描画した時

2

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

2018/10/24 16:25

投稿

TRON1216.
TRON1216.

スコア37

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
  ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)
193
264
  図2:星だけ描画した時

1

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

2018/10/20 05:35

投稿

TRON1216.
TRON1216.

スコア37

title CHANGED
File without changes
body CHANGED
@@ -187,4 +187,8 @@
187
187
  return 0;
188
188
 
189
189
  }
190
- ```
190
+ ```
191
+ 図1:月と星を同時に描画した時
192
+ ![イメージ説明](5a87a2b6789042c510713a6dbcc3e965.png)
193
+ 図2:星だけ描画した時
194
+ ![イメージ説明](7b8e78fcbb71c2a805cf5d49d5d9069b.png)