计算几何模板

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值