微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

行进立方体 - 网格中的孔

如何解决行进立方体 - 网格中的孔

我正在从事计算图形的大学项目,我已经按照 http://paulbourke.net/geometry/polygonise/ 的指导方针实现了行进立方体算法。 当我在没有线性插值的情况下测试算法时,我得到一个没有孔的等值面,当我对边缘使用插值时,我在等值面上有一些孔,例如:

这里是线性插值的代码

public PVector LinearInterp(PVector p1,PVector p2,int valp1,int valp2)
{
  
   double mu;
   PVector p= new PVector();
 
  if(compare(p2,p1))
   {
     PVector temp;
     temp=p1;
     p1=p2;
     p2=temp;
   
   }
   if(abs(valp1-valp2)>0.00001)
   {
      p.x=p1.x+((p2.x-p1.x)/(valp2-valp1)*(isovalue-valp1));
      p.y=p1.y+((p2.y-p1.y)/(valp2-valp1)*(isovalue-valp1));
      p.z=p1.z+((p2.z-p1.z)/(valp2-valp1)*(isovalue-valp1));
   }
   else 
     p=p1;
    return p;
}
 

public boolean compare(PVector p1,PVector p2)
{ // p1 < p
  if(p1.x<p2.x)
  return true;
  else if(p1.x > p2.x)
  return false;
   
  if(p1.y<p2.y)
  return true;
  else if(p1.y > p2.y)
  return false;
   
  if(p1.x<p2.x)
  return true;
  else if(p1.z > p2.z)
  return false;
 
  return false;
}

解决方案: 问题是计算插值点的函数,这里是正确的函数

 public PVector LinearInterp(PVector p1,int valp2)
        {
          
            PVector p= new PVector();
            p.x = p1.x;
            p.y = p1.y;
            p.z = p1.z;
            float val=0;
            if(p1.x != p2.x)
            {
              val = p2.x + (p1.x - p2.x) * (isovalue-valp2)/(valp1-valp2);
              p.x=val;
            }else if(p1.y!=p2.y)
            {
                val = p2.y + (p1.y-p2.y)*(isovalue-valp2)/(valp1-valp2);
                p.y=val;
            }
            else
            {
                val=p2.z+(p1.z-p2.z)*(isovalue-valp2)/(valp1-valp2);
                p.z=val;
            }
            return p;
      }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。