假设有一条线形成(A)=x1,y1和(B)=x2,y2这条线画在屏幕上,现在我需要这条线到达屏幕的两端。
有没有什么公式可以使直线在保持倾斜角的情况下继续延伸?
我知道JavaFX有很多资源,我接受建议
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class LineContinue extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
BorderPane bp = new BorderPane();
Line line = new Line();
line.setStartX(0);
line.setStartY(150);
line.setEndX(170);
line.setEndY(50);
line.setLayoutX(10);
line.setLayoutY(10);
Pane pane = new Pane();
pane.getChildren().add(line);
line.setLayoutX(100);
line.setLayoutY(200);
Button b = new Button("Extreme Line");
b.setOnAction( (e) -> {
// formula continue line until extreme
});
bp.setCenter(pane);
bp.setBottom(b);
primaryStage.setWidth(600);
primaryStage.setHeight(500);
primaryStage.setScene(new Scene(bp));
primaryStage.setTitle("Extreme Line");
primaryStage.show();
}
}
1条答案
按热度按时间w8biq8rn1#
这基本上是一道数学题。
您需要找到
(x1,y1)
和(x2,y2)
之间的直线与x=0
、y=0
、x=w
、y=h
定义的直线(其中w
和h
是窗口的宽度和高度)的交点。最简单的方法是使用齐次坐标,将点和线表示为3-向量,可以使用
Point3D
类方便地对它们进行建模。齐次坐标的主要优点是它可以以相同的方式处理所有“倾斜”:例如,可以使用二维坐标,即求出
y = mx + c
形式的斜线方程,重新排列求交点等;但这对垂直线不起作用(其中m是无穷大),你可以绕过它,但它会变得有点混乱,而且在数值上条件不太好。在齐次坐标中,将直线
ax + by + c = 0
表示为向量[a b c]'
。您可以通过表示直线的两个向量的叉积来计算两条直线的交点:
考虑点
(X, Y)
位于直线x = X
和y = Y
的交点处;因此,由上式可知,(X, Y)
的齐次坐标为:同样,齐次记法中两点之间的直线由两点的叉积给出
(Don不用担心这些复杂的表达方式:它们很容易打错,我确信我打错了;但是您不必手动实现它们,因为方法存在于
Point3D
类中)。另一件需要注意的重要事情是,您可以缩放齐次坐标,而无需更改点或线。
例如,
[ka kb kc]
与[a b c]
完全相同:所有坐标都乘以相同的因子k
,这使得点/线完全不变。因此,我们可以将斜线表示为
Point3D
:我们可以用方程
x=0
、x=w
、y=0
、y=h
来表示视口的四条边:我们可以找到这些线与斜线的交点
现在你有了4个相同的点,斜线与这些点相交,为了延长斜线使之相交,你需要将它们转换回二维坐标。
请记住,二维点
(x, y)
表示为三维点(x, y, 1)
:我们可以通过将切入点除以它们的z分量来转换切入点:现在,计算出这些点中的哪些位于窗口的可绘制部分:如果
0 <= x <= w
和0 <= y <= h
,则点是可绘制的。您可以选择2个可绘制的点,并在它们之间绘制线。
让我们把所有这些放在一起:
这给了你以下几点:
您需要考虑如何处理非两点情况。