.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
判断点相对于直线的状态(位置)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 想到了这个东东,写了一程序。希望对大家有用。
    也请大家指点,可能很多情况没考虑到



    算法:
            对于直线的特殊状态(水平,垂直)作特殊处理
            所以接下来直线可以看作一是矩形的对角线            

            现在考虑在矩形的情况(如下图两种情况)
                (对角线为题中所说的直线,判断的点为 (a,b)  )
    
                
                现在只要分别判断两种情况下的 b' 与 b 的值大小就可作出点在线上,线左、线右了


程序如下:
  /// <summary>
  /// 判断点相对于直线的状态
  /// </summary>
  /// <param name="dPtX"></param>
  /// <param name="dPtY"></param>
  /// <param name="dLineX1"></param>
  /// <param name="dLineY1"></param>
  /// <param name="dLineX2"></param>
  /// <param name="dLineY2"></param>
  /// <returns>0:在线上 1:在线的左边 2:在线的右边 3:在线的上面 4:在线的下面</returns>
  public int PtInLine( double dPtX,double dPtY,double dLineX1,double dLineY1,double dLineX2,double dLineY2 )
  {
   if( dLineX1 == dLineX2 )
   {//垂直
    if( dPtX == dLineX1 )
     return 0;
    if( dPtX < dLineX1 )
     return 1;
    return 2;
   }
   if( dLineY1 == dLineY2 )
   {//水平
    if( dPtY == dLineY1 )
     return 0;
    if( dPtY < dLineY1 )
     return 4;
    return 3;
   }

    if( dLineX1 < dLineX2 )
   {
    if( dLineY1 > dLineY2 )
    {
     return PtInLineStd_Up( dPtX,dPtY,dLineX1,dLineY1,dLineX2,dLineY2 );
    }
    else
    {
     return PtInLineStd_Down( dPtX,dPtY,dLineX1,dLineY1,dLineX2,dLineY2 );
    }
   }
   else
   {
    if( dLineY1 > dLineY2 )
    {
     return PtInLineStd_Down( dPtX,dPtY,dLineX2,dLineY2,dLineX1,dLineY1 );
    }
    else
    {
     return PtInLineStd_Up( dPtX,dPtY,dLineX2,dLineY2,dLineX1,dLineY1 );
    }
   }
  }
  /// <summary>
  /// 点(dLineX1,dLineY1) 在另一点的上面
  /// </summary>
  /// <param name="dPtX"></param>
  /// <param name="dPtY"></param>
  /// <param name="dLineX1"></param>
  /// <param name="dLineY1"></param>
  /// <param name="dLineX2"></param>
  /// <param name="dLineY2"></param>
  /// <returns></returns>
  int PtInLineStd_Up( double dPtX,double dPtY,double dLineX1,double dLineY1,double dLineX2,double dLineY2 )
  {
   double dLeft = ( dPtY - dLineY2 ) * ( dLineX2 - dLineX1 ) ;
   double dRight= ( dLineX2 - dPtX ) * ( dLineY1 - dLineY2 );
   if( dLeft > dRight )
    return 2;
   else if( dRight > dLeft )
    return 1;
   else
    return 0;
  }
  /// <summary>
  /// 点(dLineX1,dLineY1) 在另一点的下面
  /// </summary>
  /// <param name="dPtX"></param>
  /// <param name="dPtY"></param>
  /// <param name="dLineX1"></param>
  /// <param name="dLineY1"></param>
  /// <param name="dLineX2"></param>
  /// <param name="dLineY2"></param>
  /// <returns></returns>
  int PtInLineStd_Down( double dPtX,double dPtY,double dLineX1,double dLineY1,double dLineX2,double dLineY2 )
  {
   double dLeft = ( dPtY - dLineY1 ) * ( dLineX2 - dLineX1 ) ;
   double dRight= ( dPtX - dLineX1 ) * ( dLineY2 - dLineY1 );
   if( dLeft > dRight )
    return 1;
   else if( dRight > dLeft )
    return 2;
   else
    return 0;
  }

附:
代码贴上来真TMD难看
                




相关文章

相关软件