• 判断两条线是否相交的算法(C#)


       1:          /// <summary>
       2:          /// 判断两条线是否相交
       3:          /// </summary>
       4:          /// <param name="a">线段1起点坐标</param>
       5:          /// <param name="b">线段1终点坐标</param>
       6:          /// <param name="c">线段2起点坐标</param>
       7:          /// <param name="d">线段2终点坐标</param>
       8:          /// <param name="intersection">相交点坐标</param>
       9:          /// <returns>是否相交 0:两线平行  -1:不平行且未相交  1:两线相交</returns>
      10:          private int GetIntersection(Point a, Point b, Point c, Point d ,ref Point intersection)
      11:          {
      12:              //判断异常
      13:              if (Math.Abs(b.X - a.Y) + Math.Abs(b.X - a.X) + Math.Abs(d.Y - c.Y) + Math.Abs(d.X - c.X) == 0)
      14:              {
      15:                  if (c.X - a.X == 0)
      16:                  {
      17:                     Debug.Print("ABCD是同一个点!");
      18:                  }
      19:                  else
      20:                  {
      21:                      Debug.Print("AB是一个点,CD是一个点,且AC不同!");
      22:                  }
      23:                  return 0;
      24:              }
      25:             
      26:              if (Math.Abs(b.Y - a.Y) + Math.Abs(b.X - a.X) == 0)
      27:              {
      28:                  if ((a.X - d.X) * (c.Y - d.Y) - (a.Y - d.Y) * (c.X - d.X) == 0)
      29:                  {
      30:                      Debug.Print ("A、B是一个点,且在CD线段上!");
      31:                  }
      32:                  else
      33:                  {
      34:                       Debug.Print ("A、B是一个点,且不在CD线段上!");
      35:                  }
      36:                  return 0;
      37:              }
      38:              if (Math.Abs(d.Y - c.Y) + Math.Abs(d.X - c.X) == 0)
      39:              {
      40:                  if ((d.X - b.X) * (a.Y - b.Y) - (d.Y - b.Y) * (a.X - b.X) == 0)
      41:                  {
      42:                      Debug.Print ("C、D是一个点,且在AB线段上!");
      43:                  }
      44:                  else
      45:                  {
      46:                      Debug.Print ("C、D是一个点,且不在AB线段上!");
      47:                  }
      48:              }
      49:             
      50:              if ((b.Y - a.Y) * (c.X - d.X) - (b.X - a.X) * (c.Y - d.Y) == 0)
      51:              {
      52:                  Debug.Print ("线段平行,无交点!");
      53:                  return 0;
      54:              }
      55:             
      56:              intersection.X = ((b.X - a.X) * (c.X - d.X) * (c.Y - a.Y) - c.X * (b.X - a.X) * (c.Y - d.Y) + a.X * (b.Y - a.Y) * (c.X - d.X)) / ((b.Y - a.Y) * (c.X - d.X) - (b.X - a.X) * (c.Y - d.Y));
      57:              intersection.Y = ((b.Y - a.Y) * (c.Y - d.Y) * (c.X - a.X) - c.Y * (b.Y - a.Y) * (c.X - d.X) + a.Y * (b.X - a.X) * (c.Y - d.Y)) / ((b.X - a.X) * (c.Y - d.Y) - (b.Y - a.Y) * (c.X - d.X));
      58:             
      59:              if ((intersection.X - a.X) * (intersection.X - b.X) <= 0 && (intersection.X - c.X) * (intersection.X - d.X) <= 0 && (intersection.Y - a.Y) * (intersection.Y - b.Y) <= 0 && (intersection.Y - c.Y) * (intersection.Y - d.Y) <= 0)
      60:              {
      61:                  Debug.Print ("线段相交于点(" + intersection.X + "," + intersection.Y + ")!");
      62:                  return 1; //'相交
      63:              }
      64:              else
      65:              {
      66:                  Debug.Print ("线段相交于虚交点(" + intersection.X + "," + intersection.Y + ")!");
      67:                  return -1; //'相交但不在线段上
      68:              }
      69:          }
  • 相关阅读:
    PyMongo系列一:操作MongoDB
    MongoDB副本集配置系列十一:MongoDB 数据同步原理和自动故障转移的原理
    MongoDB副本集配置系列十:MongoDB local库详解和数据同步原理
    MongoDB副本集配置系列九:MongoDB 常见问题
    MongoDB副本集配置系列八:MongoDB监控
    MySQL模拟:线上误update的恢复
    Atlas+Keepalived系列二:管理Atlas
    BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
    数据仓库设计小知识之一个属性的维度设计
    Microsoft 家族新成员 Datazen 移动BI 介绍
  • 原文地址:https://www.cnblogs.com/ricksun/p/2582959.html
Copyright © 2020-2023  润新知