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 { /// /// 画圆 /// /// /// /// /// /// /// public static Model3D DrawCircle(Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor) { int n = 36; List plist = GetCirclePlist(n, circlePoint, radius); List 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 GetCirclePlist(int n, Vector3D circlePoint, double radius) { //算出角度 double angel = 2 * PI / n; List pl = new List(); 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 GetCircleIndices(int n) { List pl = new List(); 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; } /// /// 画Z轴 /// /// /// /// /// /// /// /// 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 myPlist = new List(); 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; } /// /// 画X轴 /// /// /// /// /// /// /// /// 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 myPlist = new List(); 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; } /// /// 画Y轴 /// /// /// /// /// /// /// /// 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 myPlist = new List(); 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 GetCylinderSideIndices(int n) { List vs = new List(); 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; } /// /// 画圆锥X /// /// /// /// /// /// /// /// public static Model3D DrawConeX(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor) { int n = 36; List plist = GetCirclePlist(n, circlePoint, radius); List 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; } /// /// 画圆锥Y /// /// /// /// /// /// /// /// public static Model3D DrawConeY(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor) { int n = 36; List plist = GetCirclePlist(n, circlePoint, radius); List 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; } /// /// 画圆锥Z /// /// /// /// /// /// /// /// public static Model3D DrawConeZ(double height, Vector3D circlePoint, Vector3D normalVec, double radius, Brush faceColor, Brush backColor) { int n = 36; List plist = GetCirclePlist(n, circlePoint, radius); List 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; } } }