给定 window 框架内的两个点(x0,y0 和 x1,y1)- 您将使用什么方法将一条线延伸到 window 的边缘?
Given two points inside a window frame (x0,y0 and x1,y1) - What method would you used to extend a line to the edges of the window?
为了介绍计算机图形纸,我正在努力将由使用相同梯度的两个点定义的线延伸到 window 的边缘。很难解释,所以这张图片可能会有所帮助。
虚线是直线(x0,y0 to x1,y1)未定义的部分。
我们尝试了一些方法,使用直线的隐式方程 (ax+bx+c = 0) 并找到与 window 框架的所有四个边的交点。
非常感谢任何帮助!
您的第一项工作是检查 (x0, y0)
和 (x1, y1)
是否不同。
非垂直线的隐式方程实际上是y = mx + c
其中梯度m
是(y1 - y0) / (x1 - x0)
,c
是y
轴上的截距,可以通过应用c = y1 - mx1
或c = y0 - mx0
.
找到
获得 m
和 c
的值后,您可以应用线方程在给定 x
点集(或反之亦然),以便将线绘制到所需的长度。
竖线的特点是x0
等于x1
。在这种情况下,您的情节只是一条在 x0
.
处穿过 x
轴的线
另请注意,该线只会截取 2 条边(除非该线与其中一条边共线)。
你可以想出线性方程的范式:
n = (y1-y0, x0-x1)
(n为一点到另一点旋转90°的方向)
直线上点p
的方程:
p * n = (x0, y0) * n
或
(p - (x0, y0)) * n = 0
*
表示上面的标量积,下面没有。
所以要解的方程是
(px - x0) * (y1 - y0) + (py - y0) * (x0 - x1) = 0
所有坐标但px
和py
(点的x和y坐标)给出,px
和py
之一由你想相交的一面。但是,如果您要求解此方程(horizontal/vertical 行),请当心除以 0。
当你有隐式方程时
ax + by + c = 0
和window边坐标Left,Top,Right,Bottom(Left和Top可能为零),然后你可以将这些坐标代入方程并检查计算点是否超过window的边框。
例如,要获得与右边缘的交点,请替换为 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
为了介绍计算机图形纸,我正在努力将由使用相同梯度的两个点定义的线延伸到 window 的边缘。很难解释,所以这张图片可能会有所帮助。
虚线是直线(x0,y0 to x1,y1)未定义的部分。
我们尝试了一些方法,使用直线的隐式方程 (ax+bx+c = 0) 并找到与 window 框架的所有四个边的交点。
非常感谢任何帮助!
您的第一项工作是检查 (x0, y0)
和 (x1, y1)
是否不同。
非垂直线的隐式方程实际上是y = mx + c
其中梯度m
是(y1 - y0) / (x1 - x0)
,c
是y
轴上的截距,可以通过应用c = y1 - mx1
或c = y0 - mx0
.
获得 m
和 c
的值后,您可以应用线方程在给定 x
点集(或反之亦然),以便将线绘制到所需的长度。
竖线的特点是x0
等于x1
。在这种情况下,您的情节只是一条在 x0
.
x
轴的线
另请注意,该线只会截取 2 条边(除非该线与其中一条边共线)。
你可以想出线性方程的范式:
n = (y1-y0, x0-x1)
(n为一点到另一点旋转90°的方向)
直线上点p
的方程:
p * n = (x0, y0) * n
或
(p - (x0, y0)) * n = 0
*
表示上面的标量积,下面没有。
所以要解的方程是
(px - x0) * (y1 - y0) + (py - y0) * (x0 - x1) = 0
所有坐标但px
和py
(点的x和y坐标)给出,px
和py
之一由你想相交的一面。但是,如果您要求解此方程(horizontal/vertical 行),请当心除以 0。
当你有隐式方程时
ax + by + c = 0
和window边坐标Left,Top,Right,Bottom(Left和Top可能为零),然后你可以将这些坐标代入方程并检查计算点是否超过window的边框。
例如,要获得与右边缘的交点,请替换为 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