Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

отрисовка карты.язык любой

30K
11 апреля 2010 года
cpentyc
85 / / 23.02.2010
вобщем мне нужно не решение а идея хотябы. есть двумерный масив с числами. он выполняет роля карты.и человек который по ней ходит. у человека есть координаты в карте.отрисовка карты идет по 5 клеток во все стороны от положения человека.Если он зашел в верхний левый угол карты и его координаты равны х-1,у-2 то в право и в низ карта должна вывестись на 9 и 8 клеток соответственно.таже история со всеми углами. вобщем на экран всегда выводится 121 ячейка карты.11х11.
12K
11 апреля 2010 года
Ghox
297 / / 26.07.2009
Т.е. задача у вас такая.
Есть координаты находящегося на карте человека x и y. Нужно найти координаты углов квадрата - части карты, который нужно вывести на экран. Считая, что ось X направлена вправо, а ось Y - вниз, обозначим: x1, x2 - координата x левой и правой стороны квадрата; y1 и y2 - координата y верхней и нижней стороны квадрата. Обозначим еще: x_max и y_max - размерность карты по x и y. Тогда условия, которые должны выполняться, можно записать так:
[FONT="Courier New"][SIZE="2"]x2 = x1 + 10
y2 = y1 + 10
x1 <= x <= x2
y1 <= y <= y2
x - x1 >= 5 или x1 = 0
x2 - x >= 5 или x2 = x_max
y - y1 >= 5 или y1 = 0
y2 - y >= 5 или y2 = y_max[/SIZE][/FONT]
Ну а алгоритм нахождения можно сделать примерно так - пример на C++:
Код:
const int sizeX = 100, sizeY = 100; // x_max = 99, y_max = 99
    const int cells = 5; // определяет, на сколько клеток прорисовывать карту

    int x1, x2, y1, y2;
    int x, y;
    cout << "Enter x (>= 0 and <= " << sizeX - 1 << "): ";
    cin >> x;
    cout << "Enter y (>= 0 and <= " << sizeY - 1 << "): ";
    cin >> y;

    if(x < cells)
    {
        x1 = 0;
        x2 = 2 * cells + 1;
    }
    else if(sizeX - 1 - x < cells)
    {
        x2 = sizeX - 1;
        x1 = x2 - 2 * cells + 1;
    }
    else
    {
        x1 = x - cells;
        x2 = x + cells;
    }
    // аналогично для y1 и y2
30K
12 апреля 2010 года
cpentyc
85 / / 23.02.2010
Ghox спасибо большое.
код замечательный, но есть проблема что делать кординатами человека??? карта отрисовывается начиная с левого верхнего угла по 11 клеток верх и вниз.
Код:
int n = 0, m = 0;
            for (int i = x1  ; i <= x2;n++, i++)
            {
                m = 0;      
                for (int j = y1 ; j <= y2 ;m++, j++)
                {                              
                    switch (map[i, j])
                        {
                            case 0:
                                {
                                    g.DrawRectangle(new Pen(Color.Red, 3), new Rectangle(n * 25,m * 25, 24, 24));
                                } break;
                            case 1:
                                {
                                    g.DrawRectangle(new Pen(Color.Pink, 3), new Rectangle(n* 25, m * 25, 24, 24));

                                } break;
                            case 2:
                                {
                                    g.DrawRectangle(new Pen(Color.Black, 3), new Rectangle(n* 25,m* 25, 24, 24));

                                } break;
                        }
                    }                              
            }
                g.FillEllipse(newBrush, new Rectangle(a.X * 25, a.Y * 25, 24, 24));//a-это точка на данный момент выполняет роль человечка.

когда координаты точки становятся больше 11 он просто выходит за граници поля рисования.А как сделать что бы он оставался на карте?
12K
12 апреля 2010 года
Ghox
297 / / 26.07.2009
Думаю, что вы неправильно человечка рисуете... У вас используются два вида координат - координаты на карте, и координаты на экране. Переменные x1, x2, y1, y2, i (по сути это координата x), j (по сути координата y) - это координаты на карте. Переменные n, m - это координаты на экране, по этим координатам у вас отрисовываются ячейки карты. Координаты на карте и координаты на экране связаны уравнениями:
[FONT="Courier New"][SIZE="2"]n = i - x1
m = j - y1[/SIZE][/FONT]
Т.е. вы ячейку карты [j] (где i лежит в пределах x1 и x2, а j - в пределах y1 и y2) отрисовываете по координатам на экране [i - x1][j - y1].
Но координаты человечка a.X, a.Y - это тоже координаты на карте. При прорисовке человечка их также надо приводить к координатам на экране: как и в случае с n и m, нужно вычитать x1 из a.X и y1 из a.Y:
 
Код:
g.FillEllipse(newBrush, new Rectangle((a.X - x1) * 25, (a.Y - y1) * 25, 24, 24));
30K
12 апреля 2010 года
cpentyc
85 / / 23.02.2010
спасибо.

 
Код:
x2 = 2 * cells + 1;

 
Код:
x1 = x2 - 2 * cells + 1;

только еденичку прибавлять не надо потомучто получается от 0 до 11.всего 12 клеток. масив с нуля индексируется.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог