/// <summary>
/// 球形绘制
/// </summary>
/// <param name="name">名称</param>
/// <param name="x">球心坐标x</param>
/// <param name="y">球心坐标y</param>
/// <param name="z">球心坐标z</param>
/// <param name="r">球半径</param>
/// <returns></returns>
bool DrawSphere(string name, List<double> x, List<double> y, List<double> z,List<double> r)
{
int mNum = 24; //经度划分数24
int wNum = 12; //纬度划分数12
double dtw = Math.PI / wNum;//纬度变化率
double dtm = (2.0*Math.PI) /mNum;//经度变化率
int OneShereNodes = (mNum * (wNum - 1) + 2);//一个球的节点数
if (part != null)
{
return false;
}
double[] Tmpx = new double[(mNum * (wNum - 1) + 2) * x.Count];
double[] Tmpy = new double[(mNum * (wNum - 1) + 2) * x.Count];
double[] Tmpz = new double[(mNum * (wNum - 1) + 2) * x.Count];
//获取每个球的节点坐标
for (int k = 0; k <x.Count;k++ )
{
for (int i = 1; i < wNum; i++)
{
for (int j = 0; j < mNum; j++)
{
int CurSphBefNodes = k * OneShereNodes + (i - 1) * mNum + j;
Tmpx[CurSphBefNodes] = x[k] + r[k] * Math.Sin(i * dtw) * Math.Cos(j * dtm);
Tmpy[CurSphBefNodes] = y[k] + r[k] * Math.Sin(i * dtw) * Math.Sin(j * dtm);
Tmpz[CurSphBefNodes] = z[k] + r[k] * Math.Cos(i * dtw);
}
}
int CurSphBefNode = k * OneShereNodes + (wNum - 1) * mNum;
Tmpx[CurSphBefNode + 0] = x[k];
Tmpy[CurSphBefNode + 0] = y[k];
Tmpz[CurSphBefNode + 0] = z[k] + r[k];
Tmpx[CurSphBefNode + 1] = x[k];
Tmpy[CurSphBefNode + 1] = y[k];
Tmpz[CurSphBefNode + 1] = z[k] - r[k];
}
int nodeCount = OneShereNodes * x.Count;//节点个数
int elemCount = wNum * mNum * x.Count;//单元个数
float[] xyz = new float[nodeCount * 3];
//将坐标放入一个数组中
for (int i = 0; i < nodeCount; ++i)
{
xyz[3 * i] = (float)Tmpx[i];
xyz[3 * i + 1] = (float)Tmpy[i];
xyz[3 * i + 2] = (float)Tmpz[i];
}
int[] elemNodes = new int[elemCount * 4];//单元个数*单元节点数
int[] typelist = new int[elemCount]; //单元类型
int[] startlist = new int[elemCount]; //单元起始节点ID
int nodeId1 = 0;
int nodeId2 = 0;
int nodeId3 = 0;
int nodeId4 = 0;
//单元与节点关联
for (int kc = 0; kc < x.Count; kc++)
{
int kup = kc * OneShereNodes + (wNum - 1) * mNum + 0;
int kdown = kc * OneShereNodes + (wNum - 1) * mNum + 1;
for (int i = 0; i < wNum; ++i)
{
if (i==0)
{
for (int j = 0; j < mNum; ++j)
{
int k = kc * wNum * mNum + i * mNum + j;
if (j == mNum - 1)
{
nodeId2 = OneShereNodes * kc + i * mNum + j;
nodeId3 = OneShereNodes * kc + i * mNum;
}
else
{
nodeId2 = OneShereNodes * kc + i * mNum + j;
nodeId3 = OneShereNodes * kc + i * mNum + j + 1;
}
typelist[k] = VB_CAE_Core.EL_QUAD4;//每个单元的类型
startlist[k] = k * 4;//每个单元的起始节点Id
elemNodes[4 * k] = kup;//第一层
elemNodes[4 * k + 1] = nodeId2;//第二层
elemNodes[4 * k + 2] = nodeId3;//第二层+1
elemNodes[4 * k + 3] = kup;//第一层+1
}
}
else if (i == 11)
{
for (int j = 0; j < mNum; ++j)
{
int k = kc * wNum * mNum + i * mNum + j;
if (j == mNum - 1)
{
nodeId1 = OneShereNodes * kc + (i - 1) * mNum + j;
nodeId4 = OneShereNodes * kc + (i - 1) * mNum;
}
else
{
nodeId1 = OneShereNodes * kc + (i - 1) * mNum + j;
nodeId4 = OneShereNodes * kc + (i - 1) * mNum + j + 1;
}
typelist[k] = VB_CAE_Core.EL_QUAD4;
startlist[k] = k * 4;
elemNodes[4 * k] = nodeId1;//第一层
elemNodes[4 * k + 1] = kdown;//第二层
elemNodes[4 * k + 2] = kdown;//第二层+1
elemNodes[4 * k + 3] = nodeId4;//第一层+1
}
}
else
{
for (int j = 0; j < mNum; ++j)
{
int k = kc * wNum * mNum + i * mNum + j;
if (j == mNum - 1)
{
nodeId1 = OneShereNodes * kc + (i - 1) * mNum + j;
nodeId4 = OneShereNodes * kc + (i - 1) * mNum;
nodeId2 = OneShereNodes * kc + i * mNum + j;
nodeId3 = OneShereNodes * kc + i * mNum;
}
else
{
nodeId1 = OneShereNodes * kc + (i - 1) * mNum + j;
nodeId4 = OneShereNodes * kc + (i - 1) * mNum + j + 1;
nodeId2 = OneShereNodes * kc + i * mNum + j;
nodeId3 = OneShereNodes * kc + i * mNum + j + 1;
}
typelist[k] = VB_CAE_Core.EL_QUAD4;
startlist[k] = k * 4;
elemNodes[4 * k] = nodeId1;//第一层
elemNodes[4 * k + 1] = nodeId2;//第二层
elemNodes[4 * k + 2] = nodeId3;//第二层+1
elemNodes[4 * k + 3] = nodeId4;//第一层+1
}
}
}
}
return true;
}
【3D-Hoops】球面
最新推荐文章于 2023-08-14 11:39:02 发布