java - 如果两条线使用叉积相交

标签 java vector

我试图弄清楚两条线是否在平面上相交。我一直在尝试使用 vector 的叉积,但在大量数据时得到了错误的答案。我意识到其中一些原因是因为没有那么长时间拥有一切,但即使在这种变化之后,我仍然发现不存在的交叉点。谁能注意到我是否犯了错误。我已经尝试弄清楚很长一段时间了。

我的代码如下:

 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));
     }   

最佳答案

您也应该将 side_XX 变量设置得很长,这可能会解决您的问题。如果这些变量必须有小数,请使用 double 而不是 float 。

原因是虽然 cross_product 函数返回一个 long,但它们分配给的变量(side_one、side_two 等)是 float 。这将强制从 long 转换为 float,这会损失精度并且对于大数来说不准确。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

关于java - 如果两条线使用叉积相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415667/

相关文章:

java - Android TV 按钮不显示聚焦的可绘制对象

java - URL.getContent 编码错误

java - 异常已在此编译单元中定义 import java.lang.Exception;

c++ - boost中的POD低维 vector

C++:偏移到 std::vector 迭代器的正确转换是什么?

java - 从父 Path 实例创建子 NIO.2 Path

java - 如何让多个键绑定(bind)同时工作?

C++ vector 迭代器 nth_element 编译错误

c - 使用scanf的 vector 输入(C语言)

c++ - 开始前缺少模板参数