判断凸包

2024-06-16 05:18
文章标签 判断 凸包

本文主要是介绍判断凸包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面以hdu2108为例,说明一下判断凸包的算法。

直接贴此题代码: 232K+15MS

#include <stdio.h>
#include <stdlib.h>
#define Max 1010
typedef struct Point{
int x;
int y;
}point;
point node[Max];
int n;
int det(int x1,int y1,int x2,int y2){
return x1*y2-x2*y1;
}
int cross(point A,point B,point C,point D){
return det(B.x-A.x,B.y-A.y,D.x-C.x,D.y-C.y);
}
bool Is_covbag(){
for(int i=0;i<=n-1;i++)
if(cross(node[i],node[i+1],node[i+1],node[i+2])<0)
return false;
return true;
}
int main(){
while(scanf("%d",&n),n){
if(n<3)
printf("concave\n");
else{
for(int i=1;i<=n;i++)
scanf("%d%d",&node[i].x,&node[i].y);
node[0].x=node[n].x,node[0].y=node[n].y;
node[n+1].x=node[1].x,node[n+1].y=node[1].y;
if(Is_covbag())
printf("convex\n");
else
printf("concave\n");
}
}
return 0;
}
<span style="font-family:Arial;BACKGROUND-COLOR: #ffffff">下面是更一般的算法模板:</span>
<pre class="cpp" name="code">01.#include<stdio.h>   
02.#include<stdlib.h>   
03.#include<math.h>   
04.#define eps 1e-6 // 最小精度限制   
05.#define Max 1010 // 设置最大多边形顶点个数   
06.#define PI 3.141592654 //PI尽可能精度取高   
07.typedef struct Point{ // 点结构   
08.    double x;  
09.    double y;  
10.}point;  
11.point node[Max];  
12.point cir; // 圆坐标   
13.int n;  
14.double cirr; //圆半径   
15.int dblcmp(double x){ // 判断正负零函数,一般double类型数据做加减法且要进行判断时,都要用到   
16.    if(fabs(x)<eps)  
17.        return 0;  
18.    return x>0?1:-1;  
19.}  
20.double dotdet(double x1,double y1,double x2,double y2){ // 计算点积(x1,y1)点积(x2,y2)   
21.    return x1*x2+y1*y2;  
22.}  
23.double det(double x1,double y1,double x2,double y2){ // 计算叉积 (x1,y1)叉积(x2,y2)   
24.    return x1*y2-x2*y1;  
25.}  
26.double cross(point A,point B,point C,point D){ // 计算叉积,AB叉积CD   
27.    return det(B.x-A.x,B.y-A.y,D.x-C.x,D.y-C.y);  
28.}  
29.double dist(point A,point B){ 计算点A与B距离  
30.    return sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));  
31.}  
32.double angle(point A,point B){ // 计算圆心与点A、B构成三角形的角度,圆心的角度   
33.    return acos(dotdet(A.x-cir.x,A.y-cir.y,B.x-cir.x,B.y-cir.y)/(dist(A,cir)*dist(B,cir)));  
34.}  
35.bool Is_covbag(){ //判断多边形是否为凸包,其中node可顺时针存放顶点也可逆时针存放顶点   
36.    int dir=0;  
37.    for(int i=0;i<=n-1;i++){  
38.        int temp=dblcmp(cross(node[i],node[i+1],node[i+1],node[i+2]));  
39.        if(dir==0) //第一次不为0,赋值   
40.            dir=temp;  
41.        if(dir*temp<0) //若和第一次的方向不同,说明不是凸包   
42.            return false;  
43.    }  
44.    return true; //为凸包   
45.}  


                                    

这篇关于判断凸包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065547

相关文章

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

【Python如何输入升高和体重判断你是偏胖还是偏瘦】

1、求体质指数得Python代码如下: # BMI(Body Mass Index)指数:简称体质指数,# 是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。# 常用指标:BMI<18.5 偏瘦 18.5<=MBI<=24 正常 MBI>24 偏胖# 计算公式:BMI=体重kg/身高的平方ma = eval(input("请输入你的体重(kg):")) # 输入体重b = e

算法11—判断一个树是不是二叉查询树

问题: 给定一个二叉树,判断它是否是二叉查询树。 思路: 要判断是否是二叉查询树,标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。 代码: [java]  view plain copy pri

算法7— 判断一个单链表是否有环,如果有,找出环的起始位置

第一种方法是从单链表head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候,把该node放在hashset里查找,如果有相同的,就表示有环,如果走到单链表最后一个node,在hashset里都没有重复的node,就表示没有环。 这种方法需要O(n)的空间和时间。 第二种方法是设置两个指针指向单链表的head, 然后开始遍历,第一个指针走一步,第二个指针走两步,如果没

算法6— 判断两个链表是否相交

问题: 给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针。时间复杂度控制在O(n)。 分析: 如果两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是: (1)先找到h1,h2的最后一个节点L1和L2,同时记录节点数量a,b;(这里假设 a > b) (2)判断最后一个节点是否相同

如何判断和处理.DS_Store文件

在Mac上经常会遇到.DS_Store文件,.DS_Store是Mac OS保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于Windows的desktop.ini.那么在使用os.listdir(path)等函数对文件进行操作的时候就会出现invalid literal for int() with base 10 错误。这是因为.DS_Store文件也会包含进去

JS奇偶数判断例子

JS奇偶数判断例子

判断字符串是否为Python标识符

import keyword,stringdef Identifier(s):#内置关键字kw = keyword.kwlist # Bifsbifs = dir(__builtins__) s_list = list(s)# 关键字判断if (s in kw) | (s in bifs):return 'keyWord'# 数字、字母、下划线以及开头判断 elif not s_list[0

java编程:命令行输入的三个整数判断是否构成三角形,不能就抛异常。

写一个方法void sanjiao(int a,int b,int c),判断三个参数是否能构成一个三角形,如果不能则抛出 异常IllegalArgumentException,显示异常信息“a,b,c不能构成三角形”, 如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数,调用此方法,并捕获异常。 附源代码: package 异常;public class Sa

输入一个整数,判断其是否是2^n,是就输出这个数,不是就输出和它最接近的为2^n的那个整数。

输入一个整数,判断其是否是2^n,若是,输出这 //个数,若不是,输出和它最接近的为2^n的那个整数。 附加源代码1: #include<stdio.h>#include<stdlib.h>#include<math.h>int main(){int input;//键盘输入一个整数inputint i,j;//i,j待会儿存放input与左边和右边的为2^n的差值int m