博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1269 Intersecting Lines 计算几何 C语言
阅读量:5318 次
发布时间:2019-06-14

本文共 2298 字,大约阅读时间需要 7 分钟。

题目:

题目大意:给出四个点确定两条直线。如果是一条线输出“LINE”,如果平行输出“NONE”, 如果有交点输出交点坐标。

思路:注意是直线,不是线段啊。

用两点式推出两条直线方程 :

(y1 - y2)x + (x2 - x1)y = x2y1 - x1y2;
(y3 - y4)x + (x4 - x3)y = x4y3 - x3y4;
又由Cramer法则:
a1x + b1y = c1;
a2x + b2y = c2;
D = a1b2 - a2b1; D1 = c1b2 - c2b1; D2 = a1c2 - a2c1;
D != 0时, x = D1 / D, y = D2 / D; 得到交点坐标。
D = 0时;如果a1 / a2 = b1 / b2 = c1 / c2 , 则四个点在一条直线上;否则两直线平行,无交点。
 
AC code:
#include 
#include
int main () {
 int n;  int x1, y1, x2, y2, x3, y3, x4, y4;  int a1, b1, c1, a2, b2, c2;  int D, D1, D2;  double x, y;  scanf ("%d", &n);  printf ("INTERSECTING LINES OUTPUT\n");  while (n--) {
  scanf ("%d%d%d%d%d%d%d%d",&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);   a1 = y1 - y2;                     // 由公式推出的关系   a2 = y3 - y4;   b1 = x2 - x1;   b2 = x4 - x3;   c1 = x2 * y1 - x1 * y2;   c2 = x4 * y3 - x3 * y4;   D = a1 * b2 - a2 * b1;   if (D) {                          // D != 0 运用Cramer法则求交点    D1 = c1 * b2 - c2 * b1;    D2 = a1 * c2 - a2 * c1;    x = (double)((double)D1 / D);    y = (double)((double)D2 / D);    printf ("POINT %.2lf %.2lf\n", x, y);   }   else    if (a1 * c2 == a2 * c1 && b1 * c2 == b2 * c1)  // 两直线重合     printf ("LINE\n");    else     printf ("NONE\n");  }  printf ("END OF OUTPUT\n");  //system ("pause");  return 0; }
 
 
还有一个同学的代码, 用了结构体,但方法是一样的。
#include 
#include
struct point{
double x, y; };
int main(){
 point p[4];  double A1, A2, B1, B2, C1, C2, D, D1, D2;  int CASE;  scanf("%d", &CASE);  printf("INTERSECTING LINES OUTPUT\n");  while(CASE --){
  for(int i = 0; i < 4; i ++)    scanf("%lf %lf", &p[i].x, &p[i].y);  A1 = p[1].y - p[0].y;  B1 = p[0].x - p[1].x; C1 = p[0].y * (p[1].x - p[0].x) - p[0].x * (p[1].y - p[0].y);  A2 = p[3].y - p[2].y;  B2 = p[2].x - p[3].x; C2 = p[2].y * (p[3].x - p[2].x) - p[2].x * (p[3].y - p[2].y);  D = A1 * B2 - A2 * B1;  if(D == 0){
  if(A1 * p[2].x + B1 * p[2].y + C1 == 0) printf("LINE\n");   else printf("NONE\n");   continue;  }  D1 = C1 * B2 - C2 * B1;  D2 = A1 * C2 - A2 * C1;  printf("POINT %.2lf %.2lf\n", -D1 / D, -D2 / D);  }  printf("END OF OUTPUT\n");  //system("pause");  return 0; }
 
这个题做完发现思路还是比较清晰的。开始时推直线方程用的是点斜式,相当麻烦,还会出现分母是不是零的问题,后来改用两点式,一下就简单了。判断直线重合时又出现了点小问题,后来想到a、b、c都要对应成比例才行,再提交就AC了。

转载于:https://www.cnblogs.com/cloehui/archive/2011/07/20/2111395.html

你可能感兴趣的文章
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
两数和
查看>>
移动设备和SharePoint 2013 - 第3部分:推送通知
查看>>
SOPC Builder中SystemID
查看>>
MySQL数据库备份工具mysqldump的使用(转)
查看>>
NTP服务器配置
查看>>
【转】OO无双的blocking/non-blocking执行时刻
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>
RxJS & Angular
查看>>
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>