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
отрисовка карты.язык любой
вобщем мне нужно не решение а идея хотябы. есть двумерный масив с числами. он выполняет роля карты.и человек который по ней ходит. у человека есть координаты в карте.отрисовка карты идет по 5 клеток во все стороны от положения человека.Если он зашел в верхний левый угол карты и его координаты равны х-1,у-2 то в право и в низ карта должна вывестись на 9 и 8 клеток соответственно.таже история со всеми углами. вобщем на экран всегда выводится 121 ячейка карты.11х11.
Есть координаты находящегося на карте человека 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++:
Код:
код замечательный, но есть проблема что делать кординатами человека??? карта отрисовывается начиная с левого верхнего угла по 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-это точка на данный момент выполняет роль человечка.
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 он просто выходит за граници поля рисования.А как сделать что бы он оставался на карте?
[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));
Код:
x2 = 2 * cells + 1;
Код:
x1 = x2 - 2 * cells + 1;
только еденичку прибавлять не надо потомучто получается от 0 до 11.всего 12 клеток. масив с нуля индексируется.