zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    6.4 记录
    Python向mysql数据库插入数据
    6.2号课下作业测试标准的好坏
    模糊查询
    日常开发问题解决
    日常开发问题解决
    tomcat容器启动失败疑难问题解决方案
    5.14 记录
    5.13 记录
    关于HTTP,TCP,IP的一些基础知识
  • 原文地址:https://www.cnblogs.com/slothrbk/p/8952760.html
Copyright © 2011-2022 走看看