이것을 닫기 전에 실제로 프로그래밍과 관련이 있습니다.대상 표제의 방향 전환
저는 2D 맵에서 항공기를 시뮬레이트 할 프로그램과 함께 작업하고 있습니다. 타겟 베어링을 치기 위해 방향을 바꾸는 데 어려움이 있습니다.
double maxHeadingChange = 10; //Maximum heading change per 100 ms
double targetHeading = 0;
double differenceHeading = Math.Abs(targetHeading - heading);
//if we need to turn clockwise
if (targetHeading > 340 || targetHeading < 30)
{
if (heading < 180)
{
if (differenceHeading > maxHeadingChange)
heading -= maxHeadingChange;
else
{
heading -= differenceHeading;
}
}
else
{
if (differenceHeading > maxHeadingChange)
heading -= maxHeadingChange;
else
{
heading -= differenceHeading;
}
}
}
else if (targetHeading > heading)
{
if (targetHeading - heading < maxHeadingChange)
heading = targetHeading;
else
{
heading += maxHeadingChange;
}
}
else
{
if (heading - targetHeading < maxHeadingChange)
heading = targetHeading;
else
{
heading -= maxHeadingChange;
}
}
//MessageBox.Show(headingDifference + "");
//just for now
//heading = targetHeading;
if(heading > 359)
{
heading = 0;
}if(heading < 0)
{
heading += 360;
}
당신은 내가 무엇을 시도하고있어 방향 설정에 도착하고, 다음 차례의 양이 최대 회전 금액으로 설정, 최대 회전 금액보다 큰 경우 무엇을 볼 수 있습니다.
개체가 ~ 10 도의 표제에 있고 대상이 354 도인 경우 표적을 명중시키기 위해 시계 방향으로 돌려야한다는 것이 문제입니다. 이는 표제를 빼는 것입니다. 목표 표제가 작습니다. 문제는 타겟 헤딩이 0을지나 더 높은 헤딩 범위로 이동하자마자 시계 방향으로 돌리는 것입니다. 이로 인해 대상이 표제 (방향이 반 시계 방향으로 회전하거나 각도가 감소 함)쪽으로 돌 려 나오고 0을지나 자마자 방향이 바뀌어 갑자기 방향이 바뀝니다.
차례를 얻는 더 효율적인 방법을 찾아야합니다 최대도 회전 수에 약간의 시뮬레이션이 있으므로 targetHeading으로 방향을 설정할 수는 없습니다. 10 *의 현재 헤딩에서 350 *의 제목을 발견하여 헤딩을 계속합니다.
대단히 죄송합니다.
잠재적 해결책 1 [편집]
double maxHeadingChange = 10; //Maximum heading change per 100 ms
double targetHeading = 0;
double differenceHeading = Math.Abs(targetHeading - heading);
//if we need to turn clockwise
if(getTurnDir(heading, targetHeading))
{
//Turn right
if(differenceHeading > maxHeadingChange)
{
heading -= maxHeadingChange;
}else
{
heading -= differenceHeading;
}
}else
{
if (differenceHeading > maxHeadingChange)
{
heading += maxHeadingChange;
}
else
{
heading += differenceHeading;
}
}
//MessageBox.Show(headingDifference + "");
//just for now
//heading = targetHeading;
if(heading > 359)
{
heading = 0;
}
if(heading < 0)
{
heading += 360;
}
}
double hdgDiff(double h1, double h2)
{ // angle between two headings
double diff = h1 - h2 + 3600 % 360;
return diff <= 180 ? diff : 360 - diff;
}
/// <summary>
/// Left is false
/// </summary>
/// <param name="hdg"></param>
/// <param name="newHdg"></param>
/// <returns></returns>
bool getTurnDir(double hdg, double newHdg)
{ // should a new heading turn left or right?
if (newHdg > hdg)
return newHdg - hdg > 180;
return hdg - newHdg > 180;
}
가 ~ 기독교
시험이, 덕분에 지금까지 –
나는이 문제가 : 대상 제목 : 146.630473812382 제목 : 321.152852773836 를 그냥 붙어 앉아 어느 방향 으로든 돌 수없는 146.6. –
두 제목 : 대상 제목 : 146.249466480246 제목 : 331.152852773836 대상 제목 : 146.240074739079 제목 : 321.152852773836 그것은이 –