Rubberbanding & Smoothing
Rubberbanding
- ๊ทธ๋ฆฌ๋ ๊ธฐ๋ฐ์์ ๋ถํ์ํ ์ค๊ฐ ๋ ธ๋๋ฅผ ์ง์ฐ๋ ๊ณผ์
- ์ธ ๊ทธ๋ฆฌ๋ ๋๋ ์ง์ ์ฌ์ด๊ฐ ํต๊ณผ ๊ฐ๋ฅํ ๊ณต๊ฐ์ธ์ง๋ฅผ ํ์ธ
- ํต๊ณผ ๊ฐ๋ฅํ๋ฉด ์ค๊ฐ ์ ์ ๋ฆฌ์คํธ์์ ์ ๊ฑฐ
bool AStarPather::rubberbanding(
const GridPos& first,
const GridPos& second,
const GridPos& third)
{
// ์ธ ์ ์ด ์ด๋ฃจ๋ ์ ์์ญ์ ๋์
int left = std::min(first.row, std::min(second.row, third.row)),
right = std::max(first.row, std::max(second.row, third.row)),
top = std::max(first.col, std::max(second.col, third.col)),
bot = std::min(first.col, std::min(second.col, third.col));
for (int i = left; i <= right; i++) {
for (int j = bot; j <= top; j++) {
// ํด๋น ์์ญ์ด ์ด๋๊ฐ๋ฅํ์ง ํ์ธ
GridPos p{i, j};
if (terrain->is_valid_grid_position(p)
&& terrain->is_wall(p))
return false;
}
}
// otherwise,
return true;
}
Smoothing
- Waypoint๋ค์ ์ถ๊ฐํ์ฌ ์์ด์ ํธ๊ฐ ๊ฐ ์ง์ ์ ๊ฒฝ์ ํ๋ฉด์ ์์ฐ์ค๋ฌ์ด ๊ณก์ ์ ๊ทธ๋ฆฌ๋ฉฐ ์ด๋ํ๋๋ก ํ๋ Post-processing
๊ณก์
- ๋ ์ A, B ์ฌ์ด์ ์ P๋ฅผ ์์ ๊ฐ์ด ํํ
- t์ ๋ํ ๋ฐฉ์ ์
- 1์ฐจ ๋ฒ ์ง์ ๊ณก์
- ์ P์ ์งํฉ, ์ฆ A์ B๋ฅผ ์๋ ์ ๋ถ
- ๊ฐ ์ ์ ์๋ ์ ๋ถ ๋๋ ๊ณก์ ์์ ์ ๋ค์ ๋ํ์ฌ, ์ด๋ค์ ๋ค์ ์๋ก ์๋๋ค
- n์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ n๊ฐ์ ์ ๋ค์ ๋ํด ๋ฐ๋ t๋ฅผ ์กฐ์ ํด๊ฐ๋ฉฐ ๊ณก์ ์ ์์ฑํ ์ ์๋ค
์ฐ์์ฑ
- ์ฌ๋ฌ ๊ณก์ ์ ์์ฐ์ค๋ฝ๊ฒ ์๋ ๋ฐฉ๋ฒ
- C0: ์ ์ฒด ๊ณก์ ์ด ์ฐ์ํ๋ค
- C1: ๊ณก์ ์ด ์ฐ์ํ๊ณ , ๊ฐ ๊ณก์ ์ด ๋ง๋๋ ๊ณณ์ ์ ์ ๋ฒกํฐ๊ฐ ๊ฐ๋ค
- 0์ฐจ, 1์ฐจ ๋ํจ์๊ฐ ์ฐ์์ด๋ค
- C2: ๊ณก์ ์ด ์ฐ์ํ๊ณ , ๊ฐ ๊ณก์ ์ด ๋ง๋๋ ๊ณณ์ ์ ์ ๋ฒกํฐ๊ฐ ๊ฐ๊ณ , ๊ณก๋ฅ ๋ ๊ฐ๋ค
- 0์ฐจ, 1์ฐจ, 2์ฐจ ๋ํจ์๊ฐ ์ฐ์์ด๋ค
Spline Points
- ๋ณด๊ฐ ์คํ๋ผ์ธ์ ํ ์ข ๋ฅ
- 4๊ฒ ์ ์ด์ ์ด ์ฃผ์ด์ง ๋ ์ด๋ค ๋ชจ๋๋ฅผ ๊ณก์ ์ ๊ทธ๋ฆฌ๋ฉฐ ํต๊ณผํ๋ ์ ์ ๊ทธ๋ฆฐ๋ค
- ๋ค ๊ฐ ์ ์์ ๊ณก์ ์ ์ค๊ฐ ์ 2๊ฐ ์ฌ์ด์ ์ ์๋๋ค
์บฃ๋ฉ๋กฌ ์คํ๋ผ์ธ
- s๋ ๋ฐ๋
- 4๊ฐ ์ ์ ๋์์ผ๋ก ๊ณก์ ์ ์ด๋ฃจ๋ ์ ๋ค์ ๊ตฌํ๋ ๋ฐฉ๋ฒ
์ค๋ฅ
- ๊ทธ๋ฆฌ๋ ๊ฐ World Distance๋ฅผ 1๋ก ์ก์์ ๋, Rubberbanding ํ์ ๊ฐ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ 1.5๋ฐฐ ์ด์์ด๋ฉด Smoothing ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค
- ์ด ๊ฒฝ์ฐ back points๋ฅผ ์๋ก ์ฝ์
ํด์ค๋ค
- ๊ธฐ์กด์ ์๋ point ๋ค์ ์ค๊ฐ ์ง์ ์ ๋ช ๊ฐ ๋ ๋ฐฐ์นํ๋ค
- ๊ทธ ๋ค์ ์ค๋ฌด์ฑ์ ํด์ค๋ค