#include
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<
return true;
}
else if (d1 == 0 && on_segment(p3, p4, p1))
{
cout<
return true;
}
else if (d2 == 0 && on_segment(p3, p4, p2))
{
cout<
return true;
}
else if (d3 == 0 && on_segment(p1, p2, p3))
{
cout<
return true;
}
else if (d4 == 0 && on_segment(p1, p2, p4))
{
cout<
return true;
}
else
{
cout<
return false;
}
}
int main()
{
worldMapPos pa,pb,pc,pd,pp;
//cout<
//cin>>pa.m_nPosX>>pa.m_nPosY>>pb.m_nPosX>>pb.m_nPosY;
//cout<
//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<
return 0;
}