선분 에 있 는 지 아 닌 지 를 판단 하 다.
8352 단어 c#
원본 주소: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 ;
*/
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.