Eine Linie verkürzen

hk

Bekanntes Mitglied
Hallo Forum,
ich möchte eine Linie deren Anfangs- und Endposition ich kenne in der Länge kürzen. Im folgenden Code habe ich mal ein Beispiel mit einer Verkürzung der Y-Position versucht die neue Anfangsposition zu berechnen. Das klappt leider nicht, weil die neue Anfangsposition nicht auf der Ursprungslinie ist. Vielleicht kann mir wer helfen.
Java:
public class FXMLDocumentController implements Initializable {
 
  @FXML Canvas fx_Canvas;
  @FXML Button fx_Button;
 
  private Point2D.Double start = new Point2D.Double(400, 500);
  private Point2D.Double end = new Point2D.Double(300, 300);
  private double reductionValueY = 50;
 
 
  @FXML private void handleButtonAction(ActionEvent event) {
    GraphicsContext gc = fx_Canvas.getGraphicsContext2D();
    gc.setStroke(Color.BLACK);
    gc.strokeLine(start.x, start.y, end.x, end.y);  //Ursprungslinie
    // Linie verkürzen
    double angle = calculateAngle(start, end);      //Winkel der Linie
    angle = Math.PI  / 180 * angle;                 //Bogenmaß
    double nY = start.y - reductionValueY;
    double nX = nY * Math.tan(angle);
    gc.setStroke(Color.RED);
    gc.strokeLine(nX, nY, end.x, end.y);            //Verkürzte Linie   
  }
 
    /**
   * Mit einer gegebenen Position den Winkel gegen 0/0
   * berechnen
   * @param from
   * @param to
   * @return
   */
  public double calculateAngle(Point2D.Double from, Point2D.Double to) {
    double angle;
    angle = Math.atan(to.y / to.x);
    angle = angle * (360.0 / (2 * Math.PI));
    // Der Winkel wird von 0 - 360 Grad im Uhrzeigersinn berechnet
    // Sind beide Werte positiv muss keine Anpassung erfolgen
    // Sind beide Werte negativ sind sie im 3. Quadrant
    if(to.x < 0 && to.y < 0) angle += 180;
    // Ist X = 0 und Y < 0 kann es nur 270° sein
    else if(to.x == 0 && to.y < 0) angle = 270; //Ausnahme sonst NaN
    // Ist X < 0 ist dies der 2. Quadrant
    else if(to.x < 0) angle += 180;
    // Ist Y < 0 ist dies der 4. Quadrant
    else if(to.y < 0) angle += 360;
    return angle;
  } //end calculateAngle **********************************
 
  @Override
  public void initialize(URL url, ResourceBundle rb) {
    // TODO
  }
 
ich möchte eine Linie deren Anfangs- und Endposition ich kenne in der Länge kürzen.
Wenn A der Anfangspunkt und E der Endpunkt und O der Ursprung ist, dann gilt OA + AE = OE. Um die Länge der Linie zu ändern, musst Du also nur AE mit einem Faktor f multiplizieren, um den neuen Endpunkt E' zu erhalten: OA + f*AE = OE'

Beispiel: A=(400, 500) und E=(300, 300) macht also AE=(-100, -200). Länge um 50 % kürzen, dann ist der neue Endpunkt OE' = (400, 500) + 0,5 * (-100, -200) = (400, 500) + (-50, -100) = (350, 400).
 
Wenn A der Anfangspunkt und E der Endpunkt und O der Ursprung ist, dann gilt OA + AE = OE. Um die Länge der Linie zu ändern, musst Du also nur AE mit einem Faktor f multiplizieren, um den neuen Endpunkt E' zu erhalten: OA + f*AE = OE'

Beispiel: A=(400, 500) und E=(300, 300) macht also AE=(-100, -200). Länge um 50 % kürzen, dann ist der neue Endpunkt OE' = (400, 500) + 0,5 * (-100, -200) = (400, 500) + (-50, -100) = (350, 400).
Danke, ja das funktioniert!
 

Zurück
Oben