C语言 直线问题
小明上来中学,开始学习直线方程,老师有一天要看看小明学的如何,于是问了他一个问题。给出两个坐标(x1, y1)和(x2, y2)可以唯一确定一条直线,那么,任意给你一个点,你是否可以判断这个点在该直线上吗?
输入:
x1, y1
x2, y2
n
n个坐标x1,y1 x2,y2 .....xn,yn
输出:在直线上的点坐标
包括延长线哦(按照原来的输入顺序),如果没有属于直线上的点,则输出"NoOut.”
C语言 直线问题
小明上来中学,开始学习直线方程,老师有一天要看看小明学的如何,于是问了他一个问题。给出两个坐标(x1, y1)和(x2, y2)可以唯一确定一条直线,那么,任意给你一个点,你是否可以判断这个点在该直线上吗?
输入:
x1, y1
x2, y2
n
n个坐标x1,y1 x2,y2 .....xn,yn
输出:在直线上的点坐标
包括延长线哦(按照原来的输入顺序),如果没有属于直线上的点,则输出"NoOut.”
#include <stdio.h>
#include <stdlib.h>
#define epsilon 0.00001
#define equ(a,b) ((a)-(b)<epsilon&&(b)-(a)<epsilon)
int foo(float x1, float x2, float y1, float y2, float x, float y)
{
if (equ(y1, y2)) return equ(y1, y);
float a = (y1 - y2) / (x1 - x2);
float b = y1 - x1 * a;
return equ(x * a + b, y);
}
int main()
{
float x1, x2, y1, y2;
scanf("%f,%f", &x1, &y1);
scanf("%f,%f", &x2, &y2);
int n;
scanf("%d", &n);
float * x = (float *)malloc(sizeof(float) * n);
float * y = (float *)malloc(sizeof(float) * n);
int * r = (int *)malloc(sizeof(int) * n);
int exist = 0;
for (int i = 0; i < n; i++)
{
scanf("%f,%f", &x[i], &y[i]);
r[i] = foo(x1, x2, y1, y2, x[i], y[i]);
if (r[i]) exist = 1;
}
for (int i = 0; i < n; i++)
{
if (r[i]) printf("%f,%f\n", x[i], y[i]);
}
if (!exist)
printf("NoOut.\n");
return 0;
}
有1个结果:
有多个结果:
直线垂直(无法求斜率)
无结果