⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interpolate.h

📁 处理网格数据点的KDTREE数据结构程序
💻 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 + -