zoukankan      html  css  js  c++  java
  • 判断线段相交 -- 51nod 1264 线段相交

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264

    三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y - a.x*c.y - c.x*b.y - b.x*a.y;

    上面得到的即是以点A,B,C三点组成的三角形面积的两倍。

    如果area >0 则点A,B,C呈逆时针排列。

    如果area<0  则点A,B,C呈顺时针排列。

    如果area=0  则点A,B,C三点共线。

    那么判断线段1(两个端点point a,b),与线段二是否相交(两个端点point c,d) 只要求 a,b,c与a,b,d的有向面积乘积是否小于0 ,并且c,d,a与c,d,b的有向面积是否小于0即可。

    只有两线段相交,有向面积才会是一个为正一个为负。画一下图就知道了。

    端点相交时乘积等于0。

     1 #include <cstdio>
     2 
     3 struct point
     4 {
     5     double x,y;
     6 };
     7 double dir(point a, point b, point c)//三角形有向面积判断顺逆时针
     8 {
     9     return a.x*b.y + b.x*c.y + c.x*a.y - a.x*c.y - c.x*b.y - b.x*a.y;
    10 }
    11 bool connected(point a, point b, point c, point d)//线段判交
    12 {
    13     if (dir(a, b, c)*dir(a, b, d) <= 0 && dir(d, c, a)*dir(d, c, b) <= 0)return 1;//注意在端点处相交时等于0
    14     return 0;
    15 }
    16 
    17 int main()
    18 {
    19     int t;
    20     point a,b,c,d;
    21     scanf("%d",&t);
    22     while(t--)
    23     {
    24         scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);
    25         if(connected(a,b,c,d)) printf("Yes
    ");
    26         else printf("No
    ");
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    AJAX实现文件下载
    正则表达式收集
    C# Winform使用线程改变窗体控件的属性
    C# DataTable转List<Model>通用类
    C# ExcelHelper
    CSS浏览器兼容
    asp.net mvc Razor视图引擎
    『C程序设计』读书笔记系列文章之第八章 预编译处理
    .NET发邮件错误之"Could not access 'CDO.Message' object."
    英语词组日常积累
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4484736.html
Copyright © 2011-2022 走看看