Package lt.refactory.primsAlgo.service.algorithm.models

Examples of lt.refactory.primsAlgo.service.algorithm.models.LinearFunctionParameters


  public static Graph<WeightedEdge> getEquilateralTriangle(Graph<WeightedEdge> triangle) throws AddEdgeException {
   
    // any edge is suitable for equilateral triangle construction - let's take first
    WeightedEdge edge = triangle.getEdgeList().get(0);
   
    LinearFunctionParameters linearParameters = SteinersAlgorithm.getLinearFunctionParameters(edge.getStart(), edge.getEnd());

    // find node which does not belong to edge - another node will have one
    Node oppositeSideNode;
    if (edge.containsNode(triangle.getEdgeList().get(1).getStart())) {
      oppositeSideNode = triangle.getEdgeList().get(1).getEnd();
    } else {
      oppositeSideNode = triangle.getEdgeList().get(1).getStart();
    }
   
    int oppositeSide;
    // special case when we got a vertical line
    if (linearParameters.getDx().compareTo(BigDecimal.ZERO) == 0) {
      oppositeSide = oppositeSideNode.getPointX().compareTo(edge.getStart().getPointX());
    } else {
      // is (k * x + b - y) > 0
      oppositeSide = linearParameters.getK()
          .multiply(oppositeSideNode.getPointX())
          .add(linearParameters.getB())
          .subtract(oppositeSideNode.getPointY())
          .compareTo(BigDecimal.ZERO);
    }
   
    BigDecimal Cos60 = BigDecimal.valueOf(Math.cos(Math.toRadians(60))).round(new MathContext(ROUNDING_PRECISION, ROUNDING_MODE));
    BigDecimal Sin60 = BigDecimal.valueOf(Math.sin(Math.toRadians(60))).round(new MathContext(ROUNDING_PRECISION, ROUNDING_MODE));
   
    // try to turn point clockwise to find coordinates of the third triangle's point
    BigDecimal turnedX = Cos60.multiply(linearParameters.getDx()).subtract(Sin60.multiply(linearParameters.getDy())).add(edge.getStart().getPointX());
    BigDecimal turnedY = Sin60.multiply(linearParameters.getDx()).add(Cos60.multiply(linearParameters.getDy())).add(edge.getStart().getPointY());
   
    // check if points are in different sides
    // special case when line is vertical
    int thirdNodeSide;
    if (linearParameters.getDx().compareTo(BigDecimal.ZERO) == 0) {
      thirdNodeSide = turnedX.compareTo(edge.getStart().getPointX());
    } else {
      thirdNodeSide = linearParameters.getK()
          .multiply(turnedX)
          .add(linearParameters.getB())
          .subtract(turnedY)
          .compareTo(BigDecimal.ZERO);
    }
   
    // if points are in the same side, need to turn to opposite side
    if (oppositeSide == thirdNodeSide) {
      turnedX = Cos60.multiply(linearParameters.getDx()).add(Sin60.multiply(linearParameters.getDy())).add(edge.getStart().getPointX());
      turnedY = Sin60.negate().multiply(linearParameters.getDx()).add(Cos60.multiply(linearParameters.getDy())).add(edge.getStart().getPointY());
    }
   
    Node newNode = new Node(turnedX, turnedY);
   
    Graph<WeightedEdge> equilateralTriangle = new Graph<WeightedEdge>();
View Full Code Here


   
    // find middle-edge edges
    WeightedEdge firstMiddleEdge = getMiddleEdge(firstEdge, secondEdge);
    WeightedEdge secondMiddleEdge = getMiddleEdge(secondEdge, firstEdge);
   
    LinearFunctionParameters firstEdgeParameters = getLinearFunctionParameters(firstMiddleEdge.getStart(), firstMiddleEdge.getEnd());
    LinearFunctionParameters secondEdgeParameters = getLinearFunctionParameters(secondMiddleEdge.getStart(), secondMiddleEdge.getEnd());
   
    BigDecimal centerX = null;
    BigDecimal centerY = null;
   
    // special case when one of the edges is vertical
    if (firstEdgeParameters.getDx().compareTo(BigDecimal.ZERO) == 0) {
     
      centerX = firstMiddleEdge.getStart().getPointX();
      centerY = secondEdgeParameters.getK()
          .multiply(centerX)
          .add(secondEdgeParameters.getB());
     
    } else if (secondEdgeParameters.getDx().compareTo(BigDecimal.ZERO) == 0 ) {
     
      centerX = secondMiddleEdge.getStart().getPointX();
      centerY = firstEdgeParameters.getK()
          .multiply(centerX)
          .add(firstEdgeParameters.getB());
    } else {
      // x = (b2 - b1) / ( k1 - k2 )
      centerX = secondEdgeParameters.getB()
          .subtract(firstEdgeParameters.getB())
          .divide(firstEdgeParameters.getK()
          .subtract(secondEdgeParameters.getK()), new MathContext(DIVISION_PRECISION, ROUNDING_MODE));
     
      // y = k * x - b
      centerY = firstEdgeParameters.getK()
          .multiply(centerX)
          .add(firstEdgeParameters.getB());
View Full Code Here

  }
 
  public static LinearFunctionParameters getLinearFunctionParameters(Node startNode, Node endNode) {
   
    // find edge linear function y = k * x + b
    LinearFunctionParameters result = new LinearFunctionParameters();
   
    // dy = y2 - y1
    result.setDy(endNode.getPointY().subtract(startNode.getPointY()));
    // dx = x2 - x1
    result.setDx(endNode.getPointX().subtract(startNode.getPointX()));
   
    // if line is not vertical (vertical line cannot be expressed with linear function)
    if (result.getDx().compareTo(BigDecimal.ZERO) != 0) {
      // k = dy / dx
      result.setK(result.getDy().divide(result.getDx(), DIVISION_PRECISION, RoundingMode.FLOOR));
      // b = y1 - k * x1
      result.setB(startNode.getPointY().subtract(startNode.getPointX().multiply(result.getK())));
    }
   
    return result;
  }
View Full Code Here

    return new WeightedEdge(resultEdge, weight);
  }
 
  public static Node getSteinersPoint(WeightedEdge edge, Circle circle) {
   
    LinearFunctionParameters edgeParameters = getLinearFunctionParameters(edge.getStart(), edge.getEnd());
   
    // find quadratic function parameters:
    // a = k * k + 1
    BigDecimal a = edgeParameters.getK().pow(2).add(BigDecimal.ONE);
    // b = 2 * (k * (z - b) - a) // here z = b from edgeParameters
    BigDecimal b = edgeParameters.getK()
        .multiply(edgeParameters.getB().subtract(circle.getCenterPoint().getPointY()))
        .subtract(circle.getCenterPoint().getPointX())
        .multiply(BigDecimal.valueOf(2));
    // c = a * a - r * r + (z - b)(z - b)
    BigDecimal c = circle.getCenterPoint().getPointX().pow(2)
        .subtract(circle.getRadius().pow(2))
        .add(
            edgeParameters.getB()
            .subtract(circle.getCenterPoint().getPointY())
            .pow(2));
   
    // discriminant D = b * b - 4 * a * c
    BigDecimal D = b.multiply(b)
        .subtract(BigDecimal.valueOf(4).multiply(a).multiply(c));
       
    if (D.doubleValue() < 0){
      return null;
    }
   
    // find result points
    BigDecimal x1 = b.negate()
        .subtract(BigDecimal.valueOf(Math.sqrt(D.doubleValue())), new MathContext(DIVISION_PRECISION, ROUNDING_MODE))
        .divide(a.multiply(BigDecimal.valueOf(2)), DIVISION_PRECISION, ROUNDING_MODE);
   
    BigDecimal x2 = b.negate()
        .add(BigDecimal.valueOf(Math.sqrt(D.doubleValue())))
        .divide(a.multiply(BigDecimal.valueOf(2)), DIVISION_PRECISION, ROUNDING_MODE);
       
    BigDecimal y1 = edgeParameters.getK()
        .multiply(x1)
        .add(edgeParameters.getB());
   
    BigDecimal y2 = edgeParameters.getK()
        .multiply(x2)
        .add(edgeParameters.getB());
   
    Node firstPoint = new Node(x1, y1, NodeType.STEINER);
    Node secondPoint = new Node(x2, y2, NodeType.STEINER);
   
    BigDecimal startComparer = firstPoint.getPointX().subtract(edge.getStart().getPointX()).abs();
View Full Code Here

TOP

Related Classes of lt.refactory.primsAlgo.service.algorithm.models.LinearFunctionParameters

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.