Member 12763843 Ответов: 0

Как я могу нарисовать концентрические 3d-круги (например, 3D-круговую диаграмму) структуры в WPF c#..pls help with complete code as I m new to WPF


public partial class MainWindow : Window
   {
       MouseUtilities trackball;
       public ScreenSpaceLines3D CircleWireFrame = new ScreenSpaceLines3D();
       public MainWindow()
       {
           InitializeComponent();
           trackball = new MouseUtilities();
           trackball.EventSource = objGrid;
           camera.Transform = trackball.Transform;
           Create3DCircle(new Point3D(0, 0, -1.1), new Point3D(0, 0, -1.2), Colors.Green);
           //Create3DCircle(new Point3D(0, 0, -1.2), new Point3D(0, 0,-1.3 ), Colors.Red);
       }
       public void Create3DCircle(Point3D firstPoint, Point3D secondPoint,Color color)
       {

           ModelVisual3D models = new ModelVisual3D();
           Custom3DCircle cy = new Custom3DCircle(firstPoint, secondPoint, 0.9, color, CircleWireFrame);

               models = cy.GetModelVisual3D();
               models.Transform = new Transform3DGroup();

               CircleWireFrame = cy.m_objScreenSpaceLines3D;
               CircleWireFrame.Color = Colors.Black;
               if (!this.mainViewPort.Children.Contains(CircleWireFrame))
                   this.mainViewPort.Children.Add(CircleWireFrame);
               if (!this.mainViewPort.Children.Contains(models))
                   this.mainViewPort.Children.Add(models);
           }
       }
   }
   #region CustomCylinder

   class Custom3DCircle
   {
       #region Member Variables
      public ModelVisual3D models = new ModelVisual3D();

      public Point3D firstPoint = new Point3D();

      public Point3D secondPoint = new Point3D();

      public Color WellColors = Colors.Purple;

      public double radius;

      public ScreenSpaceLines3D m_objScreenSpaceLines3D;
       #endregion

       #region Constructor

       public Custom3DCircle(Point3D objfirstPoint, Point3D objSecondPoint, double objRadius, Color objColor, ScreenSpaceLines3D objScreenSpaceLines3D)
       {

           firstPoint = objfirstPoint;
           secondPoint = objSecondPoint;
           WellColors = objColor;
           radius = objRadius;
           m_objScreenSpaceLines3D = objScreenSpaceLines3D;
       }
       #endregion

       #region Methods
       public ModelVisual3D GetModelVisual3D()
       {
           var midPoint = (firstPoint - secondPoint) /5;
           models = Get3Dcircle(GetSurfaceMaterial(WellColors), secondPoint, radius, midPoint.Z);
           return models;

       }

       public ModelVisual3D Get3Dcircle(MaterialGroup materialGroup, Point3D midPoint, double radius, double depth)
       {
           var Circle3D = new Model3DGroup();
           var nearCircle = new circle();
           var farCircle = new circle();

           var twoPi = Math.PI * 2;
           var firstPass = true;

           double x;
           double y;

               var increment = 0.1d;
               for (double i = 0; i < twoPi + increment; i = i + increment)
               {
                   x = (radius * Math.Cos(i));
                   y = (-radius * Math.Sin(i));

                   farCircle.CurrentTriangle.P0 = midPoint;
                   farCircle.CurrentTriangle.P1 = farCircle.LastPoint;
                   farCircle.CurrentTriangle.P2 = new Point3D(x + midPoint.X, y + midPoint.Y, midPoint.Z);

                   nearCircle.CurrentTriangle = farCircle.CurrentTriangle.Clone(depth, true);

                   if (!firstPass)
                   {
                       Circle3D.Children.Add(CreateTriangleModel(materialGroup, farCircle.CurrentTriangle));
                       Circle3D.Children.Add(CreateTriangleModel(materialGroup, nearCircle.CurrentTriangle));

                       Circle3D.Children.Add(CreateTriangleModel(materialGroup, farCircle.CurrentTriangle.P2, farCircle.CurrentTriangle.P1, nearCircle.CurrentTriangle.P2));
                       Circle3D.Children.Add(CreateTriangleModel(materialGroup, nearCircle.CurrentTriangle.P2, nearCircle.CurrentTriangle.P1, farCircle.CurrentTriangle.P2));
                   }
                   else
                   {
                       farCircle.FirstPoint = farCircle.CurrentTriangle.P1;
                       nearCircle.FirstPoint = nearCircle.CurrentTriangle.P1;
                       firstPass = false;
                   }
                   farCircle.LastPoint = farCircle.CurrentTriangle.P2;
                   nearCircle.LastPoint = nearCircle.CurrentTriangle.P2;
               }

               var  model = new ModelVisual3D() { Content = Circle3D };
               return model;
           }


   public class circle
       {
           public circle()
           {
               CurrentTriangle = new Triangle();
           }

           public Point3D FirstPoint { get; set; }
           public Point3D LastPoint { get; set; }
           public Triangle CurrentTriangle { get; set; }
       }

       public class Triangle
       {
           public Point3D P0 { get; set; }
           public Point3D P1 { get; set; }
           public Point3D P2 { get; set; }

           public Triangle Clone(double z, bool switchP1andP2)
           {
               var newTriangle = new Triangle();
               newTriangle.P0 = GetPointAdjustedBy(this.P0, new Point3D(0, 0, z));

               var point1 = GetPointAdjustedBy(this.P1, new Point3D(0, 0, z));
               var point2 = GetPointAdjustedBy(this.P2, new Point3D(0, 0, z));

               if (!switchP1andP2)
               {
                   newTriangle.P1 = point1;
                   newTriangle.P2 = point2;
               }
               else
               {
                   newTriangle.P1 = point2;
                   newTriangle.P2 = point1;
               }
               return newTriangle;
           }

           private Point3D GetPointAdjustedBy(Point3D point, Point3D adjustBy)
           {
               var newPoint = new Point3D { X = point.X, Y = point.Y, Z = point.Z };
               newPoint.Offset(adjustBy.X, adjustBy.Y, adjustBy.Z);
               return newPoint;
           }
       }

       private Model3DGroup CreateTriangleModel(MaterialGroup materialGroup, Triangle triangle)
       {
           return CreateTriangleModel(materialGroup, triangle.P0, triangle.P1, triangle.P2);
       }

       private Model3DGroup CreateTriangleModel(Material material, Point3D p0, Point3D p1, Point3D p2)
       {

           var mesh = new MeshGeometry3D();

           mesh.Positions.Add(p0);
           mesh.Positions.Add(p1);
           mesh.Positions.Add(p2);

           mesh.TriangleIndices.Add(0);
           mesh.TriangleIndices.Add(1);
           mesh.TriangleIndices.Add(2);

           var normal = CalculateNormal(p0, p1, p2);

           mesh.Normals.Add(normal);
           mesh.Normals.Add(normal);
           mesh.Normals.Add(normal);

           m_objScreenSpaceLines3D.Points.Add(p1);
           m_objScreenSpaceLines3D.Points.Add(p2);


           var model = new GeometryModel3D(mesh, material);
           var group = new Model3DGroup();
           group.Children.Add(model);
           return group;
       }
       private Vector3D CalculateNormal(Point3D p0, Point3D p1, Point3D p2)
       {
           var v0 = new Vector3D(p1.X - p0.X, p1.Y - p0.Y, p1.Z - p0.Z);
           var v1 = new Vector3D(p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z);
           return Vector3D.CrossProduct(v0, v1);
       }

       public MaterialGroup GetSurfaceMaterial(Color colour)
       {
           var materialGroup = new MaterialGroup();
           var emmMat = new EmissiveMaterial(new SolidColorBrush(colour));
           materialGroup.Children.Add(emmMat);
           materialGroup.Children.Add(new DiffuseMaterial(new SolidColorBrush(colour)));
           var specMat = new SpecularMaterial(new SolidColorBrush(Colors.White), 30);
           materialGroup.Children.Add(specMat);
           return materialGroup;
       }
       #endregion



Что я уже пробовал:

я попытался изменить код цилиндра, чтобы он выглядел как 3-d круг, но он не рисует концентрические круги..

0 Ответов