判斷線段相交和交點

#include <iostream>
using namespace std;

typedef struct
{
	double     m_nPosX;
	double     m_nPosY;
}worldMapPos;

#define EUSE 1e-15

int direction (worldMapPos& p0, worldMapPos& p1, worldMapPos& p2)
{
	return ((p2.m_nPosX - p0.m_nPosX)*(p1.m_nPosY - p0.m_nPosY) - (p1.m_nPosX - p0.m_nPosX)*(p2.m_nPosY - p0.m_nPosY));
}

bool on_segment (worldMapPos& p0, worldMapPos& p1, worldMapPos& p2)
{
	int minx, maxx, miny, maxy;
	minx = min(p0.m_nPosX, p1.m_nPosX);
	maxx = max(p0.m_nPosX, p1.m_nPosX);
	miny = min(p0.m_nPosY, p1.m_nPosY);
	maxy = max(p0.m_nPosY, p1.m_nPosY);
	if (p2.m_nPosX >= minx && p2.m_nPosX <= maxx && p2.m_nPosY >= miny && p2.m_nPosY <= maxy)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void getinsectpoint(worldMapPos& a,worldMapPos& b,worldMapPos& c,worldMapPos& d,worldMapPos& p)
{
	double delta,r,u;

	delta = (b.m_nPosX - a.m_nPosX) * (c.m_nPosY - d.m_nPosY) - (c.m_nPosX - d.m_nPosX) * (b.m_nPosY - a.m_nPosY);
	if(abs(delta) <= EUSE)
	{
		p.m_nPosX = 10000;
		p.m_nPosY = 10000;
	}
	else
	{
		r = ((c.m_nPosX - a.m_nPosX) * (c.m_nPosY - d.m_nPosY) - (c.m_nPosX - d.m_nPosX) * (c.m_nPosY - a.m_nPosY)) / delta;
		u = ((b.m_nPosX - a.m_nPosX) * (c.m_nPosY - a.m_nPosY) - (c.m_nPosX - a.m_nPosX) * (b.m_nPosY - a.m_nPosY)) / delta;
		if((r >= 0 && r <= 1) && (u >= 0 && u <= 1))
		{
			p.m_nPosX = a.m_nPosX + r*(b.m_nPosX - a.m_nPosX);
			p.m_nPosY = a.m_nPosY + r*(b.m_nPosY - a.m_nPosY);
		}
		else
		{
			p.m_nPosX = 10000;
			p.m_nPosY = 10000;
		}
	}
}

bool CheckLineMeet (worldMapPos& p1, worldMapPos& p2, worldMapPos& p3, worldMapPos& p4)
{
	int d1, d2, d3, d4;
	d1 = direction(p3, p4, p1);
	d2 = direction(p3, p4, p2);
	d3 = direction(p1, p2, p3);
	d4 = direction(p1, p2, p4);
	if (((d1 < 0 && d2 > 0) || (d1 > 0 && d2 < 0)) && ((d3 < 0 && d4 > 0) || (d3 > 0 && d4 < 0)))
	{
		cout<<"--------AAAAAA---------"<<endl;
		return true;
	}
	else if (d1 == 0 && on_segment(p3, p4, p1))
	{
		cout<<"--------BBBBBB---------"<<endl;
		return true;
	}
	else if (d2 == 0 && on_segment(p3, p4, p2))
	{
		cout<<"--------CCCCCC---------"<<endl;
		return true;
	}
	else if (d3 == 0 && on_segment(p1, p2, p3))
	{
		cout<<"--------DDDDDD---------"<<endl;
		return true;
	}
	else if (d4 == 0 && on_segment(p1, p2, p4))
	{
		cout<<"--------EEEEEE---------"<<endl;
		return true;
	}
	else
	{
		cout<<"--------FFFFFF---------"<<endl;
		return false;
	}
}

int main()
{
	worldMapPos pa,pb,pc,pd,pp;
	//cout<<"please input the first line: "<<endl;
	//cin>>pa.m_nPosX>>pa.m_nPosY>>pb.m_nPosX>>pb.m_nPosY;
	//cout<<"\n"<<"please input the second line: "<<endl;
	//cin>>pc.m_nPosX>>pc.m_nPosY>>pd.m_nPosX>>pd.m_nPosY;
	int posDir[] = {0,0,300,100,1200,0,500,600};
	pa.m_nPosX = posDir[0];
	pa.m_nPosY = posDir[1];
	pb.m_nPosX = posDir[2];
	pb.m_nPosY = posDir[3];
	pc.m_nPosX = posDir[4];
	pc.m_nPosY = posDir[5];
	pd.m_nPosX = posDir[6];
	pd.m_nPosY = posDir[7];
	getinsectpoint(pa,pb,pc,pd,pp);
	cout<<"point is "<<CheckLineMeet(pa,pb,pc,pd)<<"("<<pp.m_nPosX<<","<<pp.m_nPosY<<")"<<endl;
	return 0;
}
相關文章
相關標籤/搜索