gpt4 book ai didi

java - 计算半径中的二维坐标(对于基于图 block 的游戏)

转载 作者:行者123 更新时间:2023-12-01 11:36:53 25 4
gpt4 key购买 nike

我搜索了一段时间,未能找到满意的答案。

目前我有一个图 block 列表(表示图 block ID 的 int 数组)、宽度和高度(以图 block 为单位)。当我渲染它时,所有图 block 都正确放置,等等。但我真正的问题是我无法找出一种算法来从内到外计算给定半径内的图 block (相对于另一个图 block )。我打算用它来进行照明计算。这就是为什么我需要从内到外计算(梯度)。我无法在 x 和 y 上使用 + 和 - 进行静态计算,因为我计划使用可变的半径大小。有谁知道有什么好方法吗?

编辑:“从内到外”我的意思是照明的布置方式,靠近光源的照明应该比远离光源的照明更强烈。我打算用下面的 ASCII 来直观地展示这一点:

0  0  0  0  0  0  0
0 0 --------- 0 0
0 | * + * | 0
0 | + x + | 0
0 | * + * | 0
0 0 --------- 0 0
0 0 0 0 0 0 0

提前致谢:)

最佳答案

关于如何实现的细节,当然有许多不同的选择。您没有确切地说明如何表示您的“图 block ”(例如,关于接口(interface))。但这是一种方法,也许它已经有所帮助:

这个想法是将图 block 的坐标存储为 Point 对象的列表。 (可以将这些点转换为一维索引,但应该完全独立于实际问题)。

这些点是通过沿着相关区域的“边缘”行走来计算的:

  • 从右下角开始,向上(dx=0, dy=-1)
  • 从右上角开始,向左移动 (dx=-1, dy=0)
  • 从左上角开始,向下 (dx=0, dy=1)
  • 从左下角开始,向右移动 (dx=1, dy=0)

所有这些点都放入一个列表中,该列表随后包含具有特定 Manhattan Distance 的所有点。到中心点,按逆时针顺序。

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

public class TileDistances
{
public static void main(String[] args)
{
int sizeX = 11;
int sizeY = 11;
int centerX = 5;
int centerY = 5;

for (int radius=1; radius<5; radius++)
{
System.out.println(
"Radius "+radius+" around "+centerX+","+centerY);
List<Point> points = coordinates(centerX, centerY, radius);
char c = (char)('0'+radius);
System.out.println(createString(points, sizeX, sizeY, c));
}
}

private static String createString(
List<Point> points, int sizeX, int sizeY, char c)
{
StringBuffer sb = new StringBuffer();
for (int y=0; y<sizeY; y++)
{
for (int x=0; x<sizeX; x++)
{
Point p = new Point(x,y);
if (points.contains(p))
{
sb.append(c);
}
else
{
sb.append(".");
}
}
sb.append("\n");
}
return sb.toString();
}

private static List<Point> coordinates(
int cx, int cy, int r)
{
List<Point> coordinates = new ArrayList<Point>();
int steps = r + r;
addAll(cx + r, cy + r, 0, -1, steps, coordinates);
addAll(cx + r, cy - r, -1, 0, steps, coordinates);
addAll(cx - r, cy - r, 0, 1, steps, coordinates);
addAll(cx - r, cy + r, 1, 0, steps, coordinates);
return coordinates;
}

private static void addAll(
int x0, int y0, int dx, int dy, int steps,
List<Point> coordinates)
{
int x = x0;
int y = y0;
for (int i=0; i<steps; i++)
{
coordinates.add(new Point(x,y));
x += dx;
y += dy;
}
}
}

在此示例中,将打印半径 1 到 4,例如:

Radius 3 around 5,5
...........
...........
..3333333..
..3.....3..
..3.....3..
..3.....3..
..3.....3..
..3.....3..
..3333333..
...........
...........

(对此可能有更有效和/或更优雅的解决方案,具体取决于图 block 的精确表示方式,但我认为这个解决方案很容易理解并且普遍适用,因为它只提供一组坐标,并且不对底层数据结构做出假设)。

关于java - 计算半径中的二维坐标(对于基于图 block 的游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29878437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com