题目:已知平面上的三点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<stdio.h>
#include<math.h>
// 定义坐标点
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是三角形的半周长。

判断时以面积等于0为临界值,即为三点共线的情况
借鉴原文:https://blog.csdn.net/weixin_43238423/article/details/97764142
这篇博客介绍了三种判断平面上三点P1(x1, y1), P2(x2, y2), P3(x3, y3)是否共线的方法。方法一是通过比较向量(p1->p2)和向量(p1->p3)的斜率;方法二是利用行列式计算三角形面积;方法三是应用海伦公式求三角形面积。当面积接近0时,可认为三点共线。"
47858891,462009,Dubbo注册中心详解:Multicast、Zookeeper与Redis,"['Dubbo框架', '服务治理', '注册中心', 'Zookeeper', 'Redis']

2416

被折叠的 条评论
为什么被折叠?



