Skip to content

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
    • Help
    • Support
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
M
man-in-the-mirror
  • Project
    • Project
    • Details
    • Activity
    • Releases
    • Cycle Analytics
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Charts
  • Issues 4
    • Issues 4
    • List
    • Boards
    • Labels
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Charts
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • MIM
  • man-in-the-mirror
  • Wiki
    • 세부기획
  • 거짓탄 로직

거짓탄 로직

Last edited by 18류지석 Apr 06, 2019
Page history

변수 및 함수

  • 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
    • 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);
    • 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.
Clone repository
  • Home
  • 세부기획
  • 세부기획
    • 거짓탄 로직
More Pages

New Wiki Page

Tip: You can specify the full path for the new file. We will automatically create any missing directories.