读书人

有多条线段知道他们的始点坐标和终点

发布时间: 2012-05-24 11:55:41 作者: rapoo

有多条线段,知道他们的始点坐标和终点坐标..
有多条线段,知道他们的始点坐标和终点坐标,比如线段A 始点坐标和终点坐标分别为(0,0)(1,2),同理 B始点坐标和终点坐标分别为(1,2)(3,4),C始点坐标和终点坐标分别为(0,0)(5,6),D始点坐标和终点坐标分别为(5,6)(7,8)。。还有好多线段。所有线段在vector中。。每次从vector中取出一条线段与其他线段做比较。如果这条线段和其他线段之间的始点坐标和终点坐标有相同的则连接成一条线,比如A和B可以连接成一条线。。。
有大神能给出一段代码吗?

[解决办法]
连接成一条线

怎么连?用什么来表示?
是不不考虑连后为直线?
[解决办法]
会不会出现类似下面的情况呢?
(0,0)(1,2)
(1, 2)(3, 4)
(1, 2)(4, 2)
(4, 2)(3, 4)
(3, 4)(5, 6)
(5, 6)(7, 8)
如果是的话,那就有点复杂了。

[解决办法]

探讨

其他不考虑。只要把坐标相等的连一起就行 比如 (0,0)(1,2)
(1, 2)(3, 4)就应该连接,连完之后起点和终点坐标就是(0,0),(3,4) 了引用:
连接成一条线

怎么连?用什么来表示?
是不不考虑连后为直线?

[解决办法]
仅供参考
C/C++ code
//实现一个函数:求数轴上多个线段覆盖的区域对应的多个线段; 输入多个线段,求出被这些线段覆盖的所有区域(也用线段表示); 一条线段用两个值表示(x0,x1), 其中x1>x0;//比如(1,3);(2,4);(5,6);结果为(1,4);(5,6);//比如(1,3);(2,4);(5,6);(4,7);结果为(1,7);#include <stdio.h>#define MAXLINES 100struct LINE {    int x0;//左端    int x1;//右端} ls[MAXLINES];int i,j,k,n,x0,x1,c;void add() {    if (0==n) {//加入第一对点        ls[n].x0=x0;        ls[n].x1=x1;        n=1;    } else {        if (x1==ls[0].x0) {//右端=第一条线段的左端            ls[0].x0=x0;//第一条线段的左端修改为左端            return;        }        if (x1<ls[0].x0) {//右端<第一条线段的左端            for (i=n-1;i>=0;i--) {//将所有线段往后移                ls[i+1].x0=ls[i].x0;                ls[i+1].x1=ls[i].x1;            }            ls[0].x0=x0;//新第一条线段为x0,x1            ls[0].x1=x1;            n++;            return;        }        if (ls[n-1].x1<x0) {//左端>最后那条线段的右端            ls[n].x0=x0;//新最后那条线段            ls[n].x1=x1;            n++;            return;        }        if (x0<=ls[0].x0 && ls[n-1].x1<=x1) {//左端≤第一条线段的左端且最后那条线段的右端≤右端            ls[0].x0=x0;//只剩这一条线段            ls[0].x1=x1;            n=1;            return;        }        for (i=0;i<n;i++) {//从左到右依次检查每条线段            if (ls[i].x0<=x0 && x0<=ls[i].x1) {//第i条线段的左端≤左端≤第i条线段的右端                for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段                    if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端                        ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                            ls[i+k].x0=ls[j+k].x0;                            ls[i+k].x1=ls[j+k].x1;                        }                        n-=j-i;                        return;                    }                    if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)                        ls[i].x1=x1;//第i条线段的右端改为右端                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                            ls[i+k].x0=ls[j+k].x0;                            ls[i+k].x1=ls[j+k].x1;                        }                        n-=j-i;                        return;                    }                }            }            if (ls[i].x1<x0 && (i==n-1 || x0<ls[i+1].x0)) {//第i条线段的右端<左端<第i+1条线段的左端(如果有)                if (i!=n-1 && x1<ls[i+1].x0) {//右端<第i+1条线段的左端(如果有)                    for (k=n-1;k>=i+1;k--) {//将从第i+1条线段开始的所有线段往后移                        ls[k+1].x0=ls[k].x0;                        ls[k+1].x1=ls[k].x1;                    }                    ls[i+1].x0=x0;//新第i+1条线段为x0,x1                    ls[i+1].x1=x1;                    n++;                    return;                }                for (j=i+1;j<n;j++) {//从第i+1条线段开始从左到右依次检查每条线段                    if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端                        ls[i+1].x0=x0;//第i+1条线段的左端改为左端                        ls[i+1].x1=ls[j].x1;//第i+1条线段的右端改为第j条线段的右端                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                            ls[i+1+k].x0=ls[j+k].x0;                            ls[i+1+k].x1=ls[j+k].x1;                        }                        n-=j-i-1;                        return;                    }                    if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)                        ls[i+1].x0=x0;//第i+1条线段的左端改为左端                        ls[i+1].x1=x1;//第i+1条线段的右端改为右端                        for (k=1;k<n-j-1;k++) {//将剩余线段往前移                            ls[i+k].x0=ls[j+k].x0;                            ls[i+k].x1=ls[j+k].x1;                        }                        n-=j-i-1;                        return;                    }                }            }            if (x0<ls[i].x0) {//左端<第i条线段的左端                for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段                    if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端                        ls[i].x0=x0;//第i条线段的左端改为左端                        ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                            ls[i+k].x0=ls[j+k].x0;                            ls[i+k].x1=ls[j+k].x1;                        }                        n-=j-i;                        return;                    }                    if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)                        ls[i].x0=x0;//第i条线段的左端改为左端                        ls[i].x1=x1;//第i条线段的右端改为右端                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                            ls[i+k].x0=ls[j+k].x0;                            ls[i+k].x1=ls[j+k].x1;                        }                        n-=j-i;                        return;                    }                }            }        }    }}void show() {    for (i=0;i<n;i++) {        printf("(%d,%d);",ls[i].x0,ls[i].x1);    }    printf("\n");}void main() {    n=0;    c=0;    while (1) {        printf("Input x0,x1(x0<x1;0,0 to exit):");        fflush(stdout);        rewind(stdin);        if (2==scanf("%d,%d",&x0,&x1)) {            if (0==x0&&0==x1) break;            if (x1>x0) {                c++;                if (c>=MAXLINES) {                    printf("Up to %d!\n",MAXLINES);                    break;                }                add();                show();            }        }    }} 

读书人网 >C++

热点推荐