とりあえずファイル出力してどういう値になるのか見てみたら?
atan2の返す値は±π(±180度)だということを忘れずに。
上記のコードを単純にファイル出力するサンプル(VS2015 Communityで動作確認)
コード:
// ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#define _USE_MATH_DEFINES
#include <math.h>
#include <stdio.h>
int main()
{
FILE *fp;
struct {
double x, y;
double angle;
} shot;
struct {
double x, y;
} target;
// ショットの初期値
shot.x = 200;
shot.y = 300;
shot.angle = M_PI + M_PI / 2; // あなたのコードはPI + (DX_PI/2)でしたがPIもDX_PIも同じ3.14・・・ですよ。
// ターゲットの初期値(とりあえず適当な値)
target.x = 500;
target.y = 500;
_tfopen_s(&fp, _T("test.txt"), _T("w"));
for (int i = 0; i < 100; i++) {
double ang = atan2(target.y - shot.y, target.x - shot.x);
if (shot.angle > ang) {
shot.angle -= 0.2; // 0.02→0.2
}
if (shot.angle < ang) {
shot.angle += 0.2; // 0.02→0.2
}
shot.x += cos(shot.angle) * 10; // これはそのまま
shot.y += sin(shot.angle) * 10; // それはそのまま
fprintf(fp, "%3d x=%5.1f y=%5.1f ang=%6.3f(%6.1f) [%6.3f(%6.1f)] dis=%6.1f\n",
i, shot.x, shot.y, // ショット位置
shot.angle, shot.angle * 180.0f/M_PI, // ショットの角度
ang, ang * 180.0f/M_PI, // ショットから見たターゲットの方向
sqrt(pow(target.y - shot.y, 2) + pow(target.x - shot.x, 2))); // ショットとターゲットとの距離
}
fclose(fp);
return 0;
}
実行結果です。
まあこれを見てみると、距離が最小値1.8になってからの出力がおかしいですよね?
距離がどんどん離れてるところからしても。(私はこれを、180度の穴と呼んでますw)
コード:
0 x=198.0 y=290.2 ang= 4.512( 258.5) [ 0.588( 33.7)] dis= 367.7
1 x=194.1 y=281.0 ang= 4.312( 247.1) [ 0.607( 34.8)] dis= 376.2
2 x=188.5 y=272.7 ang= 4.112( 235.6) [ 0.621( 35.6)] dis= 385.6
3 x=181.3 y=265.8 ang= 3.912( 224.2) [ 0.630( 36.1)] dis= 395.5
4 x=172.9 y=260.4 ang= 3.712( 212.7) [ 0.634( 36.3)] dis= 405.5
5 x=163.6 y=256.7 ang= 3.512( 201.2) [ 0.632( 36.2)] dis= 415.2
6 x=153.7 y=255.0 ang= 3.312( 189.8) [ 0.626( 35.9)] dis= 424.2
7 x=143.7 y=255.3 ang= 3.112( 178.3) [ 0.616( 35.3)] dis= 432.2
8 x=134.0 y=257.6 ang= 2.912( 166.9) [ 0.602( 34.5)] dis= 439.0
9 x=124.9 y=261.8 ang= 2.712( 155.4) [ 0.585( 33.5)] dis= 444.4
10 x=116.8 y=267.7 ang= 2.512( 143.9) [ 0.566( 32.4)] dis= 448.1
11 x=110.0 y=275.0 ang= 2.312( 132.5) [ 0.545( 31.2)] dis= 450.2
12 x=104.9 y=283.6 ang= 2.112( 121.0) [ 0.523( 30.0)] dis= 450.5
13 x=101.5 y=293.0 ang= 1.912( 109.6) [ 0.501( 28.7)] dis= 449.0
14 x=100.1 y=302.9 ang= 1.712( 98.1) [ 0.479( 27.4)] dis= 445.8
15 x=100.7 y=312.9 ang= 1.512( 86.7) [ 0.458( 26.2)] dis= 441.0
16 x=103.3 y=322.6 ang= 1.312( 75.2) [ 0.438( 25.1)] dis= 434.6
17 x=107.7 y=331.5 ang= 1.112( 63.7) [ 0.421( 24.1)] dis= 427.0
18 x=113.8 y=339.4 ang= 0.912( 52.3) [ 0.406( 23.2)] dis= 418.2
19 x=121.4 y=346.0 ang= 0.712( 40.8) [ 0.394( 22.6)] dis= 408.7
20 x=130.1 y=350.9 ang= 0.512( 29.4) [ 0.386( 22.1)] dis= 398.8
21 x=138.8 y=355.8 ang= 0.512( 29.4) [ 0.383( 22.0)] dis= 388.9
22 x=147.5 y=360.7 ang= 0.512( 29.4) [ 0.380( 21.8)] dis= 379.0
23 x=156.2 y=365.6 ang= 0.512( 29.4) [ 0.376( 21.6)] dis= 369.1
24 x=165.0 y=370.5 ang= 0.512( 29.4) [ 0.373( 21.4)] dis= 359.2
25 x=173.7 y=375.4 ang= 0.512( 29.4) [ 0.369( 21.1)] dis= 349.3
26 x=182.4 y=380.3 ang= 0.512( 29.4) [ 0.365( 20.9)] dis= 339.4
27 x=191.1 y=385.2 ang= 0.512( 29.4) [ 0.360( 20.7)] dis= 329.5
28 x=199.8 y=390.1 ang= 0.512( 29.4) [ 0.356( 20.4)] dis= 319.7
29 x=208.5 y=395.0 ang= 0.512( 29.4) [ 0.351( 20.1)] dis= 309.8
30 x=217.3 y=399.9 ang= 0.512( 29.4) [ 0.346( 19.8)] dis= 299.9
31 x=226.0 y=404.8 ang= 0.512( 29.4) [ 0.340( 19.5)] dis= 290.1
32 x=234.7 y=409.7 ang= 0.512( 29.4) [ 0.334( 19.2)] dis= 280.3
33 x=243.4 y=414.6 ang= 0.512( 29.4) [ 0.328( 18.8)] dis= 270.4
34 x=252.1 y=419.5 ang= 0.512( 29.4) [ 0.321( 18.4)] dis= 260.6
35 x=260.8 y=424.4 ang= 0.512( 29.4) [ 0.314( 18.0)] dis= 250.8
36 x=270.3 y=427.5 ang= 0.312( 17.9) [ 0.306( 17.5)] dis= 240.8
37 x=279.9 y=430.6 ang= 0.312( 17.9) [ 0.306( 17.5)] dis= 230.8
38 x=289.4 y=433.6 ang= 0.312( 17.9) [ 0.306( 17.5)] dis= 220.8
39 x=298.9 y=436.7 ang= 0.312( 17.9) [ 0.305( 17.5)] dis= 210.8
40 x=308.4 y=439.8 ang= 0.312( 17.9) [ 0.305( 17.5)] dis= 200.8
41 x=317.9 y=442.9 ang= 0.312( 17.9) [ 0.304( 17.4)] dis= 190.8
42 x=327.4 y=445.9 ang= 0.312( 17.9) [ 0.304( 17.4)] dis= 180.8
43 x=337.0 y=449.0 ang= 0.312( 17.9) [ 0.304( 17.4)] dis= 170.8
44 x=346.5 y=452.1 ang= 0.312( 17.9) [ 0.303( 17.4)] dis= 160.8
45 x=356.0 y=455.2 ang= 0.312( 17.9) [ 0.303( 17.3)] dis= 150.8
46 x=365.5 y=458.2 ang= 0.312( 17.9) [ 0.302( 17.3)] dis= 140.8
47 x=375.0 y=461.3 ang= 0.312( 17.9) [ 0.301( 17.3)] dis= 130.8
48 x=384.5 y=464.4 ang= 0.312( 17.9) [ 0.300( 17.2)] dis= 120.8
49 x=394.1 y=467.5 ang= 0.312( 17.9) [ 0.299( 17.1)] dis= 110.8
50 x=403.6 y=470.5 ang= 0.312( 17.9) [ 0.298( 17.1)] dis= 100.8
51 x=413.1 y=473.6 ang= 0.312( 17.9) [ 0.297( 17.0)] dis= 90.8
52 x=422.6 y=476.7 ang= 0.312( 17.9) [ 0.295( 16.9)] dis= 80.8
53 x=432.1 y=479.7 ang= 0.312( 17.9) [ 0.293( 16.8)] dis= 70.8
54 x=441.6 y=482.8 ang= 0.312( 17.9) [ 0.290( 16.6)] dis= 60.8
55 x=451.2 y=485.9 ang= 0.312( 17.9) [ 0.286( 16.4)] dis= 50.8
56 x=460.7 y=489.0 ang= 0.312( 17.9) [ 0.281( 16.1)] dis= 40.9
57 x=470.2 y=492.0 ang= 0.312( 17.9) [ 0.274( 15.7)] dis= 30.9
58 x=479.7 y=495.1 ang= 0.312( 17.9) [ 0.261( 15.0)] dis= 20.9
59 x=489.2 y=498.2 ang= 0.312( 17.9) [ 0.236( 13.5)] dis= 10.9
60 x=498.7 y=501.3 ang= 0.312( 17.9) [ 0.167( 9.6)] dis= 1.8
61 x=508.7 y=502.4 ang= 0.112( 6.4) [-0.780( -44.7)] dis= 9.0
62 x=518.6 y=501.5 ang=-0.088( -5.0) [-2.874(-164.7)] dis= 18.7
63 x=528.2 y=498.7 ang=-0.288( -16.5) [-3.061(-175.4)] dis= 28.2
64 x=538.2 y=497.8 ang=-0.088( -5.0) [ 3.094( 177.3)] dis= 38.2
65 x=548.1 y=498.9 ang= 0.112( 6.4) [ 3.084( 176.7)] dis= 48.1
66 x=557.6 y=502.0 ang= 0.312( 17.9) [ 3.119( 178.7)] dis= 57.7
67 x=567.6 y=503.1 ang= 0.112( 6.4) [-3.107(-178.0)] dis= 67.6
68 x=577.5 y=502.2 ang=-0.088( -5.0) [-3.096(-177.4)] dis= 77.6
69 x=587.1 y=499.4 ang=-0.288( -16.5) [-3.113(-178.3)] dis= 87.1
70 x=597.1 y=498.5 ang=-0.088( -5.0) [ 3.135( 179.6)] dis= 97.1
71 x=607.0 y=499.6 ang= 0.112( 6.4) [ 3.126( 179.1)] dis= 107.0
72 x=616.5 y=502.7 ang= 0.312( 17.9) [ 3.138( 179.8)] dis= 116.6
73 x=626.5 y=503.8 ang= 0.112( 6.4) [-3.118(-178.7)] dis= 126.5
74 x=636.4 y=503.0 ang=-0.088( -5.0) [-3.111(-178.3)] dis= 136.5
75 x=646.0 y=500.1 ang=-0.288( -16.5) [-3.120(-178.8)] dis= 146.0
76 x=654.9 y=495.4 ang=-0.488( -27.9) [-3.141(-180.0)] dis= 154.9
77 x=664.4 y=492.6 ang=-0.288( -16.5) [ 3.112( 178.3)] dis= 164.6
78 x=674.4 y=491.7 ang=-0.088( -5.0) [ 3.097( 177.4)] dis= 174.6
79 x=684.3 y=492.9 ang= 0.112( 6.4) [ 3.094( 177.3)] dis= 184.5
80 x=693.9 y=495.9 ang= 0.312( 17.9) [ 3.103( 177.8)] dis= 193.9
81 x=702.6 y=500.8 ang= 0.512( 29.4) [ 3.121( 178.8)] dis= 202.6
82 x=712.1 y=503.9 ang= 0.312( 17.9) [-3.138(-179.8)] dis= 212.1
83 x=722.0 y=505.0 ang= 0.112( 6.4) [-3.123(-178.9)] dis= 222.1
84 x=732.0 y=504.1 ang=-0.088( -5.0) [-3.119(-178.7)] dis= 232.0
85 x=741.6 y=501.3 ang=-0.288( -16.5) [-3.124(-179.0)] dis= 241.6
86 x=750.4 y=496.6 ang=-0.488( -27.9) [-3.136(-179.7)] dis= 250.4
87 x=760.0 y=493.8 ang=-0.288( -16.5) [ 3.128( 179.2)] dis= 260.1
88 x=770.0 y=492.9 ang=-0.088( -5.0) [ 3.118( 178.6)] dis= 270.1
89 x=779.9 y=494.0 ang= 0.112( 6.4) [ 3.115( 178.5)] dis= 280.0
90 x=789.4 y=497.1 ang= 0.312( 17.9) [ 3.120( 178.8)] dis= 289.4
91 x=798.1 y=502.0 ang= 0.512( 29.4) [ 3.132( 179.4)] dis= 298.1
92 x=807.7 y=505.1 ang= 0.312( 17.9) [-3.135(-179.6)] dis= 307.7
93 x=817.6 y=506.2 ang= 0.112( 6.4) [-3.125(-179.1)] dis= 317.6
94 x=827.5 y=505.3 ang=-0.088( -5.0) [-3.122(-178.9)] dis= 327.6
95 x=837.1 y=502.5 ang=-0.288( -16.5) [-3.125(-179.1)] dis= 337.1
96 x=846.0 y=497.8 ang=-0.488( -27.9) [-3.134(-179.6)] dis= 346.0
97 x=855.6 y=495.0 ang=-0.288( -16.5) [ 3.135( 179.6)] dis= 355.6
98 x=865.5 y=494.1 ang=-0.088( -5.0) [ 3.127( 179.2)] dis= 365.6
99 x=875.5 y=495.2 ang= 0.112( 6.4) [ 3.125( 179.1)] dis= 375.5