VC++ 判断点是否在线段上
生活随笔
收集整理的這篇文章主要介紹了
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 hereCString 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博客
?
總結
以上是生活随笔為你收集整理的VC++ 判断点是否在线段上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编LAHF指令学习 - 使用emu80
- 下一篇: Windows和Virtualbox虚拟