我有10000条甚至更多的线
目标:找出所有水平线,竖直的线,以及两两平行的线,两两垂直的线。再从平行线里面找出两两相等的线,分别做出不同标记。
要求: 用最少的循环最高的效率来实现。写出伪代码判断水平: IsThisLineHorizontal()
判断竖直 IsThisLineVertical()
判断两两平行 IsTwoLinesParallel()
判断两两垂直 IsTwoLinesNormal()
判断两两相等 IsTwoLinesEqual()要考虑到所有的水平线必然两两平行
所有竖直的线也必然两两平行
所有水平线与竖直线之间必然两两垂直我目前的方法是:
Step1: 先将所有线分为三类:水平线,竖直线,既不水平又不竖直的线
Step2: 循环所有水平线,对水平线两两加平行标志,如果平行的话判断是否相等,若相等加相等标志
Step3: 循环所有竖直线,对竖直线两两加平行标志,如果平行的话判断是否相等,若相等加相等标志
Step4:循环水平线与竖直线,两两加垂直标志。
Step5: 循环既不水平又不竖直的线,找处其中两两平行,两两垂直的线,如果平行的话判断是否相等,若相等加相等标志。太复杂了,有没有办法简化

解决方案 »

  1.   

    要求精度高么?对所有的线循环做循环,对每条线,记住它对X轴的角度和与X轴的交点,对同一角度者做个LIST,然后对所有的角度做循环。同一角度者自然是平行的,既平行,与X轴的交点又相同者自然是全等的,相差90度或270度的自然是垂直的,。
      

  2.   

    是的、精度要求很高。
    思归说的有道理、但是两两相等说的好像不是很明白。 hdt(近来工作忙,每天只能接分半个小时) 
    你说是个矩阵运算、可以写一个大概吗??
    只要多说明一下。谢谢
      

  3.   

    我的思路應是這樣:
    直線方程式﹕y1=a1x+b1; y1=0則垂直,若a1=0則平行.
    另一直線:y2=a2x+b2 若a1=a2兩直線平行﹐若a1=a2且b1=b2兩直線相等.
      

  4.   

    都看完了!!
    觉得对精度要求不是很高的话,思归的方法最合适!!list不会很多!!
      

  5.   

    我以前搞过一段cad,在计算机图形学里二维直线可以用一个3X3矩阵表示,清华大学出的《计算机图形学》中有专门的讲解。而且好像有现成的算法。效率肯定比楼上诸位的高。
    不过,我有几年没接触过cad了,呵呵具体算法一点都记不住了,参考书也不知丢哪去,sorry
      

  6.   

    我也有条问题
    根据文件score.txt中的学生成绩计算平均成绩,并计算排名,将处理的结果写入文件score_result.txt中,score.txt文件格式如下
    张三 66 78
    李四 99 45
    ………………
    写出程序
    救命的
      

  7.   

    你觉得目前你的方案复杂,就是因为你太拘泥于目前现有的API了,其实仔细想一下,针对某些需求开发的API并不见得适合于其他需求,楞要用这些API解决问题,在某种程度上可以说是“削足适履”,虽然话有点重了个人觉得,对你需要达到的目的,用角度和交点来描述线段,然后对这些角度做排序,应该能比较方便地解决你的要求
      

  8.   

    saucer(思归) 的方法其实效率是很高的,我在他的方法上做一点具体和详细的说明。以下是我提出的步骤,请大家多多指教:
    1.求出每条线的斜率(0-180)、长度,和其中的一个顶点来。(顶点的选择规则如下,选择每条线段右的顶点,如果是垂直就是最下)
    2.对所有线进行分组。(建立一个链表数组,对所有线进行遍历,如果斜率存在于链表数组中,就把这个线挂在后面的链里,如果没有,则插入数组,作为一个头),如下图:斜率1.3>斜率3.1565->斜率0.2345->……
       |         |           |
    线段1       线段2      线段3
       |         |           |
    线段4       线段6      线段5
       |         |           |
                           线段7
    3.对每个链表中的线比较最右下节点,相同的剔除(因为是同一根线)
    4.那么平行线就是斜率相同的线,即在一个链表里的线
    5.求垂直的只要在数组中查找斜率垂直就可以,而且找到就停。(因为垂直线斜率只有一个)
    6.求斜率相同,长度相同的就在链表里查长度,相同就相等啦
    7.查水平与垂直,只要在数组中查斜率也就可以了。最后建议,如果精度高,建议把斜率用分数表示,方法如下:
    一条线段必然有两个顶点,分别记为(a1,b1),(a2,b2)。斜率k=取正{(b1-b2)/(a1-a2)}
    在程序中不要计算出具体的值,只要存好b1-b2和a1-a2就可以了
    具体用这样的表示方法如何判平行与垂直就不用我说了吧?我觉得这样先用斜率分组,可以减少很多不必要的比较次数,楼主说的那种在非平行非垂直线中找的方法有很多很多次的比较都是无谓的,应该尽量减少。
    以上是我的一点看法,希望大家多多指正。
      

  9.   

    谢谢大家,唉,saucer(思归) 说的没错,我调查了一下,不是算法的时间问题,是API的时间超长。