欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA求两直线交点和三角形内外心的方法

程序员文章站 2024-02-14 10:27:10
一.求两直线交点复制代码 代码如下:class point {    double x;    double y...

一.求两直线交点

复制代码 代码如下:

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.