hdu 1086 判断交点
来源:互联网 发布:记住英国历史 知乎 编辑:程序博客网 时间:2024/05/29 05:06
对于两条直线上的点, M(ax1,ay1) N (ax2,ay2) P(bx1,by1) Q(bx2,by2)
若两直线相交,则任意一条直线的两个端点,都在另一条直线的两侧。
我们可以使用向量外积 或者 线性规划 来判断。
此处使用外积。
MN 与 MP 的外积 MNP = (ax1 - ax2)*(ay1 - by1) - (ay1 - ay2)*(ax1 - bx1)
MN 与 MQ 的外积 MNQ = (ax1 - ax2)*(ay1 - by2) - (ay1 - ay2)*(ax1 - bx2)
若MNP 和 MNQ 异号,则点在线的两侧。
MNP 和 MNQ 的积 为0,则有点在线上,因此也算作有交点。
#include <stdio.h>#include <stdlib.h>struct node{double x,y;}s1[105],s2[105];int ans;void wtf(int a,int b){double abc = (s1[a].x - s2[a].x)*(s1[a].y - s1[b].y) - (s1[a].y - s2[a].y)*(s1[a].x - s1[b].x);double abd = (s1[a].x - s2[a].x)*(s1[a].y - s2[b].y) - (s1[a].y - s2[a].y)*(s1[a].x - s2[b].x);double cda = (s1[b].x - s2[b].x)*(s1[b].y - s2[a].y) - (s1[b].y - s2[b].y)*(s1[b].x - s2[a].x);double cdb = (s1[b].x - s2[b].x)*(s1[b].y - s1[a].y) - (s1[b].y - s2[b].y)*(s1[b].x - s1[a].x);if((abc * abd) <= 0 && (cda * cdb) <= 0) ans++;}int main(){//freopen("t.txt","r",stdin);int n,i,j;while(~scanf("%d",&n) && n){ans = 0;for(i = 0; i < n; i++){scanf("%lf%lf%lf%lf",&s1[i].x,&s1[i].y,&s2[i].x,&s2[i].y);}for(i = 1; i < n; i++){for(j = 0; j < i; j++){wtf(i,j);}}printf("%d\n",ans);} return 0;}
0 0
- hdu 1086 判断交点
- hdu 1086 求线段交点
- 有环链表交点判断
- VTK交点判断
- hdu 2528 线段交点
- hdu 1558 Segment set(判断线段有交点+并查集)
- hdu 1086 计算几何 求线段有多少个交点
- HDU 3803 求线段交点
- hdu 计算直线的交点
- HDU 1466 直线交点情况
- 判断链表是否有交点若有找出交点
- HDOJ 1086 You can Solve a Geometry Problem too (判断直线交点个数)
- 图形图像--判断线段是否有交点
- 判断线段是否相交...并求出交点。
- 判断两链表是否相交,并求出交点
- 判断两个单链表相交及寻找交点
- 如何判断两个单链表是否有交点?
- 判断两个链表是否有交点
- JavaScript Date(日期) 对象
- centos 7 添加环境变量
- 04 ByteBuf
- 第五章 5.1 自适应布局入门
- apache下面的下载资源,如果不想从apache.org上面下载可以从下面下载
- hdu 1086 判断交点
- Oracle数据的导入导出命令
- NumPy实例
- 随意细解:UI -- 设计模式、手势识别
- 02_不声明第三个变量实现冒泡排序
- HDU 2639 Bone Collector II (01背包第k优解 好题)
- Java程序员常用工具集
- iOS平台基于KVC的JSON与数据对象绑定
- 巴黎事件发生后,Facebook、Twitter、Google和Uber都做了什么?