1. 程式人生 > >POJ 2194 2850 計算幾何

POJ 2194 2850 計算幾何

pan tor def ase 三角形 clas sin 高度 per

題意:

給你了n個圓,讓你摞起來,問頂層圓心的坐標

(數據保證間隔兩層的圓不會挨著)

思路:

按照題意模擬。

假設我們已經知道了一層兩個相鄰圓的坐標a:(x1,y1)和b:(x2,y2)

很容易求出來邊長是2,2,dis(a,b)的三角形的面積

進而求出來底面所對應的高

找到底面中點

講a->b 向量旋轉90度 乘上高度

就搞出來了坐標

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
int
cases,n; typedef double db; struct P{db x,y;P(){}P(db X,db Y){x=X,y=Y;}}p[15][15]; bool operator<(P a,P b){return a.x<b.x;} P operator-(P a,P b){return P(a.x-b.x,a.y-b.y);} P operator+(P a,P b){return P(a.x+b.x,a.y+b.y);} db dis(P a){return sqrt(a.x*a.x+a.y*a.y);} P get(P a,P b){ P c
=b-a;db d=dis(c),p=d/2+2,S=sqrt(p*(p-2)*(p-2)*(p-d)),h=S/d*2; c.x/=d,c.y/=d;c=P(-c.y*h,c.x*h); return P((a.x+b.x)/2+c.x,(a.y+b.y)/2+c.y); } int main(){ while(scanf("%d",&n)&&n){ for(int i=1;i<=n;i++)scanf("%lf",&p[n][i].x),p[n][i].y=1; sort(p[n]+1,p[n]+1
+n); for(int i=n-1;i;i--) for(int j=1;j<=i;j++) p[i][j]=get(p[i+1][j],p[i+1][j+1]); printf("%.4lf %.4lf\n",p[1][1].x,p[1][1].y); } }

POJ 2194 2850 計算幾何