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;
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;
}
}
}