凸包模板 三點不共線點圓半徑
#include<stdio.h> #include<math.h> #include<stdlib.h> struct P{ double x,y; }p[101],stack[101]; /* double getradiusby3point(double x1,double y1,double x2,double y2,double x3,double y3) { double x,y; double a11,a12,a21,a22,b1,b2; double d,d1,d2; a11=2*(x3-x2); a12=2*(y3-y2); a21=2*(x2-x1); a22=2*(y2-y1); b1=x3*x3-x2*x2+y3*y3-y2*y2; b2=x2*x2-x1*x1+y2*y2-y1*y1; d=a11*a22-a12*a21; d1=b1*a22-a12*b2; d2=a11*b2-b1*a21; x=d1/d; y=d2/d; return (x1-x)*(x1-x)+(y1-y)*(y1-y); }*/ double Mul(P p1,P p2,P p3) //叉乘 { return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } double dis(P a,P b) { return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); } int cmp(const void *a,const void *b) { P * c = (P *)a; P * d = (P *)b; double k = Mul(p[0],*c,*d); if(k<0 || (!k && dis(*c,p[0]) > dis(*d,p[0]) ) ) return 1; return -1; } void tubao(int n,int &top) { int i; top = 2; stack[0] = p[0]; stack[1] = p[1]; stack[2] = p[2]; for(i=3;i<=n;i++) { while(Mul(stack[top-1],stack[top],p[i])<=0 && top>=2) top --; top ++; stack[top] = p[i]; } } double maxx(double a,double b){ if(a<b) return b; else return a; } double radius(P a, P b, P c){ int A=(b.x-c.x)*(b.x-c.x)+(b.y-c.y)*(b.y-c.y); int B=(a.x-c.x)*(a.x-c.x)+(a.y-c.y)*(a.y-c.y); int C=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); double tmp=(double)(A+B-C)/(2*sqrt((double)A)*sqrt((double)B)); tmp=sqrt(1.0-tmp*tmp); return sqrt((double)C)/(2*tmp); } double deal(P a, P b, P c) //求不公線三點子函式 { double ab, bc, ac, A, B, C; ab=dis(a, b); bc=dis(b, c); ac=dis(a, c); A=ab*ab; B=bc*bc; C=ac*ac; if(A>=B+C) return ab/2; else if(B>=A+C) return bc/2; else if(C>=A+B) return ac/2; else { return radius(a, b, c); } } int main() { int i,top,tar,n; double x,y; P temp; while(scanf("%d",&n),n) { tar = 0; x = y = 0x7FFFFFFF; for(i=0;i<n;i++) { scanf("%lf %lf",&p[i].x,&p[i].y); if(p[i].x<x || p[i].x==x && p[i].y<y) { x = p[i].x; y = p[i].y; tar = i; } } if(n==1) puts("0.50"); else if(n==2) printf("%.2lf\n",dis(p[0],p[1])/2+0.500); else { temp = p[tar]; p[tar] = p[0]; p[0] = temp; qsort(p+1,n-1,sizeof(p[0]),cmp); p[n] = p[0]; tubao(n,top); double l=0,ans=0; for(i=0;i<top-2;i++) for(int j=i+1;j<top-1;j++) for(int k=j+1;k<top;k++){ ans=maxx(deal(stack[i],stack[j],stack[k]),ans); } printf("%.2lf\n",ans+0.500); } } return 0; }
相關推薦
凸包模板 三點不共線點圓半徑
#include<stdio.h> #include<math.h> #include<stdlib.h> struct P{ double x,y; }p[101],stack[101]; /* double getradius
codevs1298, hdu1392 (凸包模板)
叉積 pan 向量 math != 不能 p s ace iostream 題意: 求凸包周長。 總結: 測試模板。 代碼: #include <iostream> #include <cstdio> #include <cstring>
POJ 3348 Cows | 凸包模板題
nor clas body 模板 block ron pac ring 進行 題目: 給幾個點,用繩子圈出最大的面積養牛,輸出最大面積/50 題解: Graham凸包算法的模板題 下面給出做法 1.選出x坐標最小(相同情況y最小)的點作為極點(顯然他一定在凸包上) 2.
凸包模板(安德魯)
重新 一個點 將不 構造 tor 方向 clas oid AC struct point { double x,y; }a[Max]; bool cmp(point a,point b) { if(a.x!=b.x) return
凸包模板(Graham)
//凸包,Graham演算法 //點編號0~n-1 //返回凸包結果Stack[0~Top-1] Point List[maxn],Stack[maxn]; int Top; bool cmp( Poi
【最大空凸包 模板 計算幾何 + DP】HDU
Given a set of distinct points S on a plane, we define a convex hole to be a convex polygon having any of thegiven points as vertices an
[LeetCode] Max Points on a Line 共線點個數
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 這道題給了我們一堆二維點,然後讓我們求最大的共線點的個數,根據初中數學我們知道,兩點確定一條直線,而
hdu3662 3D Convex Hull(三維凸包【三維計算幾何基本操作)
題目連線 分析: 三維凸包模板 瞧好了基本操作 三維和二維簡直不是一個級別的。。。orz #include<bits/stdc++.h> using namespace std; const double eps=1e-8; con
凸包模板(分治 or Graham掃描法)
問題概述:空間上有很多點,現在要用一個凸多邊形將所有點全部包住,求哪些點在這個凸多邊形上 輸入樣例: 對應輸出:
hdu 1348 Wall (凸包模板)
Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Description Once upon a time
LeetCode—max-points-on-a-line(共線點的最大數量)—Java
題目描述:Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.求二維平面上n個點中,最多共線的點數。思路解析:遍歷兩層迴圈:第一層
日常採集的疑問點/不會的點
1.KKT、SMO演算法 案例 https://blog.csdn.net/zhulf0804/article/details/53843323 https://wenku.baidu.com/view/edaefbc7a1c7aa00b52acbdf.html?from=search
js 判斷3D空間中 三點共線
需要一個有x y z的資料結構 class Point { constructor(a=0,b=0,c=0) { this.x=a; this.y=
xyz的判斷點在凸包內模板
int n,m,tot; struct point { double x,y; }p[100000],a[100000],ss; bool cmp(point A,point B) { if(A.x!=B.x) return A.x<B.x;
HDU 4449 Building Design(計算幾何 三維凸包 + 座標轉化 模板)
題目: You are a notable architect. Recently, a company invites you to design their new building for them. It is not an easy task, becaus
UVA 10256 The Great Divide(凸包應用 即凸包+線段相交判定+點是否在凸包內判斷 模板)
UVA 10256 The Great Divide(凸包應用) 題意: 有n個紅點和m個藍點,問你是否存在一條直線,使得任取任取一個紅點和一個藍點,都在直線的兩邊?這條直線不能穿過紅點或藍點. 分析: 先求出紅點的凸包和藍點的凸包,則
Friends and Berries URAL - 2067 (計算三點共線和計算的時候的注意點)
題目連結:https://cn.vjudge.net/problem/URAL-2067 具體思路:判斷三點共線就可以了,只有一對點能滿足,如果一對就沒有那就沒有滿足的. 在計算的時候,要注意,如果是按照斜率算的話,可以把除法轉換為乘法,防止精度的損失. 如果是按照距離算的話,一定要
P4724 【模板】三維凸包
\(\color{#0066ff}{題目描述}\) 給出空間中n個點,求凸包表面積。 \(\color{#0066ff}{輸入格式}\) 第一行一個整數n,表示點數。 接下來n行,每行三個實數x,y,z描述座標。 \(\color{#0066ff}{輸出格式}\) 輸出凸包表面積,保留3位小數。
hdu 5020(判斷三點共線)
Revenge of Collinearity Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description In geome
[二進位制分組維護凸包]BZOJ 4140—— 共點圓加強版
題目描述 在平面直角座標系中,Wayne需要你完成n次操作,操作只有兩種: 1.0 x y。表示在座標系中加入一個以(x, y)為圓心且過原點的圓。 2.1 x y。表示詢問點(x, y)是否在所有已加入的圓的內部(含圓周),且至少在一個圓內部(含圓周)。