20240801_FJEQ_upperpc/FujianEarthquake_seabed/FujianEarthquake/Common/Draw.cs
XuMin 1f5631afb3 1 研究上下位机通信协议,编写协议解析代码;
2 研究岸基站可编程电源通信协议,编写岸基站状态数据显示页面;
2024-08-29 18:03:03 +08:00

341 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Media3D;
using System.Windows.Media;
using static System.Math;
namespace FujianEarthquake.Common
{
public static class Draw
{
/// <summary>
/// 画圆
/// </summary>
/// <param name="circlePoint"></param>
/// <param name="normalVec"></param>
/// <param name="radius"></param>
/// <param name="faceColor"></param>
/// <param name="backColor"></param>
/// <returns></returns>
public static Model3D DrawCircle(Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor)
{
int n = 36;
List<Point3D> plist = GetCirclePlist(n, circlePoint, radius);
List<int> nlist = GetCircleIndices(n);
GeometryModel3D gmd = new GeometryModel3D();
MeshGeometry3D mgd = new MeshGeometry3D() { Positions = new Point3DCollection(plist), TriangleIndices = new Int32Collection(nlist) };
gmd.Geometry = mgd;
gmd.Material = new DiffuseMaterial() { Brush = faceColor };
gmd.BackMaterial = new DiffuseMaterial() { Brush = backColor };
Model3D md = gmd;
return md;
}
static List<Point3D> GetCirclePlist(int n, Vector3D circlePoint, double radius)
{
//算出角度
double angel = 2 * PI / n;
List<Point3D> pl = new List<Point3D>();
pl.Add(new Point3D(circlePoint.X, circlePoint.Y, circlePoint.Z));
for (int i = 0; i < n; i++)
{
pl.Add(new Point3D(circlePoint.X + radius * Cos(i * angel), circlePoint.Y + radius * Sin(i * angel), circlePoint.Z));
}
return pl;
}
//坐标索引
static List<int> GetCircleIndices(int n)
{
List<int> pl = new List<int>();
for (int i = 1; i < n; i++)
{
pl.Add(i);
pl.Add(i + 1);
pl.Add(0);
}
pl.Add(n);
pl.Add(1);
pl.Add(0);
return pl;
}
/// <summary>
/// 画Z轴
/// </summary>
/// <param name="height"></param>
/// <param name="circlePoint"></param>
/// <param name="normalVec"></param>
/// <param name="radius"></param>
/// <param name="circleColor"></param>
/// <param name="sideColor"></param>
/// <returns></returns>
public static Model3D DrawCylinderZ(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush circleColor, Brush sideColor)
{
//Vector3D NormalVec = new Vector3D(0, 0, 1);
Vector3D upCirclePoint = new Vector3D(circlePoint.X, circlePoint.Y, circlePoint.Z + height);
//Vector3D downCirclePoint = new Vector3D(circlePoint.X, circlePoint.Y, circlePoint.Z - height * 1.5);
Vector3D downCirclePoint = new Vector3D(circlePoint.X, circlePoint.Y, circlePoint.Z);
Model3DGroup mdg = new Model3DGroup();
//底圆
mdg.Children.Add(DrawCircle(downCirclePoint, normalVec, radius, Brushes.Black, circleColor));
//侧面
int n = 36;
var upPlist = GetCirclePlist(n, upCirclePoint, radius);
upPlist.RemoveAt(0);
var dowmPlist = GetCirclePlist(n, downCirclePoint, radius);
dowmPlist.RemoveAt(0);
List<Point3D> myPlist = new List<Point3D>();
myPlist.AddRange(upPlist);
myPlist.AddRange(dowmPlist);
MeshGeometry3D mgd = new MeshGeometry3D()
{
Positions = new Point3DCollection(myPlist),
TriangleIndices = new Int32Collection(GetCylinderSideIndices(n))
};
GeometryModel3D gmd = new GeometryModel3D()
{
Geometry = mgd,
Material = new DiffuseMaterial() { Brush = sideColor }
};
mdg.Children.Add(gmd);
//顶圆
mdg.Children.Add(DrawCircle(upCirclePoint, normalVec, radius, circleColor, Brushes.Black));
return mdg;
}
/// <summary>
/// 画X轴
/// </summary>
/// <param name="height"></param>
/// <param name="circlePoint"></param>
/// <param name="normalVec"></param>
/// <param name="radius"></param>
/// <param name="circleColor"></param>
/// <param name="sideColor"></param>
/// <returns></returns>
public static Model3D DrawCylinderX(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush circleColor, Brush sideColor)
{
//Vector3D NormalVec = new Vector3D(0, 0, 1);
Vector3D upCirclePoint = new Vector3D(circlePoint.X + height, circlePoint.Y, circlePoint.Z);
//Vector3D downCirclePoint = new Vector3D(circlePoint.X - height, circlePoint.Y, circlePoint.Z);
Vector3D downCirclePoint = new Vector3D(circlePoint.X, circlePoint.Y, circlePoint.Z);
Model3DGroup mdg = new Model3DGroup();
//底圆
mdg.Children.Add(DrawCircle(downCirclePoint, normalVec, radius, Brushes.Black, circleColor));
//侧面
int n = 36;
var upPlist = GetCirclePlist(n, upCirclePoint, radius);
upPlist.RemoveAt(0);
var dowmPlist = GetCirclePlist(n, downCirclePoint, radius);
dowmPlist.RemoveAt(0);
List<Point3D> myPlist = new List<Point3D>();
myPlist.AddRange(upPlist);
myPlist.AddRange(dowmPlist);
MeshGeometry3D mgd = new MeshGeometry3D()
{
Positions = new Point3DCollection(myPlist),
TriangleIndices = new Int32Collection(GetCylinderSideIndices(n))
};
GeometryModel3D gmd = new GeometryModel3D()
{
Geometry = mgd,
Material = new DiffuseMaterial() { Brush = sideColor }
};
mdg.Children.Add(gmd);
//顶圆
mdg.Children.Add(DrawCircle(upCirclePoint, normalVec, radius, circleColor, Brushes.Black));
return mdg;
}
/// <summary>
/// 画Y轴
/// </summary>
/// <param name="height"></param>
/// <param name="circlePoint"></param>
/// <param name="normalVec"></param>
/// <param name="radius"></param>
/// <param name="circleColor"></param>
/// <param name="sideColor"></param>
/// <returns></returns>
public static Model3D DrawCylinderY(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush circleColor, Brush sideColor)
{
//Vector3D NormalVec = new Vector3D(0, 0, 1);
Vector3D upCirclePoint = new Vector3D(circlePoint.X, circlePoint.Y + height, circlePoint.Z);
//Vector3D downCirclePoint = new Vector3D(circlePoint.X, circlePoint.Y - height, circlePoint.Z);
Vector3D downCirclePoint = new Vector3D(circlePoint.X, circlePoint.Y, circlePoint.Z);
Model3DGroup mdg = new Model3DGroup();
//底圆
mdg.Children.Add(DrawCircle(downCirclePoint, normalVec, radius, Brushes.Black, circleColor));
//侧面
int n = 36;
var upPlist = GetCirclePlist(n, upCirclePoint, radius);
upPlist.RemoveAt(0);
var dowmPlist = GetCirclePlist(n, downCirclePoint, radius);
dowmPlist.RemoveAt(0);
List<Point3D> myPlist = new List<Point3D>();
myPlist.AddRange(upPlist);
myPlist.AddRange(dowmPlist);
MeshGeometry3D mgd = new MeshGeometry3D()
{
Positions = new Point3DCollection(myPlist),
TriangleIndices = new Int32Collection(GetCylinderSideIndices(n))
};
GeometryModel3D gmd = new GeometryModel3D()
{
Geometry = mgd,
Material = new DiffuseMaterial() { Brush = sideColor }
};
mdg.Children.Add(gmd);
//顶圆
mdg.Children.Add(DrawCircle(upCirclePoint, normalVec, radius, circleColor, Brushes.Black));
return mdg;
}
public static List<int> GetCylinderSideIndices(int n)
{
List<int> vs = new List<int>();
for (int i = 0; i < n - 1; i++)
{
vs.Add(i);
vs.Add(i + n);
vs.Add(i + n + 1);
vs.Add(i);
vs.Add(i + n + 1);
vs.Add(i + 1);
}
vs.Add(n - 1);
vs.Add(2 * n - 1);
vs.Add(n);
vs.Add(n - 1);
vs.Add(n);
vs.Add(0);
return vs;
}
/// <summary>
/// 画圆锥X
/// </summary>
/// <param name="height"></param>
/// <param name="circlePoint"></param>
/// <param name="normalVec"></param>
/// <param name="radius"></param>
/// <param name="faceColor"></param>
/// <param name="backColor"></param>
/// <returns></returns>
public static Model3D DrawConeX(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor)
{
int n = 36;
List<Point3D> plist = GetCirclePlist(n, circlePoint, radius);
List<int> nlist = GetCircleIndices(n);
GeometryModel3D gmd = new GeometryModel3D();
MeshGeometry3D mgd = new MeshGeometry3D() { Positions = new Point3DCollection(plist), TriangleIndices = new Int32Collection(nlist) };
gmd.Geometry = mgd;
gmd.Material = new DiffuseMaterial() { Brush = backColor };
gmd.BackMaterial = new DiffuseMaterial() { Brush = faceColor };
Model3DGroup mdg = new Model3DGroup();
mdg.Children.Add(gmd);
var plistNew = plist;
plistNew.RemoveAt(0);
plistNew.Insert(0, new Point3D(circlePoint.X + height, circlePoint.Y, circlePoint.Z));
GeometryModel3D gmdTop = new GeometryModel3D();
MeshGeometry3D mgdTop = new MeshGeometry3D() { Positions = new Point3DCollection(plistNew), TriangleIndices = new Int32Collection(nlist) };
gmdTop.Geometry = mgdTop;
gmdTop.Material = new DiffuseMaterial() { Brush = faceColor };
gmdTop.BackMaterial = new DiffuseMaterial() { Brush = backColor };
mdg.Children.Add(gmdTop);
return mdg;
}
/// <summary>
/// 画圆锥Y
/// </summary>
/// <param name="height"></param>
/// <param name="circlePoint"></param>
/// <param name="normalVec"></param>
/// <param name="radius"></param>
/// <param name="faceColor"></param>
/// <param name="backColor"></param>
/// <returns></returns>
public static Model3D DrawConeY(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor)
{
int n = 36;
List<Point3D> plist = GetCirclePlist(n, circlePoint, radius);
List<int> nlist = GetCircleIndices(n);
GeometryModel3D gmd = new GeometryModel3D();
MeshGeometry3D mgd = new MeshGeometry3D() { Positions = new Point3DCollection(plist), TriangleIndices = new Int32Collection(nlist) };
gmd.Geometry = mgd;
gmd.Material = new DiffuseMaterial() { Brush = backColor };
gmd.BackMaterial = new DiffuseMaterial() { Brush = faceColor };
Model3DGroup mdg = new Model3DGroup();
mdg.Children.Add(gmd);
var plistNew = plist;
plistNew.RemoveAt(0);
plistNew.Insert(0, new Point3D(circlePoint.X, circlePoint.Y + height, circlePoint.Z));
GeometryModel3D gmdTop = new GeometryModel3D();
MeshGeometry3D mgdTop = new MeshGeometry3D() { Positions = new Point3DCollection(plistNew), TriangleIndices = new Int32Collection(nlist) };
gmdTop.Geometry = mgdTop;
gmdTop.Material = new DiffuseMaterial() { Brush = faceColor };
gmdTop.BackMaterial = new DiffuseMaterial() { Brush = backColor };
mdg.Children.Add(gmdTop);
return mdg;
}
/// <summary>
/// 画圆锥Z
/// </summary>
/// <param name="height"></param>
/// <param name="circlePoint"></param>
/// <param name="normalVec"></param>
/// <param name="radius"></param>
/// <param name="faceColor"></param>
/// <param name="backColor"></param>
/// <returns></returns>
public static Model3D DrawConeZ(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor)
{
int n = 36;
List<Point3D> plist = GetCirclePlist(n, circlePoint, radius);
List<int> nlist = GetCircleIndices(n);
GeometryModel3D gmd = new GeometryModel3D();
MeshGeometry3D mgd = new MeshGeometry3D() { Positions = new Point3DCollection(plist), TriangleIndices = new Int32Collection(nlist) };
gmd.Geometry = mgd;
gmd.Material = new DiffuseMaterial() { Brush = backColor };
gmd.BackMaterial = new DiffuseMaterial() { Brush = faceColor };
Model3DGroup mdg = new Model3DGroup();
mdg.Children.Add(gmd);
var plistNew = plist;
plistNew.RemoveAt(0);
plistNew.Insert(0, new Point3D(circlePoint.X, circlePoint.Y, circlePoint.Z + height));
GeometryModel3D gmdTop = new GeometryModel3D();
MeshGeometry3D mgdTop = new MeshGeometry3D() { Positions = new Point3DCollection(plistNew), TriangleIndices = new Int32Collection(nlist) };
gmdTop.Geometry = mgdTop;
gmdTop.Material = new DiffuseMaterial() { Brush = faceColor };
gmdTop.BackMaterial = new DiffuseMaterial() { Brush = backColor };
mdg.Children.Add(gmdTop);
return mdg;
}
}
}