凸包问题-蛮力法

首先明确凸包的概念。

定义:一个点集合S的凸包(convex hull)是包含S的最小凸集合(“最小”是指:S的凸包一定是所有包含S的凸集合的子集)

用形象一点的话比喻就是:若干钉子钉在一个面上,用一条橡皮筋把所有的钉子都圈住。凸包就是以橡皮筋为边界的区域。


凸包问题:在n个点的集合中,寻找出某些点,它们是这个集合凸多边形的顶点。


蛮力法算法思路:对于一个n个点集合中的两点pipj,当且仅当该集合中的其它点都位于穿过pipj所构成直线的同一边,很明显,其它点之间的连线是该集合凸包边界的一部分。对每一对点都做一遍检查后,满足条件的线段构成了该凸包的边界。

根据中学的几何知识:

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题是计算多边形的问题是一种朴素的算,它的时间复杂度为O(n^2)。下面是基于C语言实现的求解问题的代码: ```c #include <stdio.h> typedef struct { int x; int y; } Point; int direction(Point a, Point b, Point c) { return (c.y - a.y) * (b.x - a.x) - (b.y - a.y) * (c.x - a.x); } void findConvexHull(Point p[], int n) { int i, j, k, count = 0; for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { int flag = 1; for (k = 0; k < n; k++) { if (k != i && k != j) { if (direction(p[i], p[j], p[k]) > 0) { flag = 0; break; } } } if (flag) { printf("(%d,%d) ", p[i].x, p[i].y); printf("(%d,%d) ", p[j].x, p[j].y); count++; } } } if (count == 0) { printf("不存在\n"); } } int main() { Point p[] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}, {2, 1}, {2, 2}, {1, 2}}; int n = sizeof(p) / sizeof(p[0]); findConvexHull(p, n); return 0; } ``` 该代码采用了三重循环,分别枚举所有可能的点对和第三个点,判断它们是否构成的一条边。其中,direction函数用来计算三个点之间的方向关系,如果方向为正,则表示三个点按照逆时针方向排列,否则表示按照顺时针方向排列。如果第三个点在点对的左侧,则说明这条边不是的边。如果所有第三个点都在点对的右侧,则这条边是的一条边。 以上代码是一种朴素的实现方式,时间复杂度较高,但在数据规模较小的情况下,可以得到正确的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值