您的位置:首页 > 其它

POJ 1269(计算几何初步——简单处理解析几何,求直线交点)

2012-01-11 17:44 531 查看
此题给出N组直线,每组2条直线,求出直线是否相交。

如果共线则输出LINE,相交则输入点坐标,否则输出NONE.

解析几何初中都学过一些,不过写成程序还真是麻烦。

情况分成3种:

1.看直线的横坐标是否相等。

2.看直线的纵坐标是否相等。

3.直接用直线公式求解。

View Code

#include<iostream>
#define EPS 1e-8
using namespace std;

bool equal(double x, double y)
{
return x - y <= EPS && -EPS <= x - y;
}

void X_Get_point(double x1, double x2, double y1, double y2, double x0)
{
double k = (y2 - y1)/(x2 - x1);
double b = y2 - k*x2;
double y0 = k*x0 + b;
printf("POINT %.2lf %.2lf\n",x0,y0);
}//已知X,求Y

void Y_Get_point(double x1, double x2, double y1, double y2, double y0)
{
double k = (y2 - y1)/(x2 - x1);
double b = y2 - k*x2;
double x0 = (y0 - b)/k;
printf("POINT %.2lf %.2lf\n",x0,y0);
}//已知y,求X

double cross(double x0, double y0, double x1, double y1)
{
return y1*x0 - x1*y0;
}

bool on_line(double x1, double x2, double y1, double y2, double x0, double y0)
{
if (equal(cross(x2-x1,y2-y1,x0-x1,y0-y1),0))return true;
return false;
}//判断点是否在直线上

int main()
{
int T;
while (scanf("%d",&T) != EOF) {
for (int i(0); i<T; ++i) {
if (i == 0)cout<<"INTERSECTING LINES OUTPUT\n";
double x[4];
double y[4];
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2],&x[3],&y[3]);
if (equal(x[0],x[1])) {
if (equal(x[2],x[3])) {
if (equal(x[2],x[0])) {
cout<<"LINE\n";
continue;
}    else {
cout<<"NONE\n";
continue;
}
}    else {
X_Get_point(x[2],x[3],y[2],y[3],x[0]);
continue;
}
}    else {
if (equal(x[3],x[2])) {
X_Get_point(x[0],x[1],y[0],y[1],x[2]);
continue;
}
}

if (equal(y[0],y[1])) {
if (equal(y[2],y[3])) {
if (equal(y[2],y[0])) {
cout<<"LINE\n";
continue;
}    else {
cout<<"NONE\n";
continue;
}
}    else {
Y_Get_point(x[2],x[3],y[2],y[3],y[0]);
continue;
}
} else {
if (equal(y[2],y[3])) {
Y_Get_point(x[0],x[1],y[0],y[1],y[2]);
continue;
}
}

double k1 = (y[1] - y[0])/(x[1] - x[0]);
double k2 = (y[3] - y[2])/(x[3] - x[2]);
if (equal(k1,k2)) {
if (on_line(x[0],x[1],y[0],y[1],x[2],y[2])) {
cout<<"LINE\n";
continue;
} else {
cout<<"NONE\n";
}
}    else {
double b1 = y[1] - k1*x[1];
double b2 = y[2] - k2*x[2];
double y0 = (b2*k1 - b1*k2)/(k1 - k2);
double x0 = (y0 - b2)/k2;
printf("POINT %.2lf %.2lf\n",x0,y0);
continue;
}
}
cout<<"END OF OUTPUT\n";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: