如上图,判断线段AB和线段CD相交。
分析:如果线段AB和线段CD相交,只能是图中的两种相交情况。可以用向量叉乘来判断。如果(向量AB叉乘向量AC)*(向量AB叉乘向量AD)<= 0 并且(向量CD叉乘向量CA)*(向量CD叉乘向量CB)<= 0,那么说明线段AB与线段CD相交。
设A(X1,Y1), B(X2, Y2), C(X3, Y3), D(X4, Y4),三角形ABC的面积为:2A = =
X1*Y2 + X3*Y1 + X2*Y3 - X3*Y2 - X1*Y3 - X2*Y1。
如果A>0,有向面积为正,ABC为逆时针排列;否则,ABC为顺时针排列。
应用:
德莱联盟
时间限制:1000 ms | 内存限制:65535 KB
难度:1
- 描述
-
欢迎来到德莱联盟。。。。德莱文。。。
德莱文在逃跑,卡兹克在追。。。。
我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和中点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线。
- 输入
- 几组数据,一个整数T表示T组数据
每组数据 8个实数,分别表示德莱文的起点和终点坐标,以及卡兹克的起点和终点坐标
- 输出
- 如果可能 输出 Interseetion,否则输出 Not Interseetion
- 样例输入
-
2 -19.74 7.14 22.23 -27.45 -38.79 -5.08 47.51 34.01 -8.61 9.91 -32.47 6.47 -3.81 -16.1 7.82 -6.37
- 样例输出
-
Interseetion Not Interseetion
- 题目就是给出两条线段的起点坐标和终点坐标,判断这两条线段是否相交,如果相交输出Interseetion;否则输出“Not Intersection”。
-
#include<stdio.h> struct node { double x, y; }st1, ed1, st2, ed2; double get_area(node a0, node a1, node a2) { //求有向面积 double s = a0.x*a1.y + a2.x*a0.y +a1.x*a2.y - a2.x*a1.y - a0.x*a2.y - a1.x*a0.y; return s; } int main() { int n; scanf("%d",&n); while(n--) { scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&st1.x, &st1.y, &ed1.x, &ed1.y, &st2.x, &st2.y, &ed2.x, &ed2.y); double s1 = get_area(st1, ed1, st2); double s2 = get_area(st1, ed1, ed2); double s3 = get_area(st2, ed2, st1); double s4 = get_area(st2, ed2, ed1); if(s1 * s2 <= 0 && s3 * s4 <= 0) printf("Interseetion\n"); else printf("Not Interseetion\n"); } return 0; }
深入理解JAVA虚拟机--读书笔记,码迷,mamicode.com
时间: 2024-08-07 16:59:14