首页 > 其他分享 >四叉树写着玩

四叉树写着玩

时间:2023-05-28 17:45:56浏览次数:18  
标签:AddNewPoint points 四叉树 矩形 children isLeaf

在看碰撞检测的时候看到了四叉树。闲着没事,写一个玩玩呗。

除了都含有一个矩形区域外,叶子节点能存几个粒子,而分支结点包含四个子节点,分别代表四个小矩形。结构还是很清晰的: struct QUAD{RECT boundary; BOOL isLeaf; union{POINT points[4]; LPQUAD children[4];}; } 。程序的任务就是:新建一个窗口,在客户区内画个边界,然后往这个矩形里插入新点,每个区域在适当的时候递归划分为4个小矩形,最终使每个矩形里最多只包含4个点。

插入新点P到矩形R内时这样做:

PROC AddNewPoint(P,R)://将点P放到矩形R里
    if R.isLeaf==FALSE {
        if P位于左上:AddNewPoint(P,R.children[0]),结束
        if P位于右上:AddNewPoint(P,R.children[1]),结束
        if P位于左下:AddNewPoint(P,R.children[2]),结束
        if P位于右下:AddNewPoint(P,R.children[3])
        结束 }
    找[K]:R.points[K]=NOPOINT //NOPOINT是空标志
    if K∈[0..3] then R.points[K]←P, 结束
    TEMP ← R.points[0..3] // 暂存
    (左上,右上,左下,右下) ← 根据R划分出四个子矩形
    R.children[0..3] ← (左上,右上,左下,右下)
    R.isLeaf ← FALSE
    for E in TEMP:
        AddNewPoint(E,R) //安排这些点到子矩形中
    AddNewPoint(P,R) //加入新点
END

验证了一下,效果还行吧。

可恶!死去的计算机图形学知识又开始袭击我!

幸好本人数学不太行,我全部防出去了啊~~

标签:AddNewPoint,points,四叉树,矩形,children,isLeaf
From: https://www.cnblogs.com/tingzhouduruo/p/play-with-quad-tree.html

相关文章

  • Uva--297 Quadtrees(非二叉树/四叉树)
    记录18:342023-5-20uva.onlinejudge.org/external/2/297.htmlreference:《算法竞赛入门经典第二版》例题6-11非二叉树,这还是比较有趣的,图形学上还有八叉树用来划分空间的。这道题将图和四叉巧妙的结合起来,其原理也是使用先序遍历,边读边建树#include<cstdio>#include<cstri......
  • 如何在unity中手写一个四叉树地形lod系统(二)
    在根据四叉树节点创建了1365个地形分块网格并保存到本地后,我们接下来要在游戏运行的过程中动态地显示所需的网格,这是最关键的一步。如何根据摄像机位置动态地选择地形块?这其中体现了由整体到局部,从简单到复杂的原则。0、我们首先创建三个缓存列表。1、我们先......
  • unity四叉树地形
    在unity中,我们可以使用unity自带的地形系统创建一个超大的地形场景,并且可以利用地形图层,创建出富有真实感的地表材质。但是当我们需要更改地形的渲染方式的时候,比如需要风格化渲染时,使用unity自带的地形系统就会很麻烦。因此,我尝试在unity中使用mesh的方式实现了一个简易的地形系......
  • 基于四叉树的小顶堆(最小优先队列)
    实现来自Go源码 从下往上调整堆funcsiftupTimer(t[]*timer,iint)bool{ifi>=len(t){returnfalse}when:=t[i].whentmp:=t[i]......