JAVA求两直线交点和三角形内外心的方法
一.求两直线交点
class point {
double x;
double y;
public point() {
this.x = 0;
this.y = 0;
}
}
class line {
point a;
point b;
public line() {
this.a = new point();
this.b = new point();
}
//求两直线的交点,斜率相同的话res=u.a
point intersection(line u,line v){
point res = u.a;
double t = ((u.a.x-v.a.x)*(v.b.y-v.a.y)-(u.a.y-v.a.y)*(v.b.x-v.a.x))
/((u.a.x-u.b.x)*(v.b.y-v.a.y)-(u.a.y-u.b.y)*(v.b.x-v.a.x));
res.x += (u.b.x-u.a.x)*t;
res.y += (u.b.y-u.a.y)*t;
return res;
}
二.求三角形外心
1. 垂心: 三角形三条边上的高相交于一点.这一点叫做三角形的垂心.
2. 重心: 三角形三条边上的中线交于一点.这一点叫做三角形的重心.
3. 外心: 三角形三边的中垂线交于一点.这一点为三角形外接圆的圆心.
4. 内心三角形三内角平分线交于一点.这一点为三角形内切圆的圆心.
已知圆的3点,先求出3边长,由海伦公式得出面积s=sqrt(p*(p-a)*(p-b)*(p-c)) p=(a+b+c)/2;由三角形面积公式s=1/2*a*b*sin(c)和正弦定理a/sin(a)=b/sin(b)=c/sin(c)=直径(根据相同弦长对应的圆周角相同可证正弦定理)可得直径=a*b*c/2/s。
求圆心坐标。利用:g是⊿abc外心的充要条件是(向量ga+向量gb)·向量ab= (向量gb+向量gc)·向量bc=(向量gc+向量ga)·向量ca=向量0.
这个性质的证明很容易的,只需要想到外心是中垂线交点即可,就可以证明这个性质了,利用向量可以避免求斜率,以及考虑斜率不存在等很多情况。
//三角形外接圆圆心(外心)
point center(point a,point b,point c) {
//加上这个才没有编译器提示未初始化,因为new所以也写了构造方法
line u = new line(),v = new line();
u.a.x=(a.x+b.x)/2;
u.a.y=(a.y+b.y)/2;
u.b.x=u.a.x+(u.a.y-a.y);
u.b.y=u.a.y-(u.a.x-a.x);
v.a.x=(a.x+c.x)/2;
v.a.y=(a.y+c.y)/2;
v.b.x=v.a.x+(v.a.y-a.y);
v.b.y=v.a.y-(v.a.x-a.x);
return intersection(u,v);
}
三.求三角形内心
由于内心到各边距离就是半径r,可以把三角形分成三部分,再根据海伦公式得到半径r=2*s/(a+b+c)。
内切圆心坐标(x,y): 三角形三个顶点的坐标:a(x1,y1),b(x2,y2),c(x3,y3)则圆心为x=(x1*bc+x2*ca+x3*ab)/(ab+bc+ca)、y=(y1*bc+y2*ca+y3*ab)/(ab+bc+ca)。
证明:内心是角平分线的交点,到三边距离相等.
设:在三角形abc中,三顶点的坐标为:a(x1,y1),b(x2,y2),c(x3,y3) bc=a,ca=b,ab=c,内心为m (x,y)则有ama+bmb+cmc=0(三个向量) ,ma=(x1-x,y1-y) ,mb=(x2-x,y2-y) ,mc=(x3-x,y3-y)
则:a(x1-x)+b(x2-x)+c(x3-x)=0,a(y1-y)+b(y2-y)+c(y3-y)=0
∴x=(ax1+bx2+cx3)/(a+b+c),y=(ay1+by2+cy3)/(a+b+c)
∴m((ax1+bx2+cx3)/(a+b+c),(ay1+by2+cy3)/(a+b+c))。
已知o为三角形abc的内心,a,b,c分别是a.b.c边所对边长. 则aoa+bob+coc=0(oa,ob,oc均指向量)
证明:设三角形abc,ad为bc边上的角平分线,内心为o。
|bc|=a,|ac|=b,|ab|=c
aoa+bob+coc
=aoa+b(ab+oa)+c(ac+oa)
=(a+b+c)oa+b(db-da)+c(dc-da)
设bc的方向向量e,则db=e|db|,dc=-e|dc|
又由角平分线定理,|db|/|dc|=c/b,所以bdb+cdc=0
(a+b+c)oa+b(db-da)+c(dc-da)= (a+b+c)oa- b da- c da =aoa+(b+c)od
又因为oa、od反向,用角平分线定理和合比定理:
b/cd=c/bd=(b+c)/(cd+bd)=(b+c)/a, b/cd=oa/od,
所以oa/od=(b+c)/a , 又因为oa、od反向,
故aoa+bob+coc=aoa+(b+c)od =0.
上一篇: 简单谈谈python中的多进程
下一篇: C#实现自定义定时组件的方法