You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
5.7 KiB
167 lines
5.7 KiB
//这里我们尝试生存一个简单的网格。我们只生成一个正方形的网格,即
|
|
//n*n*n的网格
|
|
#pragma once
|
|
#include"../display/getindata.h"
|
|
#include"../geo/geodisplay.h"
|
|
#include"../mesh/AddObj.h"
|
|
#include"../display/ReadandWrite.h"
|
|
#include"../display/Struct3d.h"
|
|
#include"../generate/PlaneRollingBoundary.h"
|
|
|
|
|
|
|
|
class CNTMesh{
|
|
//生成网格
|
|
public:
|
|
Struct3d meshoutput[MESHN][MESHN][MESHN];
|
|
map<double, vector<int>> mesh[MESHN][MESHN][MESHN];
|
|
int startnum[MESHN][MESHN][MESHN];
|
|
void getmesh(){
|
|
Interface meshinput[MESHN][MESHN][MESHN];
|
|
for(int i=0;i<MESHN;i++){
|
|
for(int j=0;j<MESHN;j++){
|
|
for(int k=0;k<MESHN;k++){
|
|
meshinput[i][j][k].r=MESHR;
|
|
meshinput[i][j][k].position=Vector3d(i*LenBetweenCirc,j*LenBetweenCirc,k*LenBetweenCirc);
|
|
//下面是读取文件的dir
|
|
if(i!=0){
|
|
meshinput[i][j][k].dir.push_back(Vector3d(-1,0,0));
|
|
}
|
|
if(i!=MESHN-1){
|
|
meshinput[i][j][k].dir.push_back(Vector3d(1,0,0));
|
|
}
|
|
if(j!=0){
|
|
meshinput[i][j][k].dir.push_back(Vector3d(0,-1,0));
|
|
}
|
|
if(j!=MESHN-1){
|
|
meshinput[i][j][k].dir.push_back(Vector3d(0,1,0));
|
|
}
|
|
if(k!=0){
|
|
meshinput[i][j][k].dir.push_back(Vector3d(0,0,-1));
|
|
}
|
|
if(k!=MESHN-1){
|
|
meshinput[i][j][k].dir.push_back(Vector3d(0,0,1));
|
|
}
|
|
getR(meshinput[i][j][k]);
|
|
meshoutput[i][j][k].fresh(meshinput[i][j][k]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void getmeshresult(print3d& result){
|
|
//加点
|
|
for(int i=0;i<MESHN;i++){
|
|
for(int j=0;j<MESHN;j++){
|
|
for(int k=0;k<MESHN;k++){
|
|
print3d tmp;
|
|
mesh[i][j][k]=CNT::ShowCNT(meshoutput[i][j][k],tmp);
|
|
startnum[i][j][k]=result.p.size();
|
|
addObj(result,tmp);
|
|
}
|
|
}
|
|
}
|
|
//加面
|
|
Vector3d tmpVec(1,0,0);
|
|
for(int i=0;i<MESHN-1;i++){
|
|
for(int j=0;j<MESHN;j++){
|
|
for(int k=0;k<MESHN;k++){
|
|
//一个顺时针一个反过来,连接即可
|
|
connect(mesh[i][j][k][Veckey(tmpVec)],
|
|
mesh[i+1][j][k][Veckey(-tmpVec)],
|
|
result,tmpVec,startnum[i][j][k],startnum[i+1][j][k],
|
|
meshoutput[i][j][k].sphere.center,
|
|
meshoutput[i+1][j][k].sphere.center);
|
|
}
|
|
}
|
|
}
|
|
tmpVec<<0,1,0;
|
|
for(int i=0;i<MESHN;i++){
|
|
for(int j=0;j<MESHN-1;j++){
|
|
for(int k=0;k<MESHN;k++){
|
|
connect(mesh[i][j][k][Veckey(tmpVec)],
|
|
mesh[i][j+1][k][Veckey(-tmpVec)],
|
|
result,tmpVec,startnum[i][j][k],startnum[i][j+1][k],
|
|
meshoutput[i][j][k].sphere.center,
|
|
meshoutput[i][j+1][k].sphere.center);
|
|
}
|
|
}
|
|
}
|
|
tmpVec<<0,0,1;
|
|
for(int i=0;i<MESHN;i++){
|
|
for(int j=0;j<MESHN;j++){
|
|
for(int k=0;k<MESHN-1;k++){
|
|
connect(mesh[i][j][k][Veckey(tmpVec)],
|
|
mesh[i][j][k+1][Veckey(-tmpVec)],
|
|
result,tmpVec,startnum[i][j][k],startnum[i][j][k+1],
|
|
meshoutput[i][j][k].sphere.center,
|
|
meshoutput[i][j][k+1].sphere.center);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void connect(vector<int> x,vector<int> y,print3d& result,Vector3d tmpVec,int m1,int m2,Vector3d xcenter,Vector3d ycenter){
|
|
Matrix<double,1,3> equation(tmpVec);
|
|
FullPivLU<Matrix<double,1,3>> solve(equation);
|
|
auto vertica0=(Matrix<double,3,2>(solve.kernel()).col(0)).normalized();
|
|
auto vertica1=tmpVec.cross(vertica0).normalized();
|
|
double angle,minangle=100;
|
|
int l1,l2;
|
|
for(int i=0;i<x.size();i++){
|
|
x[i]=x[i]+m1;
|
|
}
|
|
for(int i=0;i<y.size();i++){
|
|
y[i]=y[i]+m2;
|
|
}
|
|
Vector3d s;
|
|
for(int i=0;i<x.size();i++){
|
|
s=result.p[x[i]]-xcenter;
|
|
angle=atan2(s.dot(vertica1),s.dot(vertica0));
|
|
if(angle<minangle){
|
|
minangle=angle;
|
|
l1=i;
|
|
}
|
|
}
|
|
minangle=100;
|
|
for(int i=0;i<y.size();i++){
|
|
s=result.p[y[i]]-ycenter;
|
|
angle=atan2(s.dot(vertica1),s.dot(vertica0));
|
|
if(angle<minangle){
|
|
minangle=angle;
|
|
l2=i;
|
|
}
|
|
}
|
|
|
|
int s1=x.size();
|
|
int s2=y.size();
|
|
int i=0;
|
|
int j=0;
|
|
while (i<s1&&j>-s2)
|
|
{
|
|
if(compare(i,s1,-j,s2)){
|
|
i++;
|
|
result.f.push_back(Vector3i(x[getmod(i+l1,s1)],x[getmod(i+l1-1,s1)],y[getmod(l2+j,s2)]));
|
|
}
|
|
else{
|
|
j--;
|
|
result.f.push_back(Vector3i(x[getmod(i+l1,s1)],y[getmod(l2+j,s2)],y[getmod(l2+j+1,s2)]));
|
|
}
|
|
}
|
|
if(j==-s2){
|
|
while (i<s1)
|
|
{
|
|
i++;
|
|
result.f.push_back(Vector3i(x[getmod(i+l1,s1)],x[getmod(i+l1-1,s1)],y[getmod(l2+j,s2)]));
|
|
}
|
|
}
|
|
else{
|
|
while (j>-s2)
|
|
{
|
|
j--;
|
|
result.f.push_back(Vector3i(x[getmod(i+l1,s1)],y[getmod(l2+j,s2)],y[getmod(l2+j+1,s2)]));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
|