📄 interpolate.h
字号:
#include <osg/Vec3>
//#include "KDTree.h"
class Interpolate
{
osg::Vec3 a;
osg::Vec3 b;
osg::Vec3 c;
osg::Vec3 temp_a;
osg::Vec3 temp_b;
osg::Vec3 temp_c;
osg::Vec3 temp_d;
osg::Vec3 m,n;
KDTree kdtree;
int z;
int i,j;
int kkk;
osg::Vec3Array* vec;
kdt p;
public:
Interpolate(){vec=new osg::Vec3Array;kkk=0;}
void inter(osg::Vec3Array* extracted_verts,osg::Vec3Array* extracted_normal,osg::Vec3Array* temp,kdt t);
osg::Vec3Array* otherPoint(){return vec;}
};
void Interpolate::inter(osg::Vec3Array *extracted_verts, osg::Vec3Array *extracted_normal, osg::Vec3Array *temp,kdt t)
{
for(i=0;i<temp->size();i++)
{ temp_a=temp->at(i);
// temp_a._v[2]=0;
//std::cout<<"点"<<temp_2->at(i)._v[0]<<","<<temp_2->at(i)._v[1]<<std::endl;
z=extracted_verts->size();
for(j=0;j<z;j=j+3)
{
if(kdtree.SearchKDT(t,temp_a._v[0],temp_a._v[1],0,NULL,&p))
break;
else
{
temp_b=extracted_verts->at(j);
// temp_b._v[2]=0;
temp_c=extracted_verts->at(j+1);
//temp_c._v[2]=0;
temp_d=extracted_verts->at(j+2);
//temp_d._v[2]=0;
a=(temp_b-temp_a)^(temp_c-temp_a);
b=(temp_c-temp_a)^(temp_d-temp_a);
c=(temp_d-temp_a)^(temp_b-temp_a);
if((a._v[2]>0&&b._v[2]>0&&c._v[2]>0)||(a._v[2]<0&&b._v[2]<0&&c._v[2]<0))
{
//std::cout<<"点"<<temp_2->at(i)._v[0]<<","<<temp_2->at(i)._v[1]<<"在第"<<j<<"个三角形内"<<std::endl;
m=extracted_normal->at(j);
n=(temp_b-temp_c)^(temp_c-temp_d);
if(n._v[2]!=0)
{
temp_a._v[2]=-(n._v[0]*temp_a._v[0]+n._v[1]*temp_a._v[1]-(n._v[0]*temp_b._v[0]+n._v[1]*temp_b._v[1]+n._v[2]*temp_b._v[2]))/n._v[2];
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+6,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+7,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+8,temp_a);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
extracted_normal->insert(extracted_normal->begin()+j+6,m);
extracted_normal->insert(extracted_normal->begin()+j+7,m);
extracted_normal->insert(extracted_normal->begin()+j+8,m);
}
else
{
temp_a._v[2]=(temp_b._v[2]+temp_c._v[2]+temp_d._v[2])/3;
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+6,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+7,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+8,temp_a);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
extracted_normal->insert(extracted_normal->begin()+j+6,m);
extracted_normal->insert(extracted_normal->begin()+j+7,m);
extracted_normal->insert(extracted_normal->begin()+j+8,m);
}
break;
}
else if(a._v[2]==0&&((temp_b-temp_a)._v[0]*(temp_c-temp_a)._v[0]+(temp_b-temp_a)._v[1]*(temp_c-temp_a)._v[1])<0)
{
//std::cout<<"该点在j和j+1的直线上"<<std::endl;
m=extracted_normal->at(j);
n=(temp_b-temp_c)^(temp_c-temp_d);
if(n._v[2]!=0)
{
temp_a._v[2]=-(n._v[0]*temp_a._v[0]+n._v[1]*temp_a._v[1]-(n._v[0]*temp_b._v[0]+n._v[1]*temp_b._v[1]+n._v[2]*temp_b._v[2]))/n._v[2];
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_d);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
}
else
{
temp_a._v[2]=(temp_b._v[2]+temp_c._v[2]+temp_d._v[2])/3;
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_d);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
}
break;
}
else if(b._v[2]==0&&((temp_c-temp_a)._v[0]*(temp_d-temp_a)._v[0]+(temp_c-temp_a)._v[1]*(temp_d-temp_a)._v[1])<0)
{
//std::cout<<"该点在j+1和j+2的直线上"<<std::endl;
m=extracted_normal->at(j);
n=(temp_b-temp_c)^(temp_c-temp_d);
if(n._v[2]!=0)
{
temp_a._v[2]=-(n._v[0]*temp_a._v[0]+n._v[1]*temp_a._v[1]-(n._v[0]*temp_b._v[0]+n._v[1]*temp_b._v[1]+n._v[2]*temp_b._v[2]))/n._v[2];
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_d);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
}
else
{
temp_a._v[2]=(temp_b._v[2]+temp_c._v[2]+temp_d._v[2])/3;
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_d);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
}
break;
}
else if(c._v[2]==0&&((temp_d-temp_a)._v[0]*(temp_b-temp_a)._v[0]+(temp_d-temp_a)._v[1]*(temp_b-temp_a)._v[1])<0)
{
//std::cout<<"该点在j+2和j的直线上"<<std::endl;
m=extracted_normal->at(j);
n=(temp_b-temp_c)^(temp_c-temp_d);
if(n._v[2]!=0)
{
temp_a._v[2]=-(n._v[0]*temp_a._v[0]+n._v[1]*temp_a._v[1]-(n._v[0]*temp_b._v[0]+n._v[1]*temp_b._v[1]+n._v[2]*temp_b._v[2]))/n._v[2];
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_a);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
}
else
{
temp_a._v[2]=(temp_b._v[2]+temp_c._v[2]+temp_d._v[2])/3;
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_a);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,m);
extracted_normal->insert(extracted_normal->begin()+j+1,m);
extracted_normal->insert(extracted_normal->begin()+j+2,m);
extracted_normal->insert(extracted_normal->begin()+j+3,m);
extracted_normal->insert(extracted_normal->begin()+j+4,m);
extracted_normal->insert(extracted_normal->begin()+j+5,m);
}
break;
}
}
}
if(j>=extracted_verts->size())
vec->push_back(temp_a);
//vec->insert(vec->end(),temp_a);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -