2d可见性算法在重叠情况下效果不佳

f87krz0w  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(149)

我在一个很棒的网站上找到了可见性算法
由于这是一篇很久以前的文章,我不确定作者是否会给出答案。
如您所见,交互式操场(您自己试试)在右上侧效果不佳,尤其是重叠边。

// Pseudocode of main algorithm
var endpoints;   # list of endpoints, sorted by angle
var open = [];   # list of walls the sweep line intersects

loop over endpoints:
    remember which wall is nearest
    add any walls that BEGIN at this endpoint to 'walls'
    remove any walls that END at this endpoint from 'walls'

    figure out which wall is now nearest
    if the nearest wall changed:
        fill the current triangle and begin a new one

这里也是javascript代码的一部分

// Main algorithm with working Javascript code
export const calculateVisibility = (origin, endpoints) => {
  let openSegments = [];
  let output = [];
  let beginAngle = 0;

  endpoints.sort(endpointCompare);

  for(let pass = 0; pass < 2; pass += 1) {
    for (let i = 0; i < endpoints.length; i += 1) {
      let endpoint = endpoints[i];
      let openSegment = openSegments[0];

      if (endpoint.beginsSegment) {
        let index = 0
        let segment = openSegments[index];
        while (segment && segmentInFrontOf(endpoint.segment, segment, origin)) {
          index += 1;
          segment = openSegments[index]
        }

        if (!segment) {
          openSegments.push(endpoint.segment);
        } else {
          openSegments.splice(index, 0, endpoint.segment);
        }
      } else {
        let index = openSegments.indexOf(endpoint.segment)
        if (index > -1) openSegments.splice(index, 1);
      }

      if (openSegment !== openSegments[0]) {
        if (pass === 1) {
          let trianglePoints = getTrianglePoints(origin, beginAngle, endpoint.angle, openSegment);
          output.push(trianglePoints);
        }
        beginAngle = endpoint.angle;
      }
    }
  }

  return output;
};

在我看来,这是因为算法认为当右边缘是最近的边缘时,它会显示整个部分,尽管它可以隐藏在整个边缘中。
我想我可以修改算法以使用当前最近边和更新的当前最近边,但不确定。。。
我该怎么修?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题