arrays - 简化二维网格上的路径
问题描述
我在二维网格上生成从点 A 到点 B 的路径,该路径返回一个点数组供我的单元通过,数组中的每个元素都有一个 X 和 Y 坐标。
红点是路径起点,蓝点是终点,棕色点是数组中包含的点(数组还包括起点和终点),绿线是路径。
解决方案
如果我们考虑输入路径上的 3 个点,(p0,p1,p2)
我们希望p1
在以下条件为真时删除中间点:
(p1.x - p0.x) (p2.x - p1.x)
------------- == -------------
(p1.y - p0.y) (p2.y - p1.y)
或者等价地,避免被零除的风险:
(p1.x - p0.x) * (p2.y - p1.y) == (p1.y - p0.y) * (p2.x - p1.x)
这里有一些Java代码来说明:
static List<Point> simplify(List<Point> poly)
{
if(poly.size() < 3) return new ArrayList<>(poly);
List<Point> spoly = new ArrayList<>();
spoly.add(poly.get(0));
for(int i = 0, dx = 0, dy = 0; i < poly.size()-1; i++)
{
Point p0 = poly.get(i);
Point p1 = poly.get(i+1);
int x = p1.x - p0.x;
int y = p1.y - p0.y;
if(i > 0 && (dx * y != dy * x))
spoly.add(poly.get(i));
dx = x;
dy = y;
}
spoly.add(poly.get(poly.size()-1));
return spoly;
}
测试:
List<Point> poly =
Arrays.asList(p(0, 0), p(1, 1), p(2, 2), p(3, 3), p(4, 3), p(5, 3), p(6, 3));
System.out.println(simplify(poly));
输出:
[(0, 0), (3, 3), (6, 3)]
推荐阅读
- html - 自动填充(登录凭据)在 IE11 和 Edge 中不起作用
- coq - 自然数列表的拆分
- ios - iOS 中的 Firebase 身份验证以及 Swift 5 的最新更新
- python - 使用 pandas python 在 excel 文件中获取不相关的日期并创建标题并添加评论,例如“日期不相关”
- reactjs - 部署到 azure 应用服务时反应无效的主机头错误
- python - 在 Python 中将两个空列表之间的所有列表(字符串列表)合并为一个列表
- loopbackjs - 模型中的环回数据源特定配置
- excel - 如何在 Wscript.Shell + cmd.exe 中使用变量?
- wordpress - WP火箭缓存问题
- kotlin - 过滤 val 变量而不更改其声明 Kotlin