변수 및 함수
-
cell: 칸, ver: 세로 벽, hor: 가로 벽
- cell[x, y]: ver[x, y] ver[x+1, y] hor[x, y] hor[x, y+1]로 둘러싸임
모든 오브젝트(칸, 벽)에 대해 [x, y]의 인덱스를 가질 때, 그것은 해당 오브젝트의 좌하단의 실제 좌표이다.
-
Vector2Int pos: (x,y) 현재 발사자가 서 있는 위치의 칸 인덱스
-
Vector2 stPos: (x,y) = pos + (0.5, 0.5) 발사자의 실제 위치
-
MirrorInfo tarMir: 적중된 거울 정보
- tarMir.pos: 거울의 좌하단 좌표
- tarMir.len: 거울의 길이
- tarMir.dir: 거울의 방향, ver 혹은 hor
-
list<pair<float, float> > parRay: 현재 단계에서 나아가고 있는 빛줄기
-
초기설정: {(0,1)}
-
void SubtractRay(list<pair<float, float> >parRay, pair<float, float> sub)
parRay에서 sub만큼을 빼는 것
- parRay의 모든 원소에 대해 parRay[].first, parRay[].second, sub.first, sub.second를 float[4] arr에 넣고 오름차순 정렬
- arr[0] == sub.first && arr[1] == sub.second || arr[2] == sub.first && arr[3] == sub.second
- continue
- arr[0] == sub.first && arr[2] == sub.second
- parRay[].first = sub.second
- arr[1] == sub.first && arr[3] == sub.second
- parRay[].second = sub.first
- arr[1] == sub.first && arr[2] == sub.second
- Add(parRay[].second, sub.second)
- parRay[].second = sub.first
- arr[0] == sub.first && arr[1] == sub.second || arr[2] == sub.first && arr[3] == sub.second
- parRay의 모든 원소에 대해 parRay[].first, parRay[].second, sub.first, sub.second를 float[4] arr에 넣고 오름차순 정렬
-
bool IsInRay(list<pair<float, float> >parRay, pair <float, float> range)
parRay에 range가 포함되는지 체크
- parRay의 모든 원소에 대해 parRay[].first, parRay[].second, range.first, range.second를 float[4] arr에 넣고 오름차순 정렬
- return !(arr[0] == range.first && arr[1] == range.second || arr[2] == range.first && arr[3] == range.second);
- parRay의 모든 원소에 대해 parRay[].first, parRay[].second, range.first, range.second를 float[4] arr에 넣고 오름차순 정렬
-
float PointToParRay(Vector2 stPos, MirrorInfo tarMir, Vector2 chPos, bool isRefl)
좌표를 parRay에서 몇인지 계산
stPos: 발사자 좌표, tarMir: 거울정보, chPos: 구하고자 하는 좌표, isRefl: 거울에 반사된 이후 값을 구하는지
tarMir.dir == hor일 경우만 기술- float dist = chPos.y - stPos.y + isRefl?(tarMir.pos.y - chPos.y)*2:0;
- float spreadLen = tarMir.len * dist / (tarMir.pos.y - stPos.y);
- float rayStPos = stPos.x + (tarMir.pos.x - stPos.x) * dist / (tarMir.pos.y - stPos.y);
- return (chPos.x - rayStPos) / spreadLen;
-
플로우
- stPos에서 tarMir.pos까지 검사하여 벽이나 거울이 있을 경우 SubtractRay를 통해 parRay 설정
- tarMir.pos부터 맵의 끝까지 검사하여 맵의 각 요소가 InInRay일 경우 거울의 반대쪽에 복사. 그 요소가 벽이나 거울일 경우 SubtractRay.