Java 给定窗框内的两个点(x0、y0和x1、y1)-您将使用什么方法将线延伸到窗框边缘?

Java 给定窗框内的两个点(x0、y0和x1、y1)-您将使用什么方法将线延伸到窗框边缘?,java,math,pseudocode,Java,Math,Pseudocode,作为一篇介绍计算机图形学的论文,我正在努力将由两个使用相同渐变的点定义的线延伸到窗口的边缘。这很难解释,所以这张图片可能会有所帮助 虚线是线(x0,y0至x1,y1)未定义的部分 我们已经尝试了一些方法,使用一条直线的隐式方程(ax+bx+c=0),并找到一个和窗框的所有四条边相交的点 非常感谢您的帮助 您的第一项工作是检查(x0,y0)和(x1,y1)是不同的点 非垂直线的隐式方程实际上是y=mx+c,其中梯度m是(y1-y0)/(x1-x0),而c是对y轴的截取,可以通过应用c=y1-mx

作为一篇介绍计算机图形学的论文,我正在努力将由两个使用相同渐变的点定义的线延伸到窗口的边缘。这很难解释,所以这张图片可能会有所帮助

虚线是线(x0,y0至x1,y1)未定义的部分

我们已经尝试了一些方法,使用一条直线的隐式方程(ax+bx+c=0),并找到一个和窗框的所有四条边相交的点


非常感谢您的帮助

您的第一项工作是检查
(x0,y0)
(x1,y1)
是不同的点

非垂直线的隐式方程实际上是
y=mx+c
,其中梯度
m
(y1-y0)/(x1-x0)
,而
c
是对
y
轴的截取,可以通过应用
c=y1-mx1
c=y0-mx0
找到

一旦获得了
m
c
的值,就可以应用直线方程,在给定
x
点集的情况下找到
y
点(反之亦然),以便将直线绘制到所需的长度

垂直线的特征是
x0
等于
x1
。在这种情况下,绘图只是一条在
x0
处穿过
x
轴的直线


还要注意的是,直线将只截取两条边(除非直线与其中一条边共线)。

您可以得出直线方程的标准形式:

n = (y1-y0, x0-x1)
(n是从一点到另一点旋转90°的方向)

线上点
p
的方程式:

p * n = (x0, y0) * n

*
表示上面而不是下面的标量积

所以要求解的方程是

(px - x0) * (y1 - y0) + (py - y0) * (x0 - x1) = 0

除了
px
py
(点的x和y坐标)之外,所有坐标都已给出,并且
px
py
中的一个由要相交的一侧确定。但是,如果你要解这个方程(水平线/垂直线),要小心除以0。

当你有隐式方程时

ax + by + c = 0
窗口边的坐标为左、上、右、下(左、上可能为零),然后可以将这些坐标代入公式中,并检查计算点是否未超出窗口边界

例如,要获得与右边缘的交点,请替换
right
x坐标

a * Right + b * y + c = 0
if b = 0 then
   no intersection (vertical)  
else
   y =  (a * Right + c ) / b    
check whether Top <= y <= Bottom
a*右+b*y+c=0
如果b=0,则
无交叉口(垂直)
其他的
y=(a*右+c)/b

检查结果垂直线(即
x0=x1
)的共线情况是否必须以特殊(但非常简单)的方式处理。否则,您将面临零除异常。对于水平共线,只需
m=0
。在编写注释时添加此项;-)抱歉,我们的讲稿上说ax+by+c是一行的隐含等式。我们的问题是我们需要处理垂直线,因此使用这个方程。我明白了,对不起。当我回忆起几年前我在这方面的挣扎时,我突然想到了这一点@阿纳拉米尔:这是一个可怕的方式来指定一个直线方程,自然。如果你按我的方法做,梯度下降会更简单。
a * Right + b * y + c = 0
if b = 0 then
   no intersection (vertical)  
else
   y =  (a * Right + c ) / b    
check whether Top <= y <= Bottom