三点共线判断

题目:已知平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3), 判断它们是否共线。

方法一:判断向量(p1–>p2)和向量(p1–>p3)的斜率是否相等。
即 (y2-y1)/(x2-x1) == (y3-y1)/(x3-x1).
这个除式判断可以改写成乘式判断:
(y3−y1)(x2−x1)−(y2−y1)(x3−x1)=0
(改写的原因是除法有分母为0或精度等问题,总之乘法更方便!)
注意,如果坐标本身是浮点型,尽量不要用“==”进行比较,因为在计算机中小数会有一定的误差,这时应该取一定的误差,例如

|(y3−y1)(x2−x1)−(y2−y1)(x3−x1)|<=1e−6
代码实现:

// 判断三点共线函数的实现
// 共线返回1
// 不共线返回0
int on_a_line(point a, point b, point c)
{
   float tempy1 = (a.y - b.y) ;
   float tempx1 = (a.x - b.x);
   float tempy2 = (c.y - a.y) ;
   float tempx2 = (c.x - a.x);
   float xp = tempy1 * tempx2;
   float yp = tempy2 * tempx1;
   if(fabs(xp - yp) <= 1e-6)
       return 1;
   else
       return 0;
}

题目代码:

#include
#include
// 定义坐标点
typedef struct point
{
    float x;
    float y;
}point;
// 三点共线判断函数
// 共线返回1
// 不共线返回0
int on_a_line(point a, point b, point c);
int main()
{
    // 定义测试次数
    int case_num = 0;
    // 定义点数
    int point_num = 0;
    // 共线标志,1共线,0不共线
    int flag = 0;
    int i,j,k,l;
    // 输入测试次数
    scanf("%d",&case_num);
    for(i = 0; i < case_num; i++)
    {
        // 输入坐标数
        scanf("%d",&point_num);
        // 声明坐标数组
        point points[point_num];
        // 输入坐标
        for(j = 0; j < point_num; j++)
        {
            // 输入横坐标x
            scanf("%f",&points[j].x);
            // 输入纵坐标y
            scanf("%f",&points[j].y);
        }
        // 判断是否存在三点共线 
        if(point_num >= 3)
        {
            for(j = 0 ;j < point_num && flag == 0; j++)
            {
                for(k = j + 1; k < point_num && flag == 0; k++)
                {
                    for(l = k + 1; l < point_num && flag == 0; l++)
                    {
                        if(on_a_line(points[j],points[k],  points[l]))
                            flag = 1;
                    }
                }
            }
            // 打印信息
            if(flag == 1)
            {
                printf("Yes\n");
                flag = 0;
            }
            else
                printf("No\n");
        }
    }
}
// 判断三点共线函数的实现
int on_a_line(point a, point b, point c)
{
    float tempy1 = (a.y - b.y) ;
    float tempx1 = (a.x - b.x);
    float tempy2 = (c.y - a.y) ;
    float tempx2 = (c.x - a.x);
    float xp = tempy1 * tempx2;
    float yp = tempy2 * tempx1;
    if(fabs(xp - yp) <= 1e-6)
        return 1;
    else
        return 0;
}

方法二:用行列式求三角形面积,再判断是否为0.

在这里插入图片描述

S=(1 / 2)*(x1 *y2 + x2 *y3 + x3 *y1 - x1 *y3 - x2 *y1 - x3 *y2)

方法三:同样是面积法,用海伦公式求三角形面积.
海伦公式:S=sqrt(p *(p-a) *(p-b) *(p-c)).
其中a,b,c为三角形边长,p=C/2是三角形的半周长。

三点共线判断_第1张图片
判断时以面积等于0为临界值,即为三点共线的情况


借鉴原文:https://blog.csdn.net/weixin_43238423/article/details/97764142

你可能感兴趣的:(c,+,+)