⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 orthogonallinelayout.java

📁 OpenJGraph是一个开源的Java库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        new Double( frombounds.getCenterX()).floatValue(),
        new Double( frombounds.getCenterY()).floatValue() );
    Point2D.Float   tocenter = new Point2D.Float(
        new Double( tobounds.getCenterX()).floatValue(),
        new Double( tobounds.getCenterY()).floatValue() );
    Point   fromgridpoint = this.grid.findVisualVertex( vedge.getVisualVertexA());
    Point   togridpoint = this.grid.findVisualVertex( vedge.getVisualVertexB());
    double  fromwidth = frombounds.getWidth();
    double  fromheight = frombounds.getHeight();
    double  towidth = tobounds.getWidth();
    double  toheight = tobounds.getHeight();
    int     fromindex = this.vgraph.getVisualVertices().indexOf( vedge.getVisualVertexA() );
    int     toindex = this.vgraph.getVisualVertices().indexOf( vedge.getVisualVertexB() );
    GeneralPath gPath = vedge.getGeneralPath();

    // Route straight edges first....
    if( fromgridpoint.x == togridpoint.x ) {
      // route upwards
      if( togridpoint.y < fromgridpoint.y ) {
        vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), 0 ));
        vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), toheight ));
        ((List) this.topedges.get( fromindex )).add( vedge );
        ((List) this.bottomedges.get( toindex )).add( vedge );
      }
      // route downwards
      else if( togridpoint.y > fromgridpoint.y ) {
        vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), fromheight) );
        vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), 0) );
        ((List) this.bottomedges.get( fromindex )).add( vedge );
        ((List) this.topedges.get( toindex )).add( vedge );
      }
      gPath.reset();
      gPath.moveTo( fromcenter.x , fromcenter.y  );
      gPath.lineTo( fromcenter.x, tocenter.y );
    }
    else if( togridpoint.y == fromgridpoint.y ) {
      // route to the left
      if( togridpoint.x < fromgridpoint.x ) {
        vedge.setFromPortAssignment( new Point2DDouble( 0, (fromheight / 2) ));
        vedge.setToPortAssignment( new Point2DDouble( towidth, (toheight / 2) ));
        ((List) this.leftedges.get( fromindex )).add( vedge );
        ((List) this.rightedges.get( toindex )).add( vedge );
      }
      // route to the right
      else if( togridpoint.x > fromgridpoint.x ) {
        vedge.setFromPortAssignment( new Point2DDouble( fromwidth, (fromheight / 2) ));
        vedge.setToPortAssignment( new Point2DDouble( 0, (toheight / 2) ));
        ((List) this.rightedges.get( fromindex )).add( vedge );
        ((List) this.leftedges.get( toindex )).add( vedge );
      }
      gPath.reset();
      gPath.moveTo( fromcenter.x , fromcenter.y  );
      gPath.lineTo( tocenter.x, fromcenter.y );
    }

    // Now route free edges
    // tocenter is at the upper-right of fromcenter
    if( togridpoint.x > fromgridpoint.x && togridpoint.y < fromgridpoint.y ) {
      gPath.reset();
      gPath.moveTo( fromcenter.x, fromcenter.y );
      if(
        (fromwidth - ((List) this.topedges.get( fromindex )).size() +
         toheight - ((List) this.leftedges.get( toindex )).size()) >=
        (fromheight - ((List) this.rightedges.get( fromindex )).size() +
         towidth - ((List) this.bottomedges.get( toindex )).size()) ){

        // route vertically (up) then horizontally (right)
        vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), 0 ));
        vedge.setToPortAssignment( new Point2DDouble( 0, (toheight / 2) ));
        ((List) this.topedges.get( fromindex )).add( vedge );
        ((List) this.leftedges.get( toindex )).add( vedge );
        gPath.lineTo( fromcenter.x, tocenter.y );
      }
      else {
        // route horizontally (right) then vertically (up)
        vedge.setFromPortAssignment( new Point2DDouble( fromwidth, (fromheight / 2) ));
        vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), toheight ));
        ((List) this.rightedges.get( fromindex )).add( vedge );
        ((List) this.bottomedges.get( toindex )).add( vedge );
        gPath.lineTo( tocenter.x, fromcenter.y );
      }
      gPath.lineTo( tocenter.x, tocenter.y );
    }
    // tocenter is at the lower-right of fromcenter
    else if( togridpoint.x > fromgridpoint.x && togridpoint.y > fromgridpoint.y ) {
      gPath.reset();
      gPath.moveTo( fromcenter.x, fromcenter.y );
      if(
        (fromwidth - ((List) this.bottomedges.get( fromindex )).size() +
         toheight - ((List) this.leftedges.get( toindex )).size()) >=
        (fromheight - ((List) this.rightedges.get( fromindex )).size() +
         towidth - ((List) this.topedges.get( toindex )).size()) ){

        // route vertically (down) then horizontally (right)
        vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), fromheight ));
        vedge.setToPortAssignment( new Point2DDouble( 0, (toheight / 2) ));
        ((List) this.bottomedges.get( fromindex )).add( vedge );
        ((List) this.leftedges.get( toindex )).add( vedge );
        gPath.lineTo( fromcenter.x, tocenter.y );
      }
      else {
        // route horizontally (right) then vertically (down)
        vedge.setFromPortAssignment( new Point2DDouble( fromwidth, (fromheight / 2) ));
        vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), 0 ));
        ((List) this.rightedges.get( fromindex )).add( vedge );
        ((List) this.topedges.get( toindex )).add( vedge );
        gPath.lineTo( tocenter.x, fromcenter.y );
      }
      gPath.lineTo( tocenter.x, tocenter.y );
    }
    // tocenter is at the lower-left of fromcenter
    else if( togridpoint.x < fromgridpoint.x && togridpoint.y > fromgridpoint.y ) {
      gPath.reset();
      gPath.moveTo( fromcenter.x, fromcenter.y );
      if(
        (fromwidth - ((List) this.bottomedges.get( fromindex )).size() +
         toheight - ((List) this.rightedges.get( toindex )).size()) >=
        (fromheight - ((List) this.leftedges.get( fromindex )).size() +
         towidth - ((List) this.topedges.get( toindex )).size()) ){

        // route vertically (down) then horizontally (left)
        vedge.setFromPortAssignment( new Point2DDouble( (fromwidth / 2), fromheight ));
        vedge.setToPortAssignment( new Point2DDouble( towidth, (toheight / 2) ));
        ((List) this.bottomedges.get( fromindex )).add( vedge );
        ((List) this.rightedges.get( toindex )).add( vedge );
        gPath.lineTo( fromcenter.x, tocenter.y );
      }
      else {
        // route horizontally (left) then vertically (down)
        vedge.setFromPortAssignment( new Point2DDouble( 0, (fromheight / 2) ));
        vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), 0 ) );
        ((List) this.leftedges.get( fromindex )).add( vedge );
        ((List) this.topedges.get( toindex )).add( vedge );
        gPath.lineTo( tocenter.x, fromcenter.y );
      }
      gPath.lineTo( tocenter.x, tocenter.y );
    }
    // tocenter is at the upper-left of fromcenter
    else if( togridpoint.x < fromgridpoint.x && togridpoint.y < fromgridpoint.y ) {
      gPath.reset();
      gPath.moveTo( fromcenter.x, fromcenter.y );
      if(
        (fromwidth - ((List) this.topedges.get( fromindex )).size() +
         toheight - ((List) this.rightedges.get( toindex )).size()) >=
        (fromheight - ((List) this.leftedges.get( fromindex )).size() +
         towidth - ((List) this.bottomedges.get( toindex )).size()) ){

        // route vertically (up) then horizontally (left)
        vedge.setFromPortAssignment( new Point2DDouble( ( fromwidth / 2), 0 ));
        vedge.setToPortAssignment( new Point2DDouble( towidth, (toheight / 2) ));
        ((List) this.topedges.get( fromindex )).add( vedge );
        ((List) this.rightedges.get( toindex )).add( vedge );
        gPath.lineTo( fromcenter.x, tocenter.y );
      }
      else {
        // route horizontally (left) then vertically (up)
        vedge.setFromPortAssignment( new Point2DDouble( 0, (fromheight / 2) ));
        vedge.setToPortAssignment( new Point2DDouble( (towidth / 2), toheight ) );
        ((List) this.leftedges.get( fromindex )).add( vedge );
        ((List) this.bottomedges.get( toindex )).add( vedge );
        gPath.lineTo( tocenter.x, fromcenter.y );
      }
      gPath.lineTo( tocenter.x, tocenter.y );
    }

  }

  /**
   * Assigns ports to all edges. A port being a point along the outside perimeter
   * of a vertex.
   */
  private void portassignment() {
    int i, size = this.vgraph.getVisualVertices().size();

    for( i = 0; i < size; i++ )
      this.portassignment( (VisualVertex) this.vgraph.getVisualVertices().get( i )) ;
  }

  /**
   * Assigns ports to all edge of a vertex.
   *
   * @param vvertx    VisualVertex object whose edges will be assigned ports
   */
  private void portassignment( VisualVertex vvertex ) {
    Point2D   center = new Point2D.Double (vvertex.getBounds2D().getCenterX(), vvertex.getBounds2D().getCenterY());
    int       index = this.vgraph.getVisualVertices().indexOf( vvertex );

    VisualEdge      vedge;
    AffineTransform transform = new AffineTransform();
    Point2DDouble   portpoint = new Point2DDouble();
    Point2DDouble   translatedportpoint = new Point2DDouble();
    double          segment[] = new double[6];
    double          width, height;
    int             i, size;

    // Now give the port assignments
    transform.setToTranslation(
      vvertex.getBounds2D().getMinX() - vvertex.getBounds2D().getCenterX(),
      vvertex.getBounds2D().getMinY() - vvertex.getBounds2D().getCenterY() );
    width = vvertex.getBounds2D().getWidth();
    height = vvertex.getBounds2D().getHeight();

    // Give port assignment for top edges, sorted in clockwise order
    size = ((List) this.topedges.get( index )).size();
    for( i = 0 ; i < size; i++ ) {
      vedge = (VisualEdge) ((List) topedges.get( index )).get( i );
      portpoint.x = ((i+1) * width / (size + 1));
      portpoint.y = 0;
      transform.transform( portpoint, translatedportpoint );
      if( vedge.getVisualVertexA() == vvertex )
        vedge.setFromPortAssignment( translatedportpoint );
      else
        vedge.setToPortAssignment( translatedportpoint );
    }

    // Give port assignment for left edges, sorted on clockwise order
    size = ((List) this.leftedges.get( index )).size();
    for( i = 0 ; i < size; i++ ) {
      vedge = (VisualEdge) ((List) leftedges.get( index )).get( i );
      portpoint.x = 0;
      portpoint.y = ((size - i) * height / (size + 1));
      transform.transform( portpoint, translatedportpoint );
      if( vedge.getVisualVertexA() == vvertex )
        vedge.setFromPortAssignment( translatedportpoint );
      else
        vedge.setToPortAssignment( translatedportpoint );
    }

    // Give port assignment for right edges, sorted on clockwise order
    size = ((List) this.rightedges.get( index )).size();
    for( i = 0 ; i < size; i++ ) {
      vedge = (VisualEdge) ((List) rightedges.get( index )).get( i );
      portpoint.x = width;
      portpoint.y = ((i+1) * height / (size + 1));
      transform.transform( portpoint, translatedportpoint );
      if( vedge.getVisualVertexA() == vvertex )
        vedge.setFromPortAssignment( translatedportpoint );
      else
        vedge.setToPortAssignment( translatedportpoint );
    }

    // Give port assignment for bottom edges, sorted on clockwise order
    size = ((List) this.bottomedges.get( index )).size();
    for( i = 0 ; i < size; i++ ) {
      vedge = (VisualEdge) ((List) bottomedges.get( index )).get( i );
      portpoint.x = ((size - i) * width / (size + 1));
      portpoint.y = height;
      transform.transform( portpoint, translatedportpoint );
      if( vedge.getVisualVertexA() == vvertex )
        vedge.setFromPortAssignment( translatedportpoint );
      else
        vedge.setToPortAssignment( translatedportpoint );
    }
  }

  /**
   * Lays out the graph. The layout is performed in the following steps:
   * generalPosition() and the medianPlacement().
   *
   * @see #drawLayout()
   */
  public void layout(){
    super.layout();
    this.initialized = true;
    this.initGraphLayout();
    this.generalPosition( this.vgraph.getVisualVertices(), this.grid );
    this.medianPlacement();
    this.routeEdges();
    this.portassignment();
    this.drawLayout();
  }

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -