仅使用整数计算两条线的交点

时间:2014-01-20 00:10:15

标签: c++ integer line-intersection

我可以很容易地计算两条线的交点。如果我从两个顶点开始:

(x1,y1)
(x2,y2)

我可以通过(y1-y2)/(x1-x2)计算斜率,然后计算截距

y1 - slope * x1

然后再做一次,所以我必须设置斜率和截距,然后才这样做:

x = (intercept2 - intercept1) / (slope1 - slope2)
y = slope1 * x + intercept1
(免责声明:这可能不起作用,但我已经得到了一些非常接近它的东西,并且它说明了我的一般技术)

仅适用于带小数的数据类型或非整数。假设顶点是:

(0,1)
(10,2)

计算斜率会产生(1-2)/(0-10)-1/-10不是1/10,而是0

如何才能获得仅使用整数产生有效结果的代码?

编辑:我不能使用浮动全部!。没有铸造,没有任何东西。此外,值的上限为65535.并且所有内容都是无符号的。

5 个答案:

答案 0 :(得分:2)

在高中时减去分数,我们的老师教我们找一个共同的分母

所以1/4 - 1/6 = 3/12 - 2/12 = 1/12

对你的斜坡做同样的事情。

int slope1 = n1 / d1;  // numerator / denominator
int slope2 = n2 / d2;
// All divisions below should have 0 for remainder
int g = gcd( d1, d2 ); // gcd( 4, 6 ) = 2
int d = d1 * d2 / g; // common denominator (12 above)
int n = (d/d1) * n1 - (d/d2) * n2; // (1 in 1/12 above)
// n1/d1 - n2/d2 == n/d

我希望我做得对。

答案 1 :(得分:1)

Graphics Gems II中的全整数行相交代码:https://webdocs.cs.ualberta.ca/~graphics/books/GraphicsGems/gemsii/xlines.c-不使用除法,仅乘法。

答案 2 :(得分:0)

嗯...... (0,1)
(10,2)
和(y1-y2)/(x1-x2)。嗯,这是一行的描述,而不是两行的交集 据我记得,行以x * v的形式描述,x是skalar,v是矢量。那就是了 x *(0,1)= v2和
x *(10,2)= v2。
因此,如果两个等式只存在一个解,那么这些线只相交;当存在不确定数的解时重叠,而当它们平行时不相交。
http://www.gamedev.net/topic/647810-intersection-point-of-two-vectors/
解释了基于点积的计算。

答案 3 :(得分:0)

输入:行L通过(x1, y1)(x2, y2),行M通过(X1, Y1)(X2, Y2)

输出:两条线L和M

的交叉点的(x, y)

告诉Wolfram Alpha solve y = (y1-y2)/(x1-x2)*(x-x1)+y1 and y = (Y1-Y2)/(X1-X2)*(x-X1)+Y1 for x, y以获得此解决方案:

但是我不知道如何编写一个程序来实现上述解决方案只适用于uint16_t ALU的计算器。

答案 4 :(得分:0)

感谢Graham Toal的回答,以下是其答案中链接的C代码的原始Rust实现,对其进行了修改以返回完整线(而不是线段)的交点。它并没有使用太多Rust特有的魔法,因此应该相当容易移植到其他语言。

该函数返回一个Point所在的Line相交的地方,以及一个表示相交点是否位于两条相交的直线(true)上的标志({ {1}}。

false