当前位置: 首页 > 知识库问答 >
问题:

我有坐标列表,我的要求是安排它

杭令
2023-03-14

我有坐标列表来画线。

实际上,问题是这些坐标不是按顺序排列的。

endpoint坐标是另一条线的起点坐标。如果任何线的endpoint坐标与另一线的起点坐标不匹配,则创建连接线列表。

线的坐标为startx、starty、endx、endy。

以下是线坐标列表。

3350 1500 3200 1500

1450 1750 1450 2200

1450 2200 2100 2200

2400 2200 2550 2200

2550 2200 2550 2350

2550 2350 2850 2350

2850 2350 2850 2700

2850 2700 3350 2700

3650 2700 3750 2700

3750 2700 3750 2600

3750 2600 5250 2600

5250 2600 5250 2350

5250 2350 5000 2350

4700 2350 4350 2350

4350 2350 4350 1600

4350 1600 3650 1600

3650 1600 3650 1500

3200 1500 3200 1750

3200 1750 1450 1750

这里最后两条线的坐标实际上是在第二和第三个位置。

3200 1500 3200 1750

3200 1750 1450 1750

我的要求是创建所有相互连接的线条。

List<DeviceElement> outerListWire= new ArrayList<DeviceElement>(schematicImporter.listOfWires);
List<DeviceElement> innerListWire = new ArrayList<DeviceElement>(schematicImporter.listOfWires);
    List<DeviceElement> listWireTemp = new ArrayList<DeviceElement>();
for (int j = 0; j < outerListWire.size(); j++) {
    Wire wire1 = (Wire) outerListWire.get(j);
    for (int i = 0; i < innerListWire.size(); i++) {
        Wire wire2 = (Wire) innerListWire.get(i);

        if (wire1.getEndPoint().getX() == wire2.getStartPoint().getX() && wire1.getEndPoint().getY() == wire2.getStartPoint().getY() ) {
            if (!listWireTemp.contains(wire1)) {
                listWireTemp.add(wire1);
                System.out
                .println("wire1 = " + wire1.getStartPoint().toString() + " = " + wire1.getEndPoint().toString());
                innerListWire.remove(wire1);
            }

            if (!listWireTemp.contains(wire2)) {
                listWireTemp.add(wire2);
                System.out
                .println("wire2 = " + wire2.getStartPoint().toString() + " = " + wire2.getEndPoint().toString());
                innerListWire.remove(wire2);
            }
        }
    }
}

我已经尝试了上面的代码,但仍然坐标列表没有按顺序进行。

共有1个答案

龚运乾
2023-03-14

根据以下假设进行更新:

  1. 题中给出的第一行坐标表示连线集合中第一行的坐标
  2. 找到第一组连接线后,题目中给出的剩余坐标线的第一条未使用的线将被认为是下一组连接线中第一条线的坐标,依此类推,直到题目中给出的坐标列表穷尽。

所需逻辑位于Main.java中。我还创建了Point。javaLine。java来测试逻辑。如果您遇到任何问题,请随时告诉我。

Point.java

public class Point {
    int x,y;

    public Point(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
    @Override
    public String toString() {
        return "Point [x=" + x + ", y=" + y + "]";
    }   
}

行.java

public class Line {
    int x1,y1,x2,y2;
    Point start,end;
    boolean used;
    public Line(int x1, int y1, int x2, int y2) {
        super();
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
    public Line(Point start, Point end) {
        super();
        this.start = start;
        this.end = end;
    }
    public int getX1() {
        return x1;
    }
    public void setX1(int x1) {
        this.x1 = x1;
    }
    public int getY1() {
        return y1;
    }
    public void setY1(int y1) {
        this.y1 = y1;
    }
    public int getX2() {
        return x2;
    }
    public void setX2(int x2) {
        this.x2 = x2;
    }
    public int getY2() {
        return y2;
    }
    public void setY2(int y2) {
        this.y2 = y2;
    }
    public Point getStart() {
        return start;
    }
    public void setStart(Point start) {
        this.start = start;
    }
    public Point getEnd() {
        return end;
    }
    public void setEnd(Point end) {
        this.end = end;
    }
    public boolean isUsed() {
        return used;
    }
    public void setUsed(boolean used) {
        this.used = used;
    }
    @Override
    public String toString() {
        return "Line [x1=" + x1 + ", y1=" + y1 + ", x2=" + x2 + ", y2=" + y2 + "]";
    }   
}

主要.java

import java.util.ArrayList;
import java.util.List;

class Main {
    public static void main(String args[]) {
        List<Line> givenLines = new ArrayList<Line>();
        givenLines.add(new Line(3350, 1500, 3200, 1500));
        givenLines.add(new Line(1450, 1750, 1450, 2200));
        givenLines.add(new Line(1450, 2200, 2100, 2200));
        givenLines.add(new Line(2400, 2200, 2550, 2200));
        givenLines.add(new Line(2550, 2200, 2550, 2350));
        givenLines.add(new Line(2550, 2350, 2850, 2350));
        givenLines.add(new Line(2850, 2350, 2850, 2700));
        givenLines.add(new Line(2850, 2700, 3350, 2700));
        givenLines.add(new Line(3650, 2700, 3750, 2700));
        givenLines.add(new Line(3750, 2700, 3750, 2600));
        givenLines.add(new Line(3750, 2600, 5250, 2600));
        givenLines.add(new Line(5250, 2600, 5250, 2350));
        givenLines.add(new Line(5250, 2350, 5000, 2350));
        givenLines.add(new Line(4700, 2350, 4350, 2350));
        givenLines.add(new Line(4350, 2350, 4350, 1600));
        givenLines.add(new Line(4350, 1600, 3650, 1600));
        givenLines.add(new Line(3650, 1600, 3650, 1500));
        givenLines.add(new Line(3200, 1500, 3200, 1750));
        givenLines.add(new Line(3200, 1750, 1450, 1750));

        int linesIndex, usedCounter=0;
        List<List<Line>> listOfConnectedLines = new ArrayList<List<Line>>();

        //The start (first) line, in the list of given lines, to be processed to find the first set of connected lines
        Line startLineforTheNextSetOfConnectedLines=givenLines.get(0);
        startLineforTheNextSetOfConnectedLines.setUsed(true);
        usedCounter = 1;        

        //Process the list of given lines until all the lines have been used to form the connected lines
        while (usedCounter < givenLines.size()) {

            linesIndex = 0;         
            List<Line> connectedLines = new ArrayList<Line>();
            connectedLines.add(linesIndex, startLineforTheNextSetOfConnectedLines);     
            Line nextLine=null;

            //Starting with startLineforTheNextSetOfConnectedLines, the variable lastArrangedLine will hold the next lines qualifying to become the connected line 
            Line lastArrangedLine=startLineforTheNextSetOfConnectedLines;

            //Create the list of connected lines starting with startLineforTheNextSetOfConnectedLines
            for (int i = 0; i < givenLines.size(); i++) {
                for (int j = 0; j < givenLines.size(); j++) {
                    nextLine=givenLines.get(j);
                    if (!nextLine.isUsed() && lastArrangedLine.getX2() == nextLine.getX1()
                            && lastArrangedLine.getY2() == nextLine.getY1()) {
                        nextLine.setUsed(true);
                        usedCounter++;
                        connectedLines.add(++linesIndex, nextLine);
                        lastArrangedLine = nextLine;
                        break;
                    }
                }
            }

            //Add the list of connected lines (found from the above nested for loops) to the list of connected lines
            listOfConnectedLines.add(connectedLines);

            //Find the start (first) line for the next set of connected lines
            for (int i = 0; i < givenLines.size(); i++) {
                if(!givenLines.get(i).isUsed()) {
                    startLineforTheNextSetOfConnectedLines=givenLines.get(i);
                    startLineforTheNextSetOfConnectedLines.setUsed(true);
                    usedCounter++;                  
                    break;
                }
            }
        }

        //Display the lists of connected lines
        for(List<Line> connectedLines:listOfConnectedLines)
            System.out.println(connectedLines);
    }
}

给定行列表的输出:

[Line [x1=3350, y1=1500, x2=3200, y2=1500], Line [x1=3200, y1=1500, x2=3200, y2=1750], Line [x1=3200, y1=1750, x2=1450, y2=1750], Line [x1=1450, y1=1750, x2=1450, y2=2200], Line [x1=1450, y1=2200, x2=2100, y2=2200]]
[Line [x1=2400, y1=2200, x2=2550, y2=2200], Line [x1=2550, y1=2200, x2=2550, y2=2350], Line [x1=2550, y1=2350, x2=2850, y2=2350], Line [x1=2850, y1=2350, x2=2850, y2=2700], Line [x1=2850, y1=2700, x2=3350, y2=2700]]
[Line [x1=3650, y1=2700, x2=3750, y2=2700], Line [x1=3750, y1=2700, x2=3750, y2=2600], Line [x1=3750, y1=2600, x2=5250, y2=2600], Line [x1=5250, y1=2600, x2=5250, y2=2350], Line [x1=5250, y1=2350, x2=5000, y2=2350]]
[Line [x1=4700, y1=2350, x2=4350, y2=2350], Line [x1=4350, y1=2350, x2=4350, y2=1600], Line [x1=4350, y1=1600, x2=3650, y2=1600], Line [x1=3650, y1=1600, x2=3650, y2=1500]]
 类似资料:
  • 与你的经验相比,也许你能帮助我。我必须通过此链接进行查询: https://geoservices.meteofrance.fr/inspire/services/MF-NWP-GLOBAL-ARPEGE-05-GLOBE-WMS?request=GetMap 我使用openlayer 3,当我使用此链接的参数进行查询时,我更改了BBOX的坐标:这是我的JS openlayer代码(我使用Qgis

  • 我要啦排名分为五部分:排名趋势图 、 访问量排名(独立IP排名)、 浏览量排名(PV排名)、 平均每个访问者浏览的页数排名 和 参与排名的网站数 1.排名趋势图 1)通过访问量排名(独立IP排名)、浏览量排名(PV排名)的排名趋势图,非常直观地看到网站在我要啦整站的排名情况 2)可单独点击右上角的[IP排名][PV排行]进行隐藏与显示 2.访问量排名(独立IP排名) 以表格的形式,展示昨天、近

  • 问题内容: 我想安排一个在将来的指定时间最多执行一次的工作(通常该时间将是当晚的晚上,几个小时之后)。我想用詹金斯做到这一点。如果詹金斯在这段时间内碰巧倒下了,这份工作就不会被解雇- 很好。 目前,我正计划在启用“定期构建”的情况下进行一项新工作,并将时间表设置为“ 0 19 29 01 *”。 目的是安排作业在1月29日的19:00运行。 缺点是每次执行此操作时,我都必须记住要在明年之前的某个时

  • 我试图为一个棋盘游戏创建一个叫做地形的类,我试图在Java中构建这个类,但是我会试着让这篇文章尽可能通用,这样它就可以用任何OOP语言和伪代码来解释。 这个游戏有36个六边形的瓷砖,每个瓷砖都是不同的地形。地形有8种类型,如沼泽、森林、山脉等。每个地形可以容纳你可以移动的次数,也可以容纳生物和建筑(这是两个不同的类别),或者至少有与特定地形相关的生物和建筑。 我不确定我想要一个枚举来代表8种地形,

  • C++20概念的一个特点是,在某些情况下,您必须编写。例如,[expr.prim.req]/3中的这个示例:

  • 问题内容: 非syscall的包装器,但类似于snprintf(),dprintf() 问题答案: 最后的最新版本 包含感兴趣的列表:signal- safety.7.html