多邊形和圓的面積並

2021-07-10 20:39:22 字數 4326 閱讀 8612

#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...