
在图形渲染、游戏开发或数据可视化等领域,我们经常需要在一个预先生成的二维点阵中,根据与某个中心点的距离,以圆形模式选择、高亮或操作这些点。一个常见的应用场景是实现视觉动画,例如让点从中心向外依次消失,或在特定圆形区域内进行交互。
假设我们有一个点阵,其结构表示为一个三维数组 point_matrix[xn][yn][2]。其中,xn 和 yn 分别是点在逻辑网格中的X和Y索引,point_matrix[xn][yn][0] 存储该点的屏幕X坐标,point_matrix[xn][yn][1] 存储该点的屏幕Y坐标。我们的核心目标是高效地找出所有与给定中心点距离在特定半径范围内的点。
最直接且在多数情况下足够高效的方法是遍历所有点,并计算它们到指定中心点的欧几里得距离。
给定一个点 P(x, y) 和一个中心点 C(cx, cy),它们之间的欧几里得距离 d 可以通过勾股定理计算: d = sqrt((x - cx)^2 + (y - cy)^2)
要判断一个点是否在半径 r 的圆内(包括边界),我们只需检查 d <= r。
平方根运算(Math.sqrt())通常比乘法和加法消耗更多CPU周期。在仅需比较距离大小的场景中,我们可以避免执行 Math.sqrt(),直接比较距离的平方与半径的平方: d^2 = (x - cx)^2 + (y - cy)^2 如果 d^2 <= r^2,则点在圆内。这种优化在需要大量点或频繁计算距离的场景中尤为重要。
以下示例展示了如何初始化一个点阵,并实现一个函数来检索指定圆形区域内的点。
import java.util.ArrayList;
import java.util.List;
public class CircularPointRetriever {
// 存储点阵数据的三维数组
// point_matrix[xn][yn][0] 存储点的X坐标
// point_matrix[xn][yn][1] 存储点的Y坐标
private static int[][][] point_matrix;
// 存储点阵的逻辑维度:lens[0] = x轴点数, lens[1] = y轴点数
private static int[] lens;
/**
* 根据给定的宽度、高度和点间隔常量初始化点阵。
*
* @param width 总宽度
* @param height 总高度
* @param constant 点之间的间隔
*/
public static void initializePointMatrix(int width, int height, int constant) {
// 计算X轴和Y轴的起始填充,使点阵居中
int padding_X = (int) Math.floor((width % constant) / 2f);
if (padding_X == 0) padding_X = (int) Math.floor(constant / 2);
int padding_Y = (int) Math.floor((height % constant) / 2f);
if (padding_Y == 0) padding_Y = (int) Math.floor(constant / 2);
// 计算X轴和Y轴上的最大点索引
int max_xn = Math.round((width - (padding_X * 2)) / (float) constant);
int max_yn = Math.round((height - (padding_Y * 2)) / (float) constant);
point_matrix = new int[max_xn + 1][max_yn + 1][2];
lens = new int[2];
// 填充点阵
for (int yn = 0; yn <= max_yn; yn++) {
int y = (int) (padding_Y + (yn * constant));
for (int xn = 0; xn <= max_xn; xn++) {
int x = (int) (padding_X + (xn * constant));
point_matrix[xn][yn][0] = x;
point_matrix[xn][yn][1] = y;
}
}
lens[0] = max_xn + 1; // 实际X轴上的点数
lens[1] = max_yn + 1; // 实际Y轴上的点数
System.out.println("点阵初始化完成,共 " + lens[0]以上就是在二维点阵中高效检索圆形区域内的点的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号