POJ 1269(计算几何初步——简单处理解析几何,求直线交点)
2012-01-11 17:44
531 查看
此题给出N组直线,每组2条直线,求出直线是否相交。
如果共线则输出LINE,相交则输入点坐标,否则输出NONE.
解析几何初中都学过一些,不过写成程序还真是麻烦。
情况分成3种:
1.看直线的横坐标是否相等。
2.看直线的纵坐标是否相等。
3.直接用直线公式求解。
View Code
如果共线则输出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; }
相关文章推荐
- POJ1269(计算几何基础-直线与直线之间的关系与它们的交点)
- 计算两直线的交点 poj 1269 我的第一道几何题
- POJ 1269 计算几何 求直线交点
- POJ1269---Intersecting Lines (计算几何基础:直线相交求交点)
- POJ 1269 Intersecting Lines(简单计算几何,判断直线的关系)
- (计算几何step8.1.2.2)POJ 1269 Intersecting Lines(使用叉积来计算两条直线的交点)
- POJ 1269 Intersecting Lines(计算几何 直线交点 点在直线上 直线平行)
- POJ 1269(计算几何+直线相交)
- 简单几何(直线求交点) POJ 2074 Line of Sight
- 简单几何(直线位置) POJ 1269 Intersecting Lines
- POJ1269 计算几何直线与直线的关系
- POJ3304 Segments(计算几何,线段和直线的交点)
- POJ 1039——计算几何初步(判断线段与直线相交)
- POJ1269——Intersecting Lines(计算几何,直线关系判断)
- POJ 1269 Intersecting Lines(计算几何 求交点)
- poj 3340 Segments(计算几何,直线跟线段的交点)
- POJ 3304(计算几何初步——判断线段和直线相交,加上枚举)
- POJ 1269 Intersecting Lines 简单计算几何
- poj 1408 Fishnet(计算几何 叉积求面积 求两直线交点 暴力)
- 计算几何初步之凸包(POJ 1113、2007、1873、1228、3348)