博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树辅助——扫描线法计算矩形面积并
阅读量:6391 次
发布时间:2019-06-23

本文共 781 字,大约阅读时间需要 2 分钟。

分析:

1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度

2.重点:扫描线法:假想有一条扫描线,从左往右(从右往左),或者从下往上(从上往下)扫描过整个多边形(或者说畸形。。多个矩形叠加后的那个图形)。如果是竖直方向上扫描,则是离散化横坐标,如果是水平方向上扫描,则是离散化纵坐标。下面的分析都是离散化横坐标的,并且从下往上扫描的

   扫描之前还需要做一个工作,就是保存好所有矩形的上下边,并且按照它们所处的高度进行排序,另外如果是上边我们给他一个值-1,下边给他一个值1,我们用一个结构体来保存所有的上下边 

struct segment

{
double l,r,h;   //l,r表示这条上下边的左右坐标,h是这条边所处的高度
int f;   //所赋的值,1或-1
}

接着扫描线从下往上扫描,每遇到一条上下边就停下来,将这条线段投影到总区间上(总区间就是整个多边形横跨的长度),这个投影对应的其实是个插入和删除线段操作。还记得给他们赋的值1或-1吗,下边是1,扫描到下边的话相当于往总区间插入一条线段,上边-1,扫描到上边相当于在总区间删除一条线段(如果说插入删除比较抽象,那么就直白说,扫描到下边,投影到总区间,对应的那一段的值都要增1,扫描到上边对应的那一段的值都要减1,如果总区间某一段的值为0,说明其实没有线段覆盖到它,为正数则有,那会不会为负数呢?是不可能的,可以自己思考一下)。

每扫描到一条上下边后并投影到总区间后,就判断总区间现在被覆盖的总长度,然后用下一条边的高度减去当前这条边的高度,乘上总区间被覆盖的长度,就能得到一块面积,并依此做下去,就能得到最后的面积

(这个过程其实一点都不难,只是看文字较难体会,建议纸上画图,一画即可明白,下面献上一图希望有帮组)

 

 

转载地址:http://dbsha.baihongyu.com/

你可能感兴趣的文章
windows文件名非法字符过滤检测-正则表达式
查看>>
android 屏幕旋转180度
查看>>
Connect模块解析 转载
查看>>
javamail.providers not found
查看>>
模拟数据库,表空间和数据文件损坏后的恢复操作
查看>>
Day2_and_Day3 文件操作
查看>>
身份证号信息后台匹配
查看>>
(转)Javascript模块化编程(一):模块的写法
查看>>
UVA 10954 - Add All
查看>>
磁珠,电感,零欧电阻之间的区别
查看>>
反射(高大上)、类的内置方法
查看>>
redis管道技术
查看>>
文件和结构体
查看>>
2059-authentication plugin 'caching_sha2_password"cnnot bt loaded :mysql8.0数据库链接不上:
查看>>
算法:反转链表。
查看>>
Android 消息异步处理之AsyncTask
查看>>
Java垃圾回收工作原理
查看>>
python2 urllib 笔记
查看>>
GCD
查看>>
PDF去除签名
查看>>