342 lines
14 KiB
C#
342 lines
14 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Windows.Media;
|
|||
|
|
using System.Windows.Media.Media3D;
|
|||
|
|
using static System.Math;
|
|||
|
|
using Brush = System.Windows.Media.Brush;
|
|||
|
|
using Brushes = System.Windows.Media.Brushes;
|
|||
|
|
|
|||
|
|
namespace JiangsuEarthquake.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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|