首页 > 其他分享 >P1355 神秘大三角(凸包)

P1355 神秘大三角(凸包)

时间:2024-06-09 13:22:36浏览次数:15  
标签:ch return Point double 三角 凸包 Vector C1 P1355

P1355 神秘大三角 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

队友推荐的,算是入门凸包,就是用叉积判断一下点是否相对每条边都在凸包的边的左侧。

  1 #include <bits/stdc++.h>
  2 
  3 using namespace  std;
  4 
  5 #define ll long long
  6 
  7 const int N=1e3+10;
  8 
  9 double eps=1e-8;
 10 
 11 double pi=acos(-1);
 12 
 13 struct Point{
 14 
 15     double x,y;
 16 
 17     Point(double x=0,double y=0):x(x),y(y){};
 18 
 19 };
 20 
 21 typedef Point Vector;
 22 
 23 Vector operator +(Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
 24 
 25 Vector operator -(Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
 26 
 27 Vector operator *(Vector A,double B){return Vector(A.x*B,A.y*B);}
 28 
 29 Vector operator /(Vector A,double B){return Vector(A.x/B,A.y/B);}
 30 
 31 int dcmp(double x){
 32 
 33     if(fabs(x)<eps)return 0;
 34 
 35     return x<0?-1:1;
 36 
 37 }
 38 
 39 bool operator<(const Point&a,const Point&b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
 40 
 41 bool operator == (const Point &a,const Point &b){return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;}
 42 
 43 double Dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}
 44 
 45 double Length(Vector A){return sqrt(Dot(A,A));}
 46 
 47 double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}
 48 
 49 double Angle(Vector A,Vector B){return acos(Dot(A,B)/Length(A)/Length(B));}
 50 
 51 double Angle(Vector A) {return atan2(A.y, A.x);}
 52 
 53  
 54 
 55 struct Circle{    //圆
 56 
 57     Point c;
 58 
 59     double r;
 60 
 61     Circle(Point c = Point(0, 0), double r = 0):c(c),r(r){}
 62 
 63     Point point(double a){
 64 
 65         return Point(c.x+cos(a)*r,c.y+sin(a)*r);
 66 
 67     }
 68 
 69 };
 70 
 71 double dis(Point A,Point B){
 72 
 73     return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
 74 
 75 }
 76 
 77 int circle_circle(Circle C1,Circle C2,vector<Point>&sol){//返回圆与圆的交点个数
 78 
 79     double d=Length(C1.c-C2.c);
 80 
 81     if(dcmp(d)==0){
 82 
 83         if(dcmp(C1.r-C2.r)==0)return -1;
 84 
 85         return 0;
 86 
 87     }
 88 
 89     if(dcmp(C1.r+C2.r-d)<0)return 0;
 90 
 91     if(dcmp(fabs(C1.r-C2.r)-d)>0)return 0;
 92 
 93     double a=Angle(C2.c-C1.c);
 94 
 95     double da=acos((C1.r*C1.r+d*d-C2.r*C2.r)/(2*d*C1.r));
 96 
 97     Point p1=C1.point(a-da),p2=C1.point(a+da);
 98 
 99     sol.push_back(p1);
100 
101     if(p1==p2)return 1;
102 
103     sol.push_back(p2);
104 
105     return 2;
106 
107 }
108 
109  
110 
111 Point line_point(Point p,Vector v,Point q,Vector w){//直线交点
112 
113     Vector u=p-q;
114 
115     double t=Cross(w,u)/Cross(v,w);
116 
117     return p+v*t;
118 
119 }
120 
121 bool onsegment(Point p,Point a1,Point a2){
122 
123     if(p==a1||p==a2)return true;
124 
125     return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;
126 
127 }
128 
129 bool segmentcross(Point a1,Point a2,Point b1,Point b2){
130 
131     double c1=Cross(a2-a1,b1-a1),c2=Cross(a2-a1,b2-a1),
132 
133            c3=Cross(b2-b1,a1-b1),c4=Cross(b2-b1,a2-b1);
134 
135     return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
136 
137 }
138 
139 Point line_line(Point A,Point B,Point C,Vector D){//线段交点
140 
141     if(segmentcross(A,B,C,D)){
142 
143         return line_point(A,B-A,C,D-C);
144 
145     }
146 
147     return Point(123.456,0);
148 
149 }
150 
151 int tubao(Point *p,int n,Point *ch){
152 
153     sort(p,p+n);
154 
155     n=unique(p,p+n)-p;
156 
157     int m=0;
158 
159     for(int i=0;i<n;i++){
160 
161         while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--;
162 
163         ch[m++]=p[i];
164 
165     }
166 
167     int k=m;
168 
169     for(int i=n-2;i>=0;i--){
170 
171         while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--;
172 
173         ch[m++]=p[i];
174 
175     }
176 
177     if(n>1)m--;
178 
179     return m;
180 
181 }
182 
183 double tubaos(Point *p,int n){
184 
185     double area=0;
186 
187     for(int i=1;i<n-1;i++){
188 
189         area+=Cross(p[i]-p[0],p[i+1]-p[0]);
190 
191     }
192 
193     return area/2;
194 
195 }
196 
197 int intubao(Point *ch,int n,Point p){
198 
199     Vector A,B;
200 
201     int flag=0;
202 
203     for(int i=0;i<n;i++){
204         if(ch[i] == p)return -2; //p在凸包端点上
205 
206         A=ch[(i+1)%n]-ch[i];
207 
208         B=p-ch[i];
209 
210         if(onsegment(p,ch[i],ch[(i+1)%n])){
211 
212             flag=-1;//在凸包边上
213 
214             break;
215 
216         }
217 
218         else if(Cross(A,B)>0){
219 
220             flag++;
221 
222         }
223 
224     }
225 
226     if(flag==-1||flag==n)return flag;//flag=n说明在凸包里面
227 
228     return 0;//在凸包外面
229 
230 }
231 
232 double x[N],y[N];
233 
234 Point p[N],q[N],ch[N],ans[N];
235 
236 int main(){
237 
238     char c;
239 
240     for(int i = 0;i < 4;i++){
241         cin >> c >> p[i].x >> c >> p[i].y >> c;
242     }
243     
244     int n = tubao(p, 3, ch);
245     int res = intubao(ch, n, p[3]);
246     if(res == 3)cout << 1 << endl;
247     else if(res == 0)cout << 2 << endl;
248     else if(res == -1)cout << 3 << endl;
249     else cout << 4 << endl;
250 
251 
252 }

 

   

标签:ch,return,Point,double,三角,凸包,Vector,C1,P1355
From: https://www.cnblogs.com/ccsu-kid/p/18239484

相关文章

  • css 理解了原理,绘制三角形就简单了
     1.border-位置注意:border-bottom/up/right/left主要是以三角形的结构搭建而成,而border也是如此。而且从边框的外围开始计算像素尺寸。在理解了这一点之后,绘制三角形就简单多了。1.transparent注意:该属性主要是颜色透明。<template> <mainstyle="width:500px;border:......
  • 杨辉三角C语言的超简单解决办法
    #include<stdio.h>#include<stdlib.h>intmain(){intarr[10][10]={0};//十行的杨辉三角intsize=sizeof(arr)/sizeof(arr[0]);//求一共有几行for(inti=0;i<size;i++){for(intj=0;j<=i;j++)//对角线{if(i==j||j=......
  • 【教学类-58-09】黑白三角拼图07(1页3张黑白的白点卡片,一种宫格36张,适合一个班级一次操
    背景需求之前做了传统三角拼图,但是感觉幼儿遇到一些平行四边形时,都不知道要连接那几个点。【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张-CSDN博客文章浏览阅读864次,点赞27次,收藏16次。【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张htt......
  • 【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作
    作品展示背景需求【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)-CSDN博客文章浏览阅读343次,点赞10次,收藏6次。【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)https://blog.csdn.net/reasons......
  • OpenGL:三角形的诞生
    先放一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分:顶点缓冲对象(VBO)所有的顶点数据(位置、纹理、法线等)都需要存储在GPU上,OpenGL通过顶点缓冲对象管理这个内存。其声明和绑定的代码函数如下:unsignedintvbo;glGenBuffers(1,......
  • 合合信息启信数据洞察:长三角新能源汽车产业协同,打造“4小时产业圈”
    新能源汽车作为战略性新兴产业的重要组成部分,已被《“十四五”规划和2035年远景目标纲要》明确聚焦,旨在推动我国经济增长新动能、构建国际竞争新优势、实现从工业大国向工业强国的转变,并作为打造中国制造“升级版”的关键领域。近日,合合信息旗下启信数据发布《2024新质生产力......
  • 08_杨辉三角
    118.杨辉三角给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例1:输入:numRows=5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例2:输入:numRows=1输出:[[1]]提示:1<=numRows<......
  • Unity 多边形三角化
    GitHub找到一个用耳切法进行多边形三角化的库,简单测试了一下,感觉还行,推荐给大家项目地址:https://github.com/SebLague/Ear-Clipping-Triangulation测试代码:usingSebastian.Geometry;usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publi......
  • 三角网分块问题
        针对超大数据的构网问题,目前可行的方法就是对三角网进行分块处理,但是三角网的分块显然不像点云数据那么简单,如何对三角网进行切分,以及切分后块与块之间索引关系的建立都是难点;例如下图仅仅是对三角网进行了空间的切分,但是块与块的边界处的联系并没有建立。当然三角网......
  • 长三角快递物流展会议推荐:2024中国快递物流智能装备创新技术论坛
    一、会议介绍随着电商、新零售、工业领域的不断发展与创新,快递物流行业正迎来前所未有的发展机遇。为了进一步推动智能装备在快递物流领域的创新应用与发展,由上海市快递行业协会,青浦圆桌会议主办的“2024中国快递物流智能装备创新技术论坛”于2024年7月9日在杭州国际博览中心......