struct point{
double x , y;
point(double a = 0.0 ,double b = 0.0){
x = a , y = b;
}
};
struct segment{
point p1 , p2;
segment(point t1 , point t2){
p1 = t1 , p2 = t2;
}
};
1、已知3点,求面积:
double get_area(point p1 , point p2 , point p3){
return abs((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x))/2;
}
2、已知3点p1 , p , p2 ,求p对应角度:
double get_angle(point p1 , point p , point p2){
return acos(((p1.x-p.x)*(p2.x-p.x)+(p1.y-p.y)*(p2.y-p.y))/(get_len(p1 , p)*get_len(p2 , p)));
}
3、判断线段相交:
double v1_X_v2(point v1 , point v2){
return v1.x*v2.y-v1.y*v2.x;
}
bool paichi(segment s1 , segment s2){
if(s1.p1.x >= min(s2.p1.x , s2.p2.x) && s1.p1.x <= max(s2.p1.x , s2.p2.x) && s1.p1.y >= min(s2.p1.y , s2.p2.y) && s1.p1.y <= max(s2.p1.y , s2.p2.y)) return true;
if(s1.p2.x >= min(s2.p1.x , s2.p2.x) && s1.p2.x <= max(s2.p1.x , s2.p2.x) && s1.p2.y >= min(s2.p1.y , s2.p2.y) && s1.p2.y <= max(s2.p1.y , s2.p2.y)) return true;
return false;
}
bool kuali(segment s1 , segment s2){
point v = point(s1.p1.x-s1.p2.x , s1.p1.y-s1.p2.y);
point v1 = point(s1.p1.x-s2.p1.x , s1.p1.y-s2.p1.y);
point v2 = point(s1.p1.x-s2.p2.x , s1.p1.y-s2.p2.y);
if(v1_X_v2(v , v1)*v1_X_v2(v , v2) > 0) return false;
v = point(s2.p1.x-s2.p2.x , s2.p1.y-s2.p2.y);
v1 = point(s2.p1.x-s1.p1.x , s2.p1.y-s1.p1.y);
v2 = point(s2.p1.x-s1.p2.x , s2.p1.y-s1.p2.y);
if(v1_X_v2(v , v1)*v1_X_v2(v , v2) > 0) return false;
return true;
}
bool is_intersect(segment s1 , segment s2){
if(!paichi(s1 , s2)) return false;
if(kuali(s1 , s2)) return true;
return false;
}
计算几何模板
最新推荐文章于 2021-03-25 17:21:47 发布