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.
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
}