#include "ProceduralMesh.h"
#include "GetField.h"
bool shixu = true;
TArray<FVector> liangpeng::MoveLost(TArray<FVector> dian)
{
TArray<FVector> ddian;
ddian.Empty();
for (int i = 0; i < dian.Num() - 1; i++)
{
ddian.Add(dian[i]);
}
return ddian;
}
TArray<liangpeng::point3d> liangpeng::guodu(TArray<FVector> dian)
{
liangpeng::point3d a;
TArray<liangpeng::point3d> mmm;
mmm.Empty();
for (int i = 0; i < dian.Num(); i++)
{
a.index = i;
a.p = dian[i];
mmm.Add(a);
}
return mmm;
}
TArray<liangpeng::point> liangpeng::aotudian(TArray<liangpeng::point3d> dian)//3d数组输入转为2d数组,并判断每个点在多边形中的凹凸性
{
TArray <liangpeng::point> DIN;
DIN.Empty();
liangpeng::point P;
FVector2D m;
FVector b, c, Q; //Q的作用主要是确定多边形时针顺序
bool aotu = true;
float k;
if (dian.Num() < 3)
{
return DIN;
}
int id = 0; FVector a = dian[0].p;
for (int i = 0; i < dian.Num() - 1; i++)//找出x最小点的index;
{
if (a.X >= dian[i + 1].p.X)
{
a = dian[i + 1].p;
id = i + 1;
}
}
if (id == 0)
{
a = dian[dian.Num() - 1].p - dian[id].p;
b = dian[1].p - dian[id].p;
Q = a.operator^(b); //Q的作用主要是确定多边形时针顺序
}
if (id == dian.Num() - 1)
{
a = dian[id - 1].p - dian[id].p;
b = dian[0].p - dian[id].p;
Q = a.operator^(b);
}
if (id != 0 && id != dian.Num() - 1)
{
a = dian[id - 1].p - dian[id].p;
b = dian[id + 1].p - dian[id].p;
Q = a.operator^(b);
}
if (Q.Z < 0)
{
shixu = true; //确定多边形方向,顺时针为true。
}
else
{
shixu = false;
}
for (int i = 0; i < dian.Num(); i++)
{
m.X = dian[i].p.X;
m.Y = dian[i].p.Y;
if (i == 0)
{
a = dian[dian.Num() - 1].p - dian[0].p;
b = dian[i + 1].p - dian[0].p;
c = a.operator^(b);
k = c.Z*Q.Z;
if (k > 0) aotu = true;
else aotu = false;
}
if (i == dian.Num() - 1)
{
a = dian[i - 1].p - dian[i].p;
b = dian[0].p - dian[i].p;
c = a.operator^(b);
k = c.Z*Q.Z;
if (k > 0) aotu = true;
else aotu = false;
}
if (i != 0 && i != dian.Num() - 1)
{
a = dian[i - 1].p - dian[i].p;
b = dian[i + 1].p - dian[i].p;
c = a.operator^(b);
k = c.Z*Q.Z;
if (k > 0) aotu = true;
else aotu = false;
}
P.p = m;
P.index = dian[i].index;
P.aotu = aotu;
DIN.Add(P);
}
return DIN;
}
bool liangpeng::isout(FVector2D a, FVector2D b, FVector2D c, FVector2D d)//判断d点是否在三角形abc内部
{
float du, du1, du2, du3;
bool out = false;
FVector2D A, B, C;
A = a - d;
B = b - d;
C = c - d;
if (A.Size() + C.Size() == (a - c).Size())
{
return out = false;
}
du1 = (A.operator|(B)) / ((A.Size())*(B.Size())); //余弦值
du1 = acos(du1); //反三角求角度
du2 = (B.operator|(C)) / ((B.Size())*(C.Size())); //余弦值
du2 = acos(du2); //反三角求角度
du3 = (C.operator|(A)) / ((C.Size())*(A.Size())); //余弦值
du3 = acos(du3);
du = du1 + du2 + du3 - 6.2831852;
if (-0.01 < du&&du < 0.01)
{
return out = false;
}
else
{
return out = true;
}
//return out;
}
TArray<liangpeng::face> liangpeng::Triange(TArray<liangpeng::point> ddian) //三角形数组
{
TArray<liangpeng::face> triange;
TArray<liangpeng::point> b;
triange.Empty();
b.Empty();
liangpeng::face sanjiao;
if (ddian.Num()<3) return triange;
for (int i = 0; i < ddian.Num(); i++)
{
if (ddian.Num() == 3)
{
sanjiao.index = 0;
sanjiao.O = ddian[2].index;
sanjiao.P = ddian[0].index;
sanjiao.Q = ddian[1].index;
sanjiao.R = ddian;
}
if (i == 0)
{
sanjiao.index = i;
sanjiao.O = ddian[ddian.Num() - 1].index;
sanjiao.P = ddian[i].index;
sanjiao.Q = ddian[i + 1].index;
b = ddian;
b.RemoveAt(0);
b.RemoveAt(0);
b.RemoveAt(b.Num() - 1);
sanjiao.R = b;
}
if (i == ddian.Num() - 1)
{
sanjiao.index = i;
sanjiao.O = ddian[i - 1].index;
sanjiao.P = ddian[i].index;
sanjiao.Q = ddian[0].index;
b = ddian;
b.RemoveAt(i);
b.RemoveAt(i - 1);
b.RemoveAt(0);
sanjiao.R = b;
}
if (i != 0 && i != ddian.Num() - 1)
{
sanjiao.index = i;
sanjiao.O = ddian[i - 1].index;
sanjiao.P = ddian[i].index;
sanjiao.Q = ddian[i + 1].index;
b = ddian;
b.RemoveAt(i - 1);
b.RemoveAt(i - 1);
b.RemoveAt(i - 1);
sanjiao.R = b;
}
triange.Add(sanjiao);
}
return triange;
}
TArray<FVector2D> liangpeng::threeto(TArray<FVector> dian)
{
TArray<FVector2D> ddian;
ddian.Empty();
FVector2D m;
for (int i = 0; i < dian.Num(); i++)
{
m.X = dian[i].X;
m.Y = dian[i].Y;
ddian.Add(m);
}
return ddian;
}
TArray<liangpeng::point3d> liangpeng::movepoint(TArray<liangpeng::point3d> dian)
{
TArray<liangpeng::point3d> diandian;
diandian.Empty();
FVector a, b, c, M, N;
FVector HH;
HH.X = 0; HH.Y = 0; HH.Z = 0;
//float j=3.1415926,k=5.326987;
for (int i = 0; i < dian.Num(); i++)
{
if (i != 0 && i != dian.Num() - 1)
{
a = dian[i - 1].p;
b = dian[i].p;
c = dian[i + 1].p;
}
if (i == 0)
{
a = dian[dian.Num() - 1].p;
b = dian[i].p;
c = dian[i + 1].p;
}
if (i == dian.Num() - 1)
{
a = dian[i - 1].p;
b = dian[i].p;
c = dian[0].p;
}
M = b - a;
N = c - a;
if (M.operator^(N) == HH)
{
dian.RemoveAt(i);
i = 0;
}
}
diandian = dian;
return diandian;
}
TArray<int> liangpeng::caifen(TArray<FVector> ddian)
{
//int num = 0;
TArray<int> outuv;
outuv.Empty();
TArray<liangpeng::point3d> ddianji = guodu(ddian);
TArray<FVector2D> m = threeto(ddian);
//return outuv;
ddianji = movepoint(ddianji);
for (int i = 0; i <ddianji.Num();)
{
if (ddianji.Num() < 3)
{
break;
}
//TArray<point3d> moved = movepoint(ddianji);
//TArray<point>dian = aotudian(moved);
TArray<liangpeng::point>dian = aotudian(ddianji);
TArray<liangpeng::face>sanjiao = Triange(dian);
TArray<liangpeng::point> shenyu = sanjiao[i].R;
if (ddianji.Num() == 3)
{
if (shixu)
{
outuv.Add(sanjiao[i].O);
outuv.Add(sanjiao[i].P);
outuv.Add(sanjiao[i].Q);
break;
}
else
{
outuv.Add(sanjiao[i].Q);
outuv.Add(sanjiao[i].P);
outuv.Add(sanjiao[i].O);
break;
}
}
if (dian[i].aotu)
{
FVector2D a, b, c, d;
int num = 0;
a = m[sanjiao[i].O];
b = m[sanjiao[i].P];
c = m[sanjiao[i].Q];
for (int j = 0; j < shenyu.Num(); j++)
{
d = shenyu[j].p;
if (isout(a, b, c, d))
{
num = num + 1;
}
if (!isout(a, b, c, d))
{
i = i + 1;
num = 0;
break;
}
}
if (num == shenyu.Num())
{
if (shixu) //顺时针为true添加顺序OPQ
{
outuv.Add(sanjiao[i].O);
outuv.Add(sanjiao[i].P);
outuv.Add(sanjiao[i].Q);
ddianji.RemoveAt(i);
ddianji = movepoint(ddianji);
i = 0;
num = 0;
}
else //逆时针为false反向添加
{
outuv.Add(sanjiao[i].Q);
outuv.Add(sanjiao[i].P);
outuv.Add(sanjiao[i].O);
ddianji.RemoveAt(i);
ddianji = movepoint(ddianji);
i = 0;
num = 0;
}
}
}
//return outuv;
if (!dian[i].aotu)
{
i = i + 1;
}
//return outuv;
}
return outuv;
}
liangpeng::liangpeng(TArray<FVector> inputpoint)
{
TArray<int> OutTriange;
OutTriange.Empty();
if (inputpoint.Num() < 4)
{
liangpeng::OutTriange = OutTriange;
}
else
{
TArray<FVector> dd = MoveLost(inputpoint);
OutTriange = caifen(dd);//地板上面的面法向序列
//int num = OutTriange.Num();
//for (int i = 0; i < num;)
//{
// OutTriange.Add(OutTriange[i + 2] + num);
// OutTriange.Add(OutTriange[i + 1] + num);
// OutTriange.Add(OutTriange[i] + num);
// i = i + 3;
//}
liangpeng::OutTriange = O
- 1
- 2
前往页