python判断两线段是否相交_判断线段相交和交点

#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;

}

你可能感兴趣的:(python判断两线段是否相交)