C++ : Modified Line Segment Intersection

浪子不回头ぞ 提交于 2020-01-25 21:39:48

问题


Given N lines (either horizontal or vertical), I need to find total intersection of these line segments as well as intersections per line. My code is as follows :

using namespace std;

#define x second
#define y first
#define MAX 10000

typedef pair<int,int >point;
struct event 
{
    point p1,p2;
    int type;
    event() {};
    event(point p1,point p2, int type) : p1(p1), p2(p2),type(type) {};  //initialization of event
};
int n,e;
event events[MAX];
bool compare(event a, event b) 
{ 
    return a.p1.x<b.p1.x; 
}
set<point >s;
int hv_intersection()
{
    ll count=0;
    for (ll i=0;i<e;++i)
        {
                event c = events[i];
                if (c.type==0) s.insert(c.p1);//insert starting point of line segment into set
                else if (c.type==1) s.erase(c.p2);//remove starting point of line segment from set, equivalent to removing line segment
                else
                {
                        for (typeof(s.begin()) it=s.lower_bound(make_pair(c.p1.y,-1));it!=s.end() && it->y<=c.p2.y; it++) // Range search
                            {    printf("%d, %d\n", events[i].p1.x, it->y);//intersections
                                count++;
                            }
                }
        }

    return count;
}
int main () 
{

    scanf("%d", &n);
    ll p1x,p1y,p2x,p2y;
        for (int i=0;i<n;++i) 
        {
                scanf("%d %d %d %d", &p1x, &p1y,&p2x, &p2y);
        if(p1x==p2x)                //if vertical line, one event with type=2
        {
            events[e++]=event(make_pair(p1y,p1x),make_pair(p2y,p2x),2);
        }
        else                    //if horizontal line, two events one for starting point and one for ending point
        {
            //store both starting points and ending points
            events[e++]=event(make_pair(p1y,p1x),make_pair(p2y,p2x),0);
            //store both ending and starting points, note the order in the second, this is because we sort on p1, so ending points first, then we remove a line when we hit its ending point , so we need its starting point for removal of line
            events[e++]=event(make_pair(p2y,p2x),make_pair(p1y,p1x),1);
        }
        }
    sort(events, events+e,compare);//on x coordinate
   int count= hv_intersection();

    cout<<"count="<<count;
    return 0;
}

For the following input :

5                                   // number of lines
0 0 0 3                             // x1,y1,x2,y2
2 0 2 5 
3 0 3 5
0 0 3 0
0 3 3 3

Output :

2, 0
2, 3
3, 0
3, 3
count=4

Now I can't figure out how to do the following things :

1.The intersection should not be there when both line segments end point meet. One end point can lie on the other line segment though i.e (3,0) is incorrect. The valid intersection points according to my conditions are :

(2,0) , (2,3), (3,3)

2. I want to calculate the number of intersections per line i.e. desired output should be:

0 2 1 1 2

count=3 

i.e.

0 0 0 3   has 0 intersection
2 0 2 5   has 2 intersections
3 0 3 5   has 1 intersection
0 0 3 0   has 1 intersection
0 3 3 3   has 2 intersections

Can someone help me out in correcting these 2 mistakes in code ?

来源:https://stackoverflow.com/questions/40570886/c-modified-line-segment-intersection

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!