Я делаю мозаичную игру на java и хочу сделать световую карту.
У меня есть некоторые проблемы. У меня есть массив карт освещения, на котором размещены источники света, влияющие на массив. Свет излучает в форме круга. Пока вроде нормально, но это не совсем то, что я хотел.
Вот мой код:
for(float i = 0; i < strength + 1; i++){
for(double u = 0.0f; u < 360; u += 0.5){
double angle = u * Math.PI / 180;
int x2 = (int)(x + i * Math.cos(angle));
int y2 = (int)(y + i * Math.sin(angle));
if(map[y2][x2] > 1 - 1 / i)
map[y2][x2] = 1 - 1 / i;
}
}
Результат:
Как вы можете видеть в результате, кажется, что свет слишком сильно расширяется в нижней левой части (красные крестики). Как я могу это исправить?
Справочная информация:
Сила:
радиус распространения света. Это также определяет, насколько ярким будет свет на каждой плитке массива.«Карта» массива представляет собой двумерный массив с плавающей запятой. Используемый мной движок использует значения с плавающей запятой для альфа-канала. Диапазон от 0 (полностью прозрачный) до 1 (полностью непрозрачный).
Решение (спасибо Джину):
for(int x2 = -strength; x2 <= strength; x2++){
for (int y2 = -strength; y2 <= strength; y2++) {
double r = Math.sqrt(x2 * x2 + y2 * y2);
double inv_rad = r <= strength + 1 ? 1 / r : 0;
if(map[y + y2][x + x2] > 1 - (float) inv_rad)
map[y + y2][x + x2] = 1 - (float) inv_rad;
}
}