3本の直線で囲まれた三角形の面積で決まります

背景

我々はすべて知っているように、三角形は、このような3つの直線パターンの交差点、次のとおりです。

 

この吸気とブログに、線形関数の最初の二日間から通常検査の種類と同じ:直線、三角形のx軸及びy軸面積が封入ことが得られています。

この問題は解決され、そしてのみX = 0に必要かつy = 0は、線形解析式、軸AおよびBを用いて計算交点座標に代入します 二つの軸が互いに直交するので、原点から直角に交差する二つの点から2つの長辺であり、その後、三角形の面積の公式によれば、三角形の面積を求めることができます。 

 

まで、私は、軸2本の直線で囲まれた三角形の面積を必要とする、さらに質問を見ました。

この問題を解決するには、2本の線の交点が必要です。これは、式によって得られ、その後、我々は成功とハイエンドを得るように、軸との交点を見つけることができます。

だから、私は単純に3本の直線で囲まれた三角形の面積を決定するために、拡大し続ける、私は大きなプロジェクトを行なったし、ブログをクークーされている。この2週間あります。

概念

  • 精度を確保するために、すべてのユースポイントの動作のポイント、ライン、エリアに関するすべての手順。私は(おいしい〜オペレータのオーバーロードのCに相当マジックPythonのメソッド()の突然の感覚を)渡しので、しかし、Cは、左心室のスコアをサポートしていません。
  • 3の交差によって形成される3本の直線を得るために
  • 軸平行と矩形の最小面積を調整し、次に三角形の面積の比率を減算する小さな三角形の複数の三個のアウトを必要とする4つの辺は、三角形を得る工程。実際には、中学生がカットやfillメソッドを学んできた、非常に複雑と言います。
  • 四つの矩形の辺は、直線、及び右にy軸に平行な直線の左端点と平行である上下点がx軸上に位置しているに最も近いです。

2つのより直感的なポイントの後、それがこれです:

 

 

 

 

 

導出

最初の交差点を求めます

配置された2つの直線の傾きと切片は、次のとおりです。K1、B1、K2、B2

式を得ることができます:K1 * X + B1 = K2 * X + B2

することにより、簡単な利用可能転置:

機能の一つは、X、Yによって決定し、次いでせる

 

 ように、3の交点の座標を取得します。

矩形領域を求めます

(横座標値の最大横座標値のポイント - 横座標値の点の横座標の最小値)*(点の座標垂直最大値の座標値 - 点の座標の縦軸の最小値)

端的に言えするには最も近い点と最下点、左端と右端のポイント・ポイントを見つけ、その後、長方形の長さと幅を計算することです。

三角形の小さな領域を探しています

对于每两个交点,都可一确定一个以这条边为斜边的直角三角形的面积。

两个点的横坐标的差的绝对值和纵坐标的差的绝对值,就是这个三角形的两条直角边的长度,再根据公式求出面积。

求大三角形的面积

长方形面积 - 三个小三角形面积之和

局限性&解决办法

这种方法非常的简单易懂,但是对于钝角三角形并不适用,就比如这个:

 

解决这个问题也比较简单:当你知道两个点的坐标时,就可以利用勾股定理算出它们的距离,也就是三角形的边长,再套用海伦公式,就可以算出来面积

但是我还没有搞懂海伦公式,再说哪个出题的会出这么难且geliao的题啊。。

 

 等我证出来了海伦公式在搞这个吧。。

 

代码

 

#include <iostream>
#include <cstdio>
using namespace std;

struct fenshu{
    int fz, fm;
};
struct fenshu k[4], b[4], x12, y12, x23, y23, x13, y13, xmax, ymax, xmin, ymin;
int tp;

int gcd(int a, int b){
    if(b==0) return a;
    return gcd(b, a%b);
}
fenshu build(int a, int b){
    fenshu fs;
    int gc=gcd(a, b);
    fs.fz=a/gc; fs.fm=b/gc;
    if(fs.fm<0){
        fs.fz=-fs.fz;
        fs.fm=-fs.fm;
    }
    return fs;
}
fenshu add(fenshu a, fenshu b){
    return build(a.fz*b.fm+b.fz*a.fm, a.fm*b.fm);
}
fenshu sub(fenshu a, fenshu b){
    return build(a.fz*b.fm-b.fz*a.fm, a.fm*b.fm);
}
fenshu multi(fenshu a, fenshu b){
    return build(a.fz*b.fz, a.fm*b.fm);
}
fenshu divi(fenshu a, fenshu b){
    return build(a.fz*b.fm, a.fm*b.fz);
}
int cmp(fenshu a, fenshu b){
    if(a.fz*b.fm>b.fz*a.fm){
        return 1;
    }
    else if(a.fz*b.fm==b.fz*a.fm){
        return 0;
    }
    else{
        return -1;
    }
}
fenshu abs(fenshu a){
    if(a.fz<0) a.fz=-a.fz;
    return a;
}

int main(){
    
    freopen("data.in", "r", stdin);

    for(int i=1; i<=3; i++){
//        printf("输入函数%d的斜率和截距:", i);
        scanf("%d", &tp);
        if(tp==0){
            scanf("%d", &k[i].fz);
            k[i].fm=1;
        }
        else{
            scanf("%d/%d", &k[i].fz, &k[i].fm);
        }
        scanf("%d", &tp);
        if(tp==0){
            scanf("%d", &b[i].fz);
            b[i].fm=1;
        }
        else{
            scanf("%d/%d", &b[i].fz, &b[i].fm);
        }
    }
/*    for(int i=0; i<3; i++){
        printf("%d/%d %d/%d\n", k[i].fz, k[i].fm, b[i].fz, b[i].fm);
    }*/

    x12=divi(sub(b[2], b[1]), sub(k[1], k[2]));
    xmax=x12; xmin=x12;
    x23=divi(sub(b[3], b[2]), sub(k[2], k[3]));
    xmax=(cmp(xmax, x23)<0?x23:xmax);
    xmin=(cmp(xmin, x23)>0?x23:xmin);
    x13=divi(sub(b[3], b[1]), sub(k[1], k[3]));
    xmax=(cmp(xmax, x13)<0?x13:xmax);
    xmin=(cmp(xmin, x13)>0?x13:xmin);

    y12=add(multi(k[1], x12), b[1]);
    ymax=y12; ymin=y12;
    y23=add(multi(k[2], x23), b[2]);
    ymax=(cmp(ymax, y23)<0?y23:ymax);
    ymin=(cmp(ymin, y23)>0?y23:ymin);
    y13=add(multi(k[3], x13), b[3]);
    ymax=(cmp(ymax, y13)<0?y13:ymax);
    ymin=(cmp(ymin, y13)>0?y13:ymin);

/*    printf("xmax:%d/%d\n", xmax.fz, xmax.fm);
    printf("xmin:%d/%d\n", xmin.fz, xmin.fm);
    printf("ymax:%d/%d\n", ymax.fz, ymax.fm);
    printf("ymin:%d/%d\n", ymin.fz, ymin.fm); */

    fenshu TwoFirst, Srect, S1213, S1323, S1223, Stri;
    TwoFirst.fz=2; TwoFirst.fm=1;
    Srect=multi(sub(xmax, xmin), sub(ymax, ymin));
    S1213=divi(multi(abs(sub(x12, x13)), abs(sub(y12, y13))), TwoFirst);
    S1323=divi(multi(abs(sub(x13, x23)), abs(sub(y13, y23))), TwoFirst);
    S1223=divi(multi(abs(sub(x12, x23)), abs(sub(y12, y23))), TwoFirst);
    Stri=sub(Srect, add(S1213, add(S1323, S1223)));

    if(Stri.fm==1){
        printf("%d\n", Stri.fz);
    }
    else{
        printf("%d/%d\n", Stri.fz, Stri.fm);
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/dong628/p/12077702.html