我可以很容易地计算两条线的交点。如果我从两个顶点开始:
(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.并且所有内容都是无符号的。
答案 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