• nyoj-1016-德莱联盟(向量叉乘判断线段相交)


    叉乘的坐标表示:

    A(X1,Y1), B(X2, Y2), C(XC,YC), D(XD, YD);
    AB = (X2-X1, Y2-Y1);
    CD = (XD-XC, YD-YC);

    向量AB,CD的叉乘为:
    AB*CD= (X2-X1)*(YD-YC)-(Y2-Y1)*(X2-X1);
    例如两条直线,ab,cd来判断是否相交则根据
    ans = (cd叉乘ca)*(cd叉乘bd)
    如果ans大于等于0则相交,否则不相交。

    下面是判断代码:

     1 /*
     2 Name:nyoj-1016-德莱联盟
     3 Copyright:
     4 Author:
     5 Date: 2018/4/26 10:24:45
     6 Description:
     7 */
     8 #include <stdio.h>
     9 #include <iostream>
    10 using namespace std;
    11 struct point{
    12     double x,y;
    13 };
    14 int cross(point a,point b1,point b2){//求(b1-a) 和(b2-a) 的叉乘 
    15     double x1,y1,x2,y2;
    16     x1=b1.x-a.x;
    17     y1=b1.y-a.y;
    18     x2=b2.x-a.x;
    19     y2=b2.y-a.y;   
    20     return x1*y2-x2*y1;
    21 }
    22 int main()
    23 {
    24     int t;
    25     cin>>t;
    26     while(t--)
    27     {
    28         double ans1, ans2, ans3, ans4;
    29         point A,B,C,D;
    30         cin>>A.x>>A.y>>B.x>>B.y;//AB点的坐标 
    31         cin>>C.x>>C.y>>D.x>>D.y;//CD点的坐标 
    32         ans1=cross(A,C,D);  //注意cross中向量的顺序,要相减的向量放在前面;向量CA和向量DA的叉乘 
    33         ans2=cross(B,C,D);
    34         ans3=cross(C,A,B);
    35         ans4=cross(D,A,B);
    36         if(ans1*ans2<0 && ans3*ans4<0){//判断点是否在同侧,如果AB在CD的同侧,不能相交 
    37             printf("Interseetion
    ");      
    38         } else {
    39             printf("Not Interseetion
    ");  
    40         }
    41     
    42     }
    43 }
  • 相关阅读:
    HDU.6681.Rikka with Cake(欧拉公式 树状数组)
    Codeforces.449C.Willem, Chtholly and Seniorious(ODT)
    2017-2018 ACM-ICPC, Asia Daejeon Regional Contest (E,G,H,I,K)
    CF GYM.101987A.Circuits(线段树)
    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)
    220
    219
    218
    217
    216
  • 原文地址:https://www.cnblogs.com/langyao/p/8952760.html
Copyright © 2020-2023  润新知