선분 에 있 는 지 아 닌 지 를 판단 하 다.

8352 단어 c#
코드 1
원본 주소:http://blog.sina.com.cn/s/blog_4c8bb86b0100k2lc.html
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
 
/// 
    ///        
    /// 
    class ClickOnLine
    {
        /// 
        ///        
        /// 
        /// 
        ///     
        /// 
        ///     
        ///      true
        public static bool IsPtInLine(Point ptCurr, Point pStart, Point pEnd, int allowErr)
        {
            CCADCoord pt = new CCADCoord(ptCurr.X, ptCurr.Y);
            CCADCoord p1 = new CCADCoord(pStart.X, pStart.Y);
            CCADCoord p2 = new CCADCoord(pEnd.X, pEnd.Y);
            int n = PtInPolyLine(pt, p1, p2, allowErr);
            if (n == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// 
        ///       pt       : 1:    ;0:     
        /// 
        ///      
        ///       
        ///    (         ,          )
        /// 1:    ;0:     
        public static int PtInPolyLine(CCADCoord pt, CCADCoord l1, CCADCoord l2, double allowError)
        {
            //            
            if (Math.Abs(l2.X - pt.X) <= allowError && Math.Abs(l2.Y - pt.Y) <= allowError)
                return 1;
            if (Math.Min(l1.X, l2.X) <= pt.X && Math.Min(l1.Y, l2.Y) <= pt.Y &&
            Math.Max(l1.X, l2.X) >= pt.X && Math.Max(l1.Y, l2.Y) >= pt.Y)
            {
                //        
                if (Math.Abs(allowError - 0.0) <= 0.0001)
                {
                    #region        100%   ,        ,           ,   ,           
                    CCADCoord tp1 = new CCADCoord(l2.X - pt.X, l2.Y - pt.Y);  //    
                    CCADCoord tp2 = new CCADCoord(pt.X - l1.X, pt.Y - l1.Y);  //    
                    if (Math.Abs(Math.Abs(tp1.X * tp2.Y - tp2.X * tp1.Y) - 0.0) <= 0.00000001)         //    ,        
                        return 1;
                    #endregion
                }
                else
                {
                    if (Math.Abs(l2.X - l1.X) <= allowError && Math.Abs(l2.X - pt.X) <= allowError)
                        return 1;
                    if (Math.Abs(l2.Y - l1.Y) <= allowError && Math.Abs(l2.Y - pt.Y) <= allowError)
                        return 1;
                    if (DistancePointToSegment(pt, l1, l2) <= allowError)
                        return 1;
                    //               ,     
                    if (DistancePointToSegment(pt, l1, l2) <= allowError)
                        return 1;
                }
            }

            return 0;
        }
        /// 
        ///          (            ,    )
        /// 
        ///    
        ///     A
        ///     B
        /// 
        public static double DistancePointToSegment(CCADCoord P, CCADCoord A, CCADCoord B)
        {
            //      (a,b)     
            double l = 0.0;
            double s = 0.0;
            l = DistancePointToPoint(A, B);
            s = ((A.Y - P.Y) * (B.X - A.X) - (A.X - P.X) * (B.Y - A.Y)) / (l * l);
            return (Math.Abs(s * l));
        }
        /// 
        ///       
        /// 
        /// 
        /// 
        /// 
        private static double DistancePointToPoint(CCADCoord ptA, CCADCoord ptB)
        {
            return Math.Sqrt(Math.Pow(ptA.X - ptB.X, 2) + Math.Pow(ptA.Y - ptB.Y, 2));
        }
        /// 
        ///   
        /// 
        public struct CCADCoord
        {
            public double X;
            public double Y;
            /// 
            ///     
            /// 
            /// 
            /// 
            public CCADCoord(double x, double y)
            {
                X = x;
                Y = y;
            }
        }
    }
 

코드 2:
원본 주소:http://www.cnblogs.com/dxp498688071/archive/2011/03/03/1970217.html
/ * 판단 점 이 선분 에 있 는 지 여부:
설 치 는 Q 이 고 선분 은 P1P 2 이 며 판단 점 Q 가 이 선분 에서 의 근 거 는 다음 과 같다. (Q - P1)× (P2 - P1) = 0 및 Q 는 P1, P2 를 대각 정점 으로 하 는 사각형 안에 있 습 니 다.전 자 는 Q 점 이 직선 P1P 2 에 있 고 후 자 는 Q 점 이 라인 P1P 2 의 연장선 이나 역방향 연장선 에 있 지 않 음 을 보증 하 며 이 절차 에 대한 판단 은 다음 과 같은 과정 으로 이 루어 질 수 있다.
  ON-SEGMENT(pi,pj,pk)
  if min(xi,xj) <= xk <= max(xi,xj) and min(yi,yj) <= yk <= max(yi,yj)
  then return true;
  else return false;
특히 주의해 야 할 것 은 수평 선분 과 수직 선분 의 두 가지 특수 한 상황 을 고려 해 야 하기 때문에 min (xi, xj) < = xk < = max (xi, xj) 와 min (yi, yj) < = yk < = max (yi, yj) 두 가지 조건 을 동시에 만족 시 켜 야 실제 값 으로 돌아 갈 수 있다 는 것 이다.
*/
#include
 
struct point
{
 double x,y;
};
double direction( point p1,point p2,point p )
{
    return ( p1.x -p.x )*( p2.y-p.y) -  ( p2.x -p.x )*( p1.y-p.y)   ;
}
 
int on_segment( point p1,point p2 ,point p )
{
    double max=p1.x > p2.x ? p1.x : p2.x ;
    double min =p1.x < p2.x ? p1.x : p2.x ;
 double max1=p1.y > p2.y ? p1.y : p2.y ;
    double min1=p1.y < p2.y ? p1.y : p2.y ;
    if( p.x >=min && p.x <=max && 
  p.y >=min1 && p.y <=max1 )
        return 1;
    else
        return 0;
}
 
int main()
{
 point p1,p2,q;
 while( 1 )
 {
  scanf("%lf %lf %lf %lf %lf %lf",&q.x ,&q.y ,&p1.x ,&p1.y ,
   &p2.x ,&p2.y  ) ;
  if( !on_segment( p1,p2,q ) )
  {
   printf("no
"); continue; } if( direction( q,p1,p2 )==0 ) printf("yes
"); else printf("no
"); } return 0; }

코드 3
원본 주소:http://blog.csdn.net/lishiming0308/article/details/5537441
//               

       //  ab,a(ax,ay),b(bx,by),p(x,y);   p     ab  
        public static   bool PtInSegment(double x, double y, double ax, double ay, double bx, double by)
        {
            #region
            /*            
            if (((x <= ax && x >= bx) || (x <= bx && x >= ax)) && ((y <= ay && y >= by) || (y <= by && y >= ay)))
            {
                if (ax == bx || ay==by)
                    return true;
                double result = (by - ay) / (bx - ax) - (y - ay) / (x - ax);

                return Math.Abs(result) < 0.1;

            }
            return false;
             * */
            #endregion
            #region
           
            //                   
            //  ap   
            double a_p = Math.Sqrt(Math.Pow(Math.Abs(ax - x), 2) + Math.Pow(Math.Abs(ay - y), 2));
            //  b_p   
            double b_p = Math.Sqrt(Math.Pow(Math.Abs(bx - x), 2) + Math.Pow(Math.Abs(by - y), 2));
            //  ab   
            double a_b = Math.Sqrt(Math.Pow(Math.Abs(ax - bx), 2) + Math.Pow(Math.Abs(ay - by), 2));
            //  a_p   b_p  
            double a_p_b = a_p + b_p;
            if (a_p_b - a_b < 0.5)
            {
                return true;
            }
            else
            {
                return false;
            }
           
            /*
            #endregion
            //           ,           
            //p(x,y),a(ax,ay),b(bx,by)
            //  ab     (bx-ax,by-ay)
            //  ap     (x-ax,y-ay)
            //  ab   ap   abp=(bx-ax)*(y-ay)+(by-ay)*(x-ax)
            double abp = (bx - ax) * (y - ay) -(by - ay) * (x - ax);
            double  MaxX = Math.Max(ax, bx);
            double MinX = Math.Min(ax, bx);
            double MaxY = Math.Max(ay, by);
            double MinY = Math.Min(ay, by);
            ax = MinX; bx = MaxX; ay = MinY; by = MaxY;
            if (ax <= x &&x<= bx && ay <= y &&y<= by )
            {
                if(Math .Abs (abp )==0)
                return true;
            }
            return false ;
            */

        }

좋은 웹페이지 즐겨찾기