HDOJ 5733 tetrahedron

题目链接:HDOJ5733

2016第一场多校的一个计算几何模板题


题意:给定四个点的坐标,如果是四面体的话,求出内切球的球心坐标和球径

kuangbin模板+百度公式


先说说如何判断是不是四面体

四点不共面+任意三点不共线:四个点构成四面体


公式:在代码里有

计算几何不需要解释太多,无非就是模板中的点乘叉乘搞几下,画个图就能够出来


#include<bits/stdc++.h>
using namespace std;

const double eps=1e-8;
const int MAXN=550;
int sgn(double x){
	if (fabs(x)<eps) return 0;
	if (x<0) return -1;
	return 1;
}

struct Point3{
	double x,y,z;
	Point3(double _x=0,double _y=0,double _z=0){
		x=_x,y=_y,z=_z;
	}
	void input(){
		scanf("%lf%lf%lf",&x,&y,&z);
	}
	bool operator == (const Point3 &b) const{
		return sgn(x-b.x)==0 && sgn(y-b.y)==0 &&sgn(z-b.z)==0;
	}
	double len(){
		return sqrt(x*x+y*y+z*z);
	}
	double len2(){
		return x*x+y*y+z*z;
	}
	double distance(const Point3 &b) const{
		return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z));
	}
	Point3 operator - (const Point3 &b) const{
		return Point3(x-b.x,y-b.y,z-b.z);
	}
	Point3 operator + (const Point3 &b) const{
		return Point3(x+b.x,y+b.y,z+b.z);
	}
	Point3 operator * (const double &k) const{
		return Point3(x*k,y*k,z*k);
	}
	Point3 operator / (const double &k) const{
		return Point3(x/k,y/k,z/k);
	}
	double operator * (const Point3 &b) const{
		return x*b.x+y*b.y+z*b.z;
	}
	Point3 operator ^ (const Point3 &b) const{
		return Point3(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);
	}
};

//叉乘就是求出了法向量 
Point3 cross(const Point3 &a,const Point3 &b,const Point3 &c){
	return (b-a)^(c-a);
}

//求三角形的面积公式(空间内三点)
double area(Point3 a,Point3 b,Point3 c){
	return ((b-a)^(c-a)).len()/2.0;
}

//求四面体的面积公式(空间内不共面,且任意三点不共闲的四点)
double volume(Point3 a,Point3 b,Point3 c,Point3 d){
	return ((b-a)^(c-a))*(d-a)/6.0;
}

//判断四点是否共面
int dots_onplane(Point3 a,Point3 b,Point3 c,Point3 d){
	return sgn(cross(a,b,c)*(d-a))==0;
}

//判断三点是否共线
int dots_inline(Point3 a,Point3 b,Point3 c){
	return ((a-b)^(b-c)).len()<eps;
}

Point3 A,B,C,D;

int main(){
	//freopen("input.txt","r",stdin);
	while(scanf("%lf%lf%lf",&A.x,&A.y,&A.z)!=EOF){
		B.input();C.input();D.input();
		if (dots_onplane(A,B,C,D)||dots_inline(A,B,C)||
			dots_inline(A,B,D)||dots_inline(A,C,D)||dots_inline(B,C,D)){
				puts("O O O O");
				continue;
			}
		double s1=area(B,C,D);
		double s2=area(A,C,D);
		double s3=area(A,B,D);
		double s4=area(A,B,C);
		double R=3.0*volume(A,B,C,D)/(s1+s2+s3+s4);
		double x1=(s1*A.x+s2*B.x+s3*C.x+s4*D.x)/(s1+s2+s3+s4);
		double y1=(s1*A.y+s2*B.y+s3*C.y+s4*D.y)/(s1+s2+s3+s4);
		double z1=(s1*A.z+s2*B.z+s3*C.z+s4*D.z)/(s1+s2+s3+s4);
		printf("%.4lf %.4lf %.4lf %.4lf\n",x1,y1,z1,fabs(R));
	}
	return 0;
}


全部评论

相关推荐

机械打工仔:第一位颇有孟德之志
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-27 15:19
简历上能写3个月吗?
码农索隆:大胆写,主要你能把实习经历包装好,可以看一下我这篇帖子https://www.nowcoder.com/share/jump/4888395581180798063
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务