#include
#include
#include
#include
#include
const
long
double eps=1e-10;
const
long
double pi=acos(-1.0);
using
namespace
std;
struct point
void
operator
<<(point &a)
int sgn(long
double x)
typedef point vector;
vector operator +(vector a,vector b)
vector operator -(vector a,vector b)
vector operator *(vector a,long
double p)
vector operator /(vector a,long
double p)
ostream &operator
<<(ostream & out,point & p)
//bool
operator
< (const point &a,const point &b)
bool
operator== ( const point &a,const point &b)
long
double dot(vector a,vector b)
long
double cross(vector a,vector b)
long
double length(vector a)
long
double angle(vector a,vector b)
long
double area2(point a,point b,point c )
vector rotate(vector a,long
double rad)
vector normal(vector a)
point getlineintersection(point p,vector v,point q,vector w)
long
double distancetoline(point p,point a,point b)
long
double distancetosegment(point p,point a,point b)
point getlineprojection(point p,point a,point b)
bool segmentproperintersection(point a1,point a2,point b1,point b2)
bool onsegment(point p,point a,point b)
long
double polygonarea(point *p,int n)
return area/2;
}point read_point()
// ---------------與圓有關的--------
struct circle
point point(long
double a)
};struct line
point point(long
double t)
};int getlinecircleintersection(line l,circle c,long
double &t1,long
double &t2,vector
&sol)
else
}// 向量極角公式
long
double angle(vector v)
int getcirclecircleintersection(circle c1,circle c2,vector
&sol)
if(dcmp(c1.r+c2.r-d)<0) return
0; // 外離
if(dcmp(fabs(c1.r-c2.r)-d)>0) return
0; // 內含
long
double a=angle(c2.c-c1.c);
long
double da=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));
point p1=c1.point(a-da);
point p2=c1.point(a+da);
sol.push_back(p1);
if(p1==p2) return
1; // 相切
else
}// 求點到圓的切線
int gettangents(point p,circle c,vector *v)
else
}// 求兩圓公切線
int gettangents(circle a,circle b,point *a,point *b)
long
double d=length(a.c-b.c);
long
double rdiff=a.r-b.r;
long
double rsum=a.r+b.r;
if(dcmp(d-rdiff)<0) return
0; // 內含
long
double base=angle(b.c-a.c);
if(dcmp(d)==0&&dcmp(rdiff)==0) return -1 ; // 重合 無窮多條切線
if(dcmp(d-rdiff)==0) // 內切 外公切線
// 有外公切線的情形
long
double ang=acos(rdiff/d);
a[cnt]=a.point(base+ang);
b[cnt]=b.point(base+ang);
cnt++;
a[cnt]=a.point(base-ang);
b[cnt]=b.point(base-ang);
cnt++;
if(dcmp(d-rsum)==0) // 外切 有內公切線
else
if(dcmp(d-rsum)>0) // 外離 又有兩條外公切線
return cnt;
}point zero=point(0,0);
long
double common_area(circle c,point a,point b)
else
if(dcmp(oa-c.r)>=0&&dcmp(ob-c.r)>=0&&dcmp(d-c.r)>=0)
else
if (dcmp(oa-c.r)>=0&&dcmp(ob-c.r)>=0&&dcmp(d-c.r)<0)
else
}else
point inter_point;
long
double t1,t2;
line l=line(a,b-a);
vector
inter;
getlinecircleintersection(l, c, t1, t2,inter);
if(onsegment(inter[0], a, b))
inter_point=inter[0];
else
// 兩種方法求交點都可以
// point prj=getlineprojection(zero, a, b);
//
// vector v=b-a;
// v=v/length(v);
// long long double mov=sqrt(c.r*c.r-d*d);
//
// if(onsegment(prj+v*mov, a, b))
//
// else
//
long
double s=fabs(cross(inter_point, a)/2);
s+=c.r*c.r*angle(inter_point,b)/2;
return s*sg;
}}int main()
return
0;}
多邊形面積
點積 a b x1 x2 y1 y2 a b cos 點積的結果是乙個數值 叉積 a b x1 y2 x2 y1 a b sin 叉積的結果也是乙個向量,是垂直於向量a,b所形成的平面,如果看成三維座標的話是在 z 軸上,上面結果是它的模。三角形的面積 向量a和 向量b的叉積的絕對值表示 以 向量a...
多邊形的面積
1 三角形面積 xy平面內,有三角形 123,如下圖所示 1 借助向量叉積和點積,這個三角形的面積公式非常簡單 這個面積是有符號的 1 2 3逆時針排列,則面積為正 1 2 3順時針排列,則面積為負。這是對右手系的總結,如果從背面看這個座標系就成了左手系。在左手系下,面積的正負情況正好相反。所以,關...
求任意多邊形面積(凹多邊形和凸多邊形)
遇到問題 已知多邊形的各個左邊點,要求多邊形的面積 然後我搜尋了下看到這篇文章 這個人說的不多,但是簡單明瞭 首先已知各定點的座標分別為 x1,y1 x2,y2 x3,y3 xn,yn 則該多邊形的面積公式為 s 1 2 x1 y2 x2 y1 x2 y3 x3 y2 xk yk 1 xk 1 yk...