我试图弄清楚两条线是否在平面中交叉。我一直在尝试使用向量的交叉积,但是大量的错误答案。我意识到其中一些原因是没有让所有东西都长,但即便在这种变化之后,我仍然发现了不存在的交叉点。任何人都可以注意到我已经滑倒了。我一直试图找出相当长的一段时间。
我的代码如下:
public static boolean intersecting_segments ( Line_Segment A, Line_Segment B)
{
float side_one;, side_two ,side_three, side_four ;
side_one = cross_product( A, B.p) ;
side_two = cross_product( A, B.q) ;
side_three = cross_product( B, A.p) ;
side_four = cross_product( B, A.q) ;
return ( side_one >0 && side_two <0)|| ( side_one <0 && side_two >0) &&
( side_three >0 && side_four <0)|| ( side_three <0 && side_four >0);
}
public static long cross_product ( Line_Segment S, End_point r )
{
return (long)(((long)r.x -(long)S.p.x)*((long)S.q.y-(long)S.p.y)) -(((long)r.y- (long)S.p.y)*((long)S.q.x-(long)S.p.x));
}
答案 0 :(得分:0)
如果没有看到您的Line_Segment
代码,我无法100%确定这一点,但根据您在此处发布的内容,我猜测x
和y
字段是int
s,您在long
方法中投放到cross_product()
s。
如果是这种情况,那么您在此处的演员表没有按照您的想法行事:例如,如果您创建一个名为Line_Segment
的{{1}} p
值溢出到50(即它比最大整数值多50,这意味着它存储为50),然后x
为50,而你通过将其转换为p.x
所做的只是为了{ {1}} - 它不会“撤消”溢出。
您需要将这些变量的类型更改为long
,以便正确存储,并丢失演员表。 (呃,你在技术上不会失去演员,但他们没有意义)
答案 1 :(得分:0)
你应该让side_XX变量变长,这可能会解决你的问题。如果这些变量必须有小数,请使用double而不是float。
原因是虽然cross_product函数返回long,但是它们被分配给的变量(side_one,side_two等)是浮点数。这将强制从long转换为float,这将失去精度并且对于大数字而言是不准确的。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html