这算法在一些地方会用到;在GIS中也有;
新建一个单文档工程;
先把窗口标题改一下;如下图定位到文档类OnNewdocument函数;
定位到onNewdocument()函数,添加setTitle一行;
把如下的C语言函数加到视类CPP文件的尾部;
int PointIsonSegment(POINT p, POINT a, POINT b)
{
Vector AP = VectorConstruct(p, p);
Vector AB = VectorConstruct(a, b);
if(CrossProduct(AP, AB) == 0 && p.x>=min(a.x, b.x) && p.x <=max(a.x, b.x) && p.y>=min(a.y, b.y) && p.y<=max(a.y, b.y))
{
return 1;
}
else
{
return 0;
}
}
Vector VectorConstruct(POINT a, POINT b)
{
Vector v;
v.x = b.x - a.x;
v.y = b.y - a.y;
return v;
}
double CrossProduct(Vector a, Vector b)
{
return a.x * b.y - a.y * b.x;
}
结构体定义和函数声明加到视类CPP文件的头部;
struct Vector{
int x;
int y;
};
Vector VectorConstruct(POINT , POINT );
double CrossProduct(Vector , Vector );
int PointIsonSegment(POINT , POINT , POINT );
视类OnDraw函数如下;
void CPttestView::onDraw(CDC* pDC)
{
CPttestDoc* pDoc = Getdocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString str1;
POINT pt1;
POINT pt2;
pt1.x=50;
pt1.y=50;
pt2.x=250;
pt2.y=250;
pDC->MoveTo(pt1);
pDC->LineTo(pt2);
int zxs = PointIsonSegment(pt1, pt1, pt2);
str1.Format("%d",zxs);
pDC->TextOut(400,50,str1);
POINT pt3;
pt3.x=60;
pt3.y=260;
zxs = PointIsonSegment(pt3, pt1, pt2);
str1.Format("%d",zxs);
pDC->TextOut(400,100,str1);
POINT pt4;
pt4.x=60;
pt4.y=1600;
zxs = PointIsonSegment(pt4, pt1, pt2);
str1.Format("%d",zxs);
pDC->TextOut(400,150,str1);
POINT pt5;
pt5.x = 60;
pt5.y =160;
zxs = PointIsonSegment(pt5, pt1, pt2);
str1.Format("%d",zxs);
pDC->TextOut(400,200,str1);
}
先画一下线段;然后判断几个点看一下;
PointIsonSegment(POINT p, POINT a, POINT b), a、b是线段端点,p是要判断的点;
先判断端点,端点肯定在线段上,输出1;
再判断(60,260),不在,输出0;
再判断(60,1600),不在,输出0;
再判断(60,160),输出1,那么此点在线段上;
但是感觉还有问题;如果(60,160)在的话,看上去(60,161)应该不在了; 判断(60,161)还是输出1;可能是计算的四舍五入,结构体Vector的成员可能应定义为double;下回再整;
基本代码和判断原理参见:
C语言平面几何3-点是否在线段上_xiaoshe的专栏-CSDN博客



