求:线段分割多边形的算法

yingkoz 2009-03-05 12:17:52
给定一个任意形状的不自交、封闭多边形(包括凸的和凹的)和一条线段,
1.求线段和多边形的交点个数。
2.保存分割后形成的所有的多变形。

谁有和上面类似的算法啊,麻烦告诉一下,谢谢了!!!
...全文
969 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
油焖大侠 2012-02-24
  • 打赏
  • 举报
回复
怎么按顶点顺序绕一圈啊?[Quote=引用 1 楼 dlyme 的回复:]
这个问题并不复杂,不需要什么特别的算法:
1.最简单的办法,依次判断给出的线段和多边形的n条边是否相加(判断两线段是否相交总会计算吧?高效一些的可以用跨立法),就可以得到交点的个数;
2.由于你给出的是“线段”,所以存在只有一个交点的特殊情况,这时多边形没有被分割。
如果交点个数在2个或2个以上:
a)对于凸多边形来说,最多就2个交点。此时多边形被这两个交点连成的线段分割成了两个小的凸多变……
[/Quote]
umlzhijia 2009-03-13
  • 打赏
  • 举报
回复
我最近写了两个图形∩∪差的算法,原理很简单,先把图形调整为逆时钟旋转,在交点处不断转换在不同边中行走,就可以找出∩∪的集合,差集时,在a-b 时,在a中逆时钟行走,b中顺时钟行走走出的结果集 就是差集了。
  • 打赏
  • 举报
回复
画一下图就很清楚了,其实就是这个意思:


swiftwqq 2009-03-10
  • 打赏
  • 举报
回复
我最近也在研究这个算法,讲一个复杂多边形切割成多个小多边形,切割之后的每个小多边形至少有一段、至多有两段“割线”来作为它的边?这个是一段还是两端的如何判断?
问dlyme兄,能否再讲的详细点,谢谢。
????
想象一下,将所有的顶点和交点按照顺时针(绕多边形顺时针绕一圈)的顺序围成一个大圆。
有效(原多边形内部)割线对应的交点之间用线段连起来,这些弦不会发生交叉。
圆怎么被切的,多边形就是怎样被切的,一样的道理~
????
ningyong58 2009-03-06
  • 打赏
  • 举报
回复
收藏
kon3155 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断(判断两个交点的中点是否在原多边形内部,射线法、转角法...都可以)。然后按照顶点(包括交点)的顺序绕一圈,就可以得到分割后的所有多边形[/Quote]

“判断两个交点的中点是否在原多边形内部”,是那两个交点?按什么顺序的交点?像下面这个多边形被直线分割,可没那么简单啊!

  • 打赏
  • 举报
回复
想象一下,将所有的顶点和交点按照顺时针(绕多边形顺时针绕一圈)的顺序围成一个大圆。
有效(原多边形内部)割线对应的交点之间用线段连起来,这些弦不会发生交叉。
圆怎么被切的,多边形就是怎样被切的,一样的道理~
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kon3155 的回复:]
判断出内部和外部之后,怎么绕呢?如下图,怎么绕才能得到填充的多边形呢?
[/Quote]
注意切割之后的每个小多边形至少有一段、至多有两段“割线”来作为它的边。
假设有m段(在内部有效的)割线,原来的多边形就会被切成m+1块

图就不画了,这部分并不复杂,自己琢磨一下就清楚了~
  • 打赏
  • 举报
回复
把一个“回”字形的凹多边形一刀切成两半,看看是不是有段“割线”落在外面了?
你要求的是原来的多边形切割之后的被划分成的区域,总不能凭空多出一块来吧?
kon3155 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
然后按照顶点(包括交点)的顺序绕一圈,就可以得到分割后的所有多边形
[/Quote]

判断出内部和外部之后,怎么绕呢?如下图,怎么绕才能得到填充的多边形呢?
绿色夹克衫 2009-03-06
  • 打赏
  • 举报
回复
因为第二问不是要保存多边形么,在里面的就成为了多边形的新的边,在外面的就不是!

[Quote=引用 9 楼 yingkoz 的回复:]
引用 1 楼 dlyme 的回复:
b)对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断...

为什么要判断交点连成的“割线”是否落在多边形之外?
[/Quote]
yingkoz 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
b)对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断...
[/Quote]
为什么要判断交点连成的“割线”是否落在多边形之外?
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kon3155 的回复:]
“判断两个交点的中点是否在原多边形内部”,是那两个交点?按什么顺序的交点?像下面这个多边形被直线分割,可没那么简单啊!
[/Quote]
当然是按照射线的反向、判断射线上相邻两个交点的中点是在内部还是外部~
yingkoz 2009-03-06
  • 打赏
  • 举报
回复
不能沉啊!!!
绿色夹克衫 2009-03-05
  • 打赏
  • 举报
回复
就像1楼说的,依次求多边形的各个边同直线的交点,求交点可以用快斥法+跨立法(也是前两天刚学的!)
jlj84237485 2009-03-05
  • 打赏
  • 举报
回复
帮顶一下
yingkoz 2009-03-05
  • 打赏
  • 举报
回复
自己顶一下!

  • 打赏
  • 举报
回复 1
这个问题并不复杂,不需要什么特别的算法:
1.最简单的办法,依次判断给出的线段和多边形的n条边是否相加(判断两线段是否相交总会计算吧?高效一些的可以用跨立法),就可以得到交点的个数;
2.由于你给出的是“线段”,所以存在只有一个交点的特殊情况,这时多边形没有被分割。
如果交点个数在2个或2个以上:
a)对于凸多边形来说,最多就2个交点。此时多边形被这两个交点连成的线段分割成了两个小的凸多变形;
b)对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断(判断两个交点的中点是否在原多边形内部,射线法、转角法...都可以)。然后按照顶点(包括交点)的顺序绕一圈,就可以得到分割后的所有多边形。
目录 目录 1 Graph 图论 3 | DAG 的深度优先搜索标记 3 | 无向图找桥 3 | 无向图连通度(割) 3 | 最大团问题 DP + DFS 3 | 欧拉路径 O(E) 3 | DIJKSTRA 数组实现 O(N^2) 3 | DIJKSTRA O(E * LOG E) 4 | BELLMANFORD 单源最短路 O(VE) 4 | SPFA(SHORTEST PATH FASTER ALGORITHM) 4 | 第 K 短路(DIJKSTRA) 5 | 第 K 短路(A*) 5 | PRIM MST 6 | 次小生成树 O(V^2) 6 | 最小生成森林问题(K 颗树)O(MLOGM). 6 | 有向图最小树形图 6 | MINIMAL STEINER TREE 6 | TARJAN 强连通分量 7 | 弦图判断 7 | 弦图的 PERFECT ELIMINATION 点排列 7 | 稳定婚姻问题 O(N^2) 7 | 拓扑排序 8 | 无向图连通分支(DFS/BFS 邻接阵) 8 | 有向图强连通分支(DFS/BFS 邻接阵)O(N^2) 8 | 有向图最小点基(邻接阵)O(N^2) 9 | FLOYD 最小环 9 | 2-SAT 问题 9 Network 网络流 11 | 二分图匹配(匈牙利算法 DFS 实现) 11 | 二分图匹配(匈牙利算法 BFS 实现) 11 | 二分图匹配(HOPCROFT-CARP 的算法) 11 | 二分图最佳匹配(KUHN MUNKRAS 算法 O(M*M*N)) 11 | 无向图最小割 O(N^3) 12 | 有上下界的最小(最大)流 12 | DINIC 最大流 O(V^2 * E) 12 | HLPP 最大流 O(V^3) 13 | 最小费用流 O(V * E * F) 13 | 最小费用流 O(V^2 * F) 14 | 最佳边割集 15 | 最佳点割集 15 | 最小边割集 15 | 最小点割集(点连通度) 16 | 最小路径覆盖 O(N^3) 16 | 最小点集覆盖 16 Structure 数据结构 17 | 某天是星期几 17 | 左偏树 合并复杂度 O(LOG N) 17 | 树状数组 17 | 二维树状数组 17 | TRIE 树(K 叉) 17 | TRIE 树(左儿子又兄弟) 18 | 后缀数组 O(N * LOG N) 18 | 后缀数组 O(N) 18 | RMQ 离线算法 O(N*LOGN)+O(1) 19 | RMQ(RANGE MINIMUM/MAXIMUM QUERY)-ST 算法 (O(NLOGN + Q)) 19 | RMQ 离线算法 O(N*LOGN)+O(1)解 LCA 19 | LCA 离线算法 O(E)+O(1) 20 | 带权值的并查集 20 | 快速排序 20 | 2 台机器工作调度 20 | 比较高效的大数 20 | 普通的大数运算 21 | 最长公共递增子序列 O(N^2) 22 | 0-1 分数规划 22 | 最长有序子序列(递增/递减/非递增/非递减) 22 | 最长公共子序列 23 | 最少找硬币问题(贪心策略-深搜实现) 23 | 棋盘分割 23 | 汉诺塔 23 | STL 中的 PRIORITY_QUEUE 24 | 堆栈 24 | 区间最大频率 24 | 取第 K 个元素 25 | 归并排序逆序数 25 | 逆序数推排列数 25 | 二分查找 25 | 二分查找(大于等于 V 的第一个值) 25 | 所有数位相加 25 Number 数论 26 1 |递推欧拉函数 PHI(I) 26 |单独欧拉函数 PHI(X) 26 | GCD 最大公约数 26 | 快速 GCD 26 | 扩展 GCD 26 | 模线性方程 A * X = B (% N) 26 | 模线性方程组 26 | 筛素数 [1..N] 26 | 高效小范围素数 [1..N] 26 | 随机素数测试(伪素数原理) 26 | 组合数学相关 26 | POLYA 计数 27 | 组合数 C(N, R) 27 | 最大 1 矩阵 27 | 约瑟夫环问题(数学方法) 27 | 约瑟夫环问题(数组模拟) 27 | 取石子游戏 1 27 | 集合划分问题 27 | 大数平方根(字符串数组表示) 28 | 大数取模的二进制方法 28 | 线性方程组 A[][]X[]=B[] 28 | 追赶法解周期性方程 28 | 阶乘最后非零位,复杂度 O(NLOGN) 29 递归方法解排列组合问题 30 | 类循环排列 30 | 全排列 30 | 不重复排列 30 | 全组合 31 | 不重复组合 31 | 应用 31 模式串匹配问题总结 32 | 字符串 HASH 32 | KMP 匹配算法 O(M+N) 32 | KARP-RABIN 字符串匹配 32 | 基于 KARP-RABIN 的字符块匹配 32 | 函数名: STRSTR 32 | BM 算法的改进的算法 SUNDAY ALGORITHM 32 | 最短公共祖先(两个长字符串) 33 | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 凸包 O(N * LOGN) 34 | 判断线段相交 34 | 多边形重心 34 | 三角形几个重要的点 34 | 平面最近点对 O(N * LOGN) 34 | LIUCTIC 的计算几何库 35 | 平面上两点之间的距离 35 | (P1-P0)*(P2-P0)的叉积 35 | 确定两条线段是否相交 35 | 判断点 P 是否在线段 L 上 35 | 判断两个点是否相等 35 | 线段相交判断函数 35 | 判断点 Q 是否在多边形内 35 | 计算多边形的面积 35 | 解二次方程 AX^2+BX+C=0 36 | 计算直线的一般式 AX+BY+C=0 36 | 点到直线距离 36 | 直线与圆的交点,已知直线与圆相交 36 | 点是否在射线的正向 36 | 射线与圆的第一个交点 36 | 点 P1 关于直线 LN 的对称点 P2 36 | 两直线夹角(弧度) 36 ACM/ICPC 竞赛之 STL 37 ACM/ICPC 竞赛之 STL 简介 37 ACM/ICPC 竞赛之 STL--PAIR 37 ACM/ICPC 竞赛之 STL--VECTOR 37 ACM/ICPC 竞赛之 STL--ITERATOR 简介 38 ACM/ICPC 竞赛之 STL--STRING 38 ACM/ICPC 竞赛之 STL--STACK/QUEUE 38 ACM/ICPC 竞赛之 STL--MAP 40 ACM/ICPC 竞赛之 STL--ALGORITHM 40 STL IN ACM 41 头文件 42 线段树 43 矩形并的面积(线段树+离散化+扫描线) 43 矩形并的周长(线段树+离散化+扫描线) 44
2017年秋学期中石油华东《计算机图形学》2017年春学期在线作业〔一〕 一、单选题〔共 15 道试题,共 75 分.〕 1. 下列关于齐次坐标的说法,不正确的是〔 〕. A. 二维平面中的点用非齐次坐标表示时,具有两个分量,且是唯一的 B. 齐次坐标技术就是用n+1维向量表示一个n维向量,而且在n+1维空间中讨论n维向量的变换 C. 用齐次坐标技术可以对平移、比例、旋转等几何变换用矩阵乘法来处理 D. 齐次坐标表示技术不可以用来表示无穷远点 正确答案: 2. 以下关于图形变换的论述那些是错误的〔 〕. A. 错切变换虽然可引起图形角度的改变,但不会发生图形畸变 B. 平移变换不改变图形大小和形状,只改变图形位置 C. 任意一个变换序列均可表示为一个组合变换矩阵,该组合变换矩阵是基本变换矩阵的和 D. 旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 正确答案: 3. 下列关于直线段扫描转换的中点算法中,〔 〕是正确的. A. 对不同斜率的直线段而言,判断下一像素采用的递推公式一样 B. 中点算法中的基本运算是浮点运算 C. 因直线具有正负划分性,所以可以采用中点算法 D. DDA算法中有乘法运算,而中点算法中没有乘法运算 正确答案: 4. 多边形扫描线算法主要有3个步骤,正确的次序是〔 〕. 1> 计算扫描线与多边形各边的交点; 2> 将交点两两配对,并填充每一区段; 3> 对交点按x坐标从小到大排序. A. 1,2,3 B. 1,3,2 C. 2,3,1 D. 3,2,1 正确答案: 5. 下列关于区域采样进行反走样处理的描述中,〔 〕不正确. A. 加权和非加权方法都需要计算直线段和像素的面积 B. 在计算面积时,两种方法可以离散化像素进行快速计算 C. 非加权方法考虑子像素离像素中心的距离 D. 加权方法考虑子像素离像素中心的距离 正确答案: 6. 利用种子填充算法实现多边形填充时,边界和内点的连通性要是〔 〕. A. 内点为4连通时,边界必须为4连通 B. 内点为4连通时,边界必须为8连通 C. 内点为8连通时,边界必须为4连通 D. 内点为8连通时,边界必须为8连通 正确答案: 7. 分辨率为1024x1024的显示器大约需要〔 〕字节位平面数为24的帧缓存. A. 512KB B. 1MB C. 2MB D. 3MB 正确答案: 8. 关于线宽控制中,正确的说法是〔 〕. A. 复制像素法执行效率高,适合于比较大的线宽 B. 方形画笔绘制线段,当斜率接近于1,宽度最小 C. 复制像素法在斜率等于1时,宽度最大 D. 常用的线宽控制方法有复制像素法、移动画笔法和区域填充法等 正确答案: 9. 计算机图形显示器一般使用什么颜色模型〔 〕. A. RGB B. CMY C. HSV D. HLS 正确答案: 10. 在中点画圆算法中,哪种说法是错误的〔 〕. A. 为了减轻画圆的工作量,中点画圆利用了圆的四对称性质 B. 双步画线算法是一个增量算法 C. 中点画圆算法只用到整数的加减法和左移运算,故效率高且适合硬件实现 D. 中点画圆法与中点画线法类似,用一个函数值来选择两个像素点中最逼近圆弧的像素点 正确答案: 11. 下列关于射线法判断点v是否在多边形内部的命题中,〔 〕正确. A. 根据从v引出的射线与多边形交点个数可以断定是否在多边形内部 B. 射线法可以适用于任何多边形 C. 当射线通过多边形边的顶点时,这时交点个数算2个 D. 当射线通过多边形边的顶点时,这时交点个数算1个 正确答案: 12. 〔 〕是图形的基本元素,其生成算法直接决定着系统的效率. A. 直线和圆弧 B. 直线和多边形 C. 圆弧和多边形 D. 曲线和曲面 正确答案: 13. 计算机图形学与计算机图像处理的关系是〔 〕. A. 计算机图形学是基础,计算机图像处理是其发展 B. 不同的学科,研究对象和数学基础不同,但它们之间也有可转换部分 C. 同一学科在不同场合的不同称呼而已 D. 完全不同的学科,两者毫不相干 正确答案: 14. 请在下列语句中选出正确论述〔 〕. A. 一般图形系统中所配置的点阵绘图打印机其分辨率对图形处理运算的精度没有直接影响 B. 在图形文件中通常不采用点阵来描述图形 C. 彩色打印机所使用CMY 颜色模型不能由RGB 颜色模型计算得到 D. 在光栅扫描图形显示器中可直接显示用几何特征参数来描述的图形元素 正确答案: 15. 多边形填充时,下述论述错误的是〔 〕. A. 多边形被两条扫描线分割成许多梯形,梯形的底边在扫描线上,腰在多边形的边上,并且相 间排列 B. 多边形与某扫描线相交得到偶数个交点,这些交点间构成的线段分别在多边形内、外,并 且相间排列 C. 在判断点是否在多边形内时,一般通

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧