给定窗口框架内的两个点(x0,y0和x1,y1) - 你会用什么方法将一条线延伸到窗口的边缘?

时间:2016-09-08 11:05:40

标签: java math pseudocode

对于计算机图形纸的介绍,我正在努力使用相同的渐变扩展由两个点定义的线到窗口的边缘。这很难解释,所以这个图像可能会有所帮助。

IMG

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

我们尝试使用线的隐式方程(ax + bx + c = 0)并找到与窗框的所有四个边相交的点。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

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

非垂直线的隐式方程实际为y = mx + c,其中渐变 m(y1 - y0) / (x1 - x0)c为拦截在y轴上,可以通过应用c = y1 - mx1c = y0 - mx0找到。

获得mc的值后,您可以应用线方程来查找给定yx点的x0点反之亦然),以便将线条绘制成所需的长度。

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

另请注意,该线只会截取2条边(除非线与其中一条边共线)。

答案 1 :(得分:0)

你可以想出线方程的正常形式:

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

所有协调但是pxpy(点的x和y坐标)被给出,pxpy中的一个由你确定想要相交。但是,如果要解决这个等式(水平/垂直线),请注意0除法。

答案 2 :(得分: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