Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将多边形与矩形相交并创建线(剖切)_Java_3d_Polygon_Intersect - Fatal编程技术网

Java 将多边形与矩形相交并创建线(剖切)

Java 将多边形与矩形相交并创建线(剖切),java,3d,polygon,intersect,Java,3d,Polygon,Intersect,我需要一个算法将(可能是非凸的)多边形与矩形相交。矩形将平行于xy平面,但多边形可以是任何方向 此外,我不仅需要一个真/假结果,还需要多边形与矩形相交的精确点,这样我就可以在多边形与矩形重叠的地方画线。对于非凸多边形,这可能导致两条或多条相交线 这将适用于剖切模块,该模块可以剖切一组多边形,并在形状与z值指定的“平面”相交的位置创建二维“剖切” 我是用Java开发的,所以如果Java3(2)D有任何内置的方法可以提供帮助,那将是非常理想的 如有任何正确方向的帮助/指示,将不胜感激 这是一张照片。

我需要一个算法将(可能是非凸的)多边形与矩形相交。矩形将平行于xy平面,但多边形可以是任何方向

此外,我不仅需要一个真/假结果,还需要多边形与矩形相交的精确点,这样我就可以在多边形与矩形重叠的地方画线。对于非凸多边形,这可能导致两条或多条相交线

这将适用于剖切模块,该模块可以剖切一组多边形,并在形状与z值指定的“平面”相交的位置创建二维“剖切”

我是用Java开发的,所以如果Java3(2)D有任何内置的方法可以提供帮助,那将是非常理想的

如有任何正确方向的帮助/指示,将不胜感激

这是一张照片。。。我想要红线作为交叉点的结果:

对于任意多边形,这应该可以找到所有相交线段

将多边形视为边AB、BC、CD等的有序集合,其中从每条边的第一点到第二点的“方向”为“顺时针”。也就是说,如果我们看A点,顺时针移动时,B点是下一个点

该方法是找到与平面相交的多边形的边,然后找到下一段(顺时针移动)与平面的原始边相交。这些线段与平面相交的两点构成相交线段的端点。重复此操作,直到检查完多边形的所有边

请注意,如果多边形为凹形,则并非所有线段都必须位于多边形内


此算法值得您为此付出代价。:-)

你有什么反对的,有些琐碎的事情,相交的每一条线段的多边形和连接点?这就是我想象的解决方案。Java3D可以将线段与多边形相交并返回交点吗?我必须小心非凸多边形相交两次,但我认为只要我能得到交点,我就能处理……我不知道Java3D,快速搜索发现:
   let P be any point on the polygon.

   TOP:
   while (P has not been checked)

       mark P as having been checked.

       let f be the point following P, clockwise.

       if (P and f are on opposite sides of the plane) then

          Continuing from f clockwise, find the next point Y that is on
              the same side of the plane as P.
          Let z be the point counter-clockwise from Y.
              (note - Sometimes z and f are the same point.)

          let S1 be the point where P,f intersects the plane
          let S2 be the point where Y,z intersects the plane

          if (segment (S1,S2) is inside the polygon)
              add (S1,S2) to a 'valid' list.
              let P = Y
          else
              let P = f
          endif    
       else
          let P = f
       endif
   endwhile