栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

VC++ 判断点是否在线段上

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

VC++ 判断点是否在线段上

这算法在一些地方会用到;在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博客

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664924.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号