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