2023-07-19 平面坐标下判断三角形以及输出周长和面积

平面坐标下判断三角形以及输出周长和面积

  • 前言
  • 一. 基本知识
  • 总结


前言

平面坐标下判断三角形以及输出周长和面积, 用线性代数的简单知识.


一. 基本知识

在平面坐标, 三个点就是三个向量, 可以通过两个向量同时减去第三个向量, 形成一个顶点在原点的三角形.

2023-07-19 平面坐标下判断三角形以及输出周长和面积_第1张图片
我们发现, 只有一种情况三角形不能成立, 就是从原点出发的两个向量在一条直线上
2023-07-19 平面坐标下判断三角形以及输出周长和面积_第2张图片
我们可以简单的用向量叉乘判断三角型是否成立, 同时, 向量叉乘的结果是向量形成的平行四边形面积
2023-07-19 平面坐标下判断三角形以及输出周长和面积_第3张图片
平行四边形面积的一半就是三角形面积

而三角型的周长, 可以根据勾股定理得出三条边的长度, 相加得出.

以下是代码:

#include 
#include 
 
// 定义向量结构体
typedef struct
{
    double x;
    double y;
} Vector;
 
// 计算向量的差
Vector sub(Vector vecA, Vector vecB)
{
    return (Vector){vecA.x - vecB.x, vecA.y - vecB.y};
}
 
// 计算向量的叉积
double cross(Vector vecA, Vector vecB)
{
    return vecA.x * vecB.y - vecA.y * vecB.x;
}
 
// 计算两点之间的距离
double distance(Vector pointA, Vector pointB)
{
    Vector subAB = sub(pointA, pointB);
    return sqrt(subAB.x * subAB.x + subAB.y * subAB.y);
}
 
// 计算三角形的周长
double triPer(Vector pointA, Vector pointB, Vector pointC)
{
    return distance(pointB, pointC) + distance(pointA, pointC) +
           distance(pointA, pointB);
}
 
// 返回三角形面积, 向量叉积的二分之一的绝对值
double triArea(Vector vecA, Vector vecB, Vector vecC)
{
    return fabs(cross(sub(vecB, vecA), sub(vecC, vecA))) / 2.0;
}
 
int main()
{
    Vector pointA;
    Vector pointB;
    Vector pointC;
 
    scanf("%lf %lf %lf %lf %lf %lf", &pointA.x, &pointA.y, &pointB.x, &pointB.y,
          &pointC.x, &pointC.y);
 
    double rest = triArea(pointA, pointB, pointC);
 
    // 判断平面三点是否可构成三角形, 即叉积不为零
    if (rest)
    {
        printf("L = %.2lf, A = %.2lf", triPer(pointA, pointB, pointC), rest);
    }
    else
    {
        printf("Impossible");
    }
 
    return 0;
}

总结

近期在学OpenGL, 顺便学点图形学, 顺便也就学点线性代数, 这就是另外一个世界了.

你可能感兴趣的:(c语言,线性代数,三角形面积)