VC6新建一个单文档工程;
视类CPP文件的头部添加声明,尾部添加函数体;
CPoint Intersection(CPoint , CPoint , CPoint , CPoint );
......CPoint Intersection(CPoint p1, CPoint p2, CPoint p3, CPoint p4)
{int xm = p2.x*p1.y - p4.x*p1.y - p1.x*p2.y + p3.x*p2.y- p2.x*p3.y + p4.x*p3.y + p1.x*p4.y - p3.x*p4.y;int ym = p2.y*p1.x - p4.y*p1.x - p1.y*p2.x + p3.y*p2.x- p2.y*p3.x + p4.y*p3.x + p1.y*p4.x - p3.y*p4.x;CPoint r;if (xm == 0 || ym == 0){r.x = 0;r.y = 0;return r;}int xz = p2.x*p3.x*p1.y - p3.x*p4.x*p1.y - p1.x*p4.x*p2.y + p3.x*p4.x*p2.y- p1.x*p2.x*p3.y + p1.x*p4.x*p3.y + p1.x*p2.x*p4.y - p2.x*p3.x*p4.y;int yz = p2.y*p3.y*p1.x - p3.y*p4.y*p1.x - p1.y*p4.y*p2.x + p3.y*p4.y*p2.x- p1.y*p2.y*p3.x + p1.y*p4.y*p3.x + p1.y*p2.y*p4.x - p2.y*p3.y*p4.x;r.x = xz / xm;r.y = yz / ym;return r;
}
OnDraw函数代码如下;
void CIntersecView::OnDraw(CDC* pDC)
{CIntersecDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;CPoint pt1=CPoint(50,50);CPoint pt2=CPoint(50, 150);CPoint pt3=CPoint(80,50);CPoint pt4=CPoint(80, 150);pDC->MoveTo(pt1);pDC->LineTo(pt2);pDC->MoveTo(pt3);pDC->LineTo(pt4);CPoint pt5 = Intersection(pt1,pt3,pt2,pt4);str1.Format("%d",pt5.x);pDC->TextOut(100,100, str1);str1.Format("%d",pt5.y);pDC->TextOut(150,100, str1);}
每次定义不同的pt1 - pt4,计算交点,输出交点坐标,并画出线段看一下情况;
给定4次不同的点;运行如下;
CPoint pt1=CPoint(10,10);
CPoint pt2=CPoint(100, 100);
CPoint pt3=CPoint(10,30);
CPoint pt4=CPoint(100, 30);
CPoint pt1=CPoint(10,10);
CPoint pt2=CPoint(100, 10);
CPoint pt3=CPoint(10,30);
CPoint pt4=CPoint(100, 30);
CPoint pt1=CPoint(100,80);
CPoint pt2=CPoint(300, 80);
CPoint pt3=CPoint(200,10);
CPoint pt4=CPoint(200, 150);
CPoint pt1=CPoint(50,50);
CPoint pt2=CPoint(50, 150);
CPoint pt3=CPoint(80,50);
CPoint pt4=CPoint(80, 150);
这个是网上下的函数;目前看上去没错; 线段平行的时候没有交点;可能还需验证共线的情形;