Сетка - препятствие / Как рассчитать «Поле зрения» - PullRequest
1 голос
/ 28 апреля 2020

Мой английский sh не мой родной язык, я не знаю, как его назвать, как объяснить это ясно и не уверен, что это правильный термин. Сначала я попытался выполнить поиск в Google, но по приведенной выше причине не смог найти ничего связанного.

Не могли бы вы, ребята, сначала проверить альбом imgur: https://imgur.com/a/4mMuCil

Итак ...

  • Черный квадрат - это «препятствие»
  • Красный квадрат - это «игрок»
  • Серый квадрат - это область, где игрок не может видеть "

В зависимости от расстояния игрока от препятствия, игрок может видеть более или менее" вещи "

Существует ли общая формула для определения область, которую он может видеть или не может видеть? Или я должен написать уникальную формулу в зависимости от позиции игрока относительно препятствия

Извините, если то, что я написал, не имеет смысла. Спасибо за вашу помощь

РЕДАКТИРОВАТЬ:

очко игрока (5, 0);

очко препятствия (4, 2);

.....o...
.........
....@....
.........
.....#...
.....##..
.....###.
.....####
......###

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Это требует небольшой работы. Я скажу шаги, чтобы заставить это работать:

(1) Давайте определим позицию игрока p и позицию препятствия o.

Мы знаем, что хотим нарисовать " треугольник "после препятствия.

(2) Давайте определим угол в соответствии с близостью.

Чем ближе, тем больше угол, поэтому я устанавливаю угол 45, если расстояние равно 1 и оно уменьшается по мере того, как игрок становится дальше от препятствия. Угол составляет 5 + (max(0, 50 - distance * 10)). Вы можете настроить этот угол.

(3) Давайте построим большой треугольник. Первая вершина является препятствием. Затем бросьте большую линию от игрока через препятствие. Поверните эту линию вокруг препятствия на половину угла по часовой стрелке (чтобы получить вторую вершину) и на половину угла против часовой стрелки (чтобы получить третью вершину), как показано на рисунке: enter image description here

(4) Наконец, итерация к матрице и для каждой позиции, спросите, находятся ли эти координаты внутри треугольника.

#include <bits/stdc++.h>
using namespace std;

struct point{
    float x, y;
    point(){}
    point(float x, float y){this->x = x; this->y = y;}
    //point(int x, int y){this->x = x; this->y = y;}
};

point rotate(point pivot, float angle, point p, bool clockwise){
    float s = sin(angle);
    float c = cos(angle);

    p.x -= pivot.x;
    p.y -= pivot.y;

    if(clockwise){
        return point(p.x * c + p.y * s + pivot.x, -p.x * s + p.y * c + pivot.y);
    }
    else{
        return point(p.x * c - p.y * s + pivot.x, p.x * s + p.y * c + pivot.y);
    }
}

float triangleArea(point p1, point p2, point p3) {         //find area of triangle formed by p1, p2 and p3
   return abs((p1.x*(p2.y-p3.y) + p2.x*(p3.y-p1.y)+ p3.x*(p1.y-p2.y))/2.0);
}

bool inside(point p1, point p2, point p3, point p) {     //check whether p is inside or outside
   float area = triangleArea (p1, p2, p3);          //area of triangle ABC
   float area1 = triangleArea (p, p2, p3);         //area of PBC
   float area2 = triangleArea (p1, p, p3);         //area of APC
   float area3 = triangleArea (p1, p2, p);        //area of ABP

   return abs(area - area1 + area2 + area3) < 1;        //when three triangles are forming the whole triangle
}

char m[9][9];

point player(4, 0);
point obstacle(4, 2);

float angle(){
    float dist = sqrt(pow(player.x - obstacle.x, 2) + pow(player.y - obstacle.y, 2));
    cout<<"dist: "<<(5.0 + max(0.0, 50.0 - 10.0 * dist))<<endl;
    return (5.0 + max(0.0, 50.0 - 10.0 * dist)) * 0.0174533;
}

void print(){
    for(int i = 0; i < 9; i++){
        for(int j = 0; j < 9; j++){
            cout<<m[i][j];
        }
        cout<<endl;
    }
}

int main(){
    for(int i = 0; i < 9; i++){
        for(int j = 0; j < 9; j++){
            m[i][j] = '.';
        }
    }
    m[(int)player.y][(int)player.x] = 'o';
    m[(int)obstacle.y][(int)obstacle.x] = '@';

    float rad = angle();

    point end(20.0 * (obstacle.x - player.x) + obstacle.x, 20.0 * (player.y - obstacle.y) + obstacle.y);
    point p2 = rotate(obstacle, rad / 2.0, end, true);
    point p3 = rotate(obstacle, rad / 2.0, end, false);

    for(int i = 0; i < 9; i++){
        for(int j = 0; j < 9; j++){
            if(i == (int) player.y && j == (int) player.x) continue;
            if(i == (int) obstacle.y && j == (int) obstacle.x) continue;
            if(inside(obstacle, p2, p3, point(j, i))) m[i][j] = '#';
        }
    }

    print();

    return 0;
}

ВЫХОД:

....o....                                                                                                                                                                          
.........                                                                                                                                                                          
....@....                                                                                                                                                                          
....#....                                                                                                                                                                          
....#....                                                                                                                                                                          
....#....                                                                                                                                                                          
...###...                                                                                                                                                                          
...###...                                                                                                                                                                          
...###...
0 голосов
/ 28 апреля 2020

Предположим, игрок находится в точке (0,0), а препятствие - в точке (j, k), где j> 0 и k> = 0.

Тогда квадрат в точке (x, y) будет видно, если (2j-1) y> = (2k + 1) x или (2k-1) x> = (2j + 1) y.

Применение этого правила к трем другим квадрантам простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...