コード例 #1
0
        private static void AddBezierPlate(int count, BezierSegment3D seg1, BezierSegment3D seg2, Model3DGroup group, Material material)
        {
            // Since the bezier curves will have the same number of points, create a bunch of squares linking them (it's up to the caller
            // to make sure the curves don't cross, or you would get a bow tie)
            Point3D[] rim1 = BezierUtil.GetPoints(count, seg1);
            Point3D[] rim2 = BezierUtil.GetPoints(count, seg2);

            Point3D[] allPoints = UtilityCore.Iterate(rim1, rim2).ToArray();

            List <TriangleIndexed> triangles = new List <TriangleIndexed>();

            for (int cntr = 0; cntr < count - 1; cntr++)
            {
                triangles.Add(new TriangleIndexed(count + cntr, count + cntr + 1, cntr, allPoints));    // bottom left
                triangles.Add(new TriangleIndexed(cntr + 1, cntr, count + cntr + 1, allPoints));        // top right
            }

            // Geometry Model
            GeometryModel3D geometry = new GeometryModel3D();

            geometry.Material     = material;
            geometry.BackMaterial = material;
            geometry.Geometry     = UtilityWPF.GetMeshFromTriangles(triangles.ToArray());

            group.Children.Add(geometry);
        }
コード例 #2
0
        private void DrawBell3()
        {
            Point[] points = GetBellPoints(txtBell3.Text);
            if (points == null)
            {
                txtBell3.Effect = _errorEffect;
                return;
            }

            txtBell3.Effect = null;

            BezierSegment3D bezier = new BezierSegment3D(0, 1, points.Select(o => o.ToPoint3D()).ToArray(), new[] { new Point3D(0, 0, 0), new Point3D(1, 1, 0) });

            Random rand = StaticRandom.GetRandomForThread();

            IEnumerable <double> samples = Enumerable.Range(0, 100000).
                                           Select(o => BezierUtil.GetPoint(rand.NextDouble(), bezier).Y);

            IEnumerable <Point> idealLine = BezierUtil.GetPoints(100, bezier).
                                            Select(o => o.ToPoint2D());

            DrawGraph(samples, idealLine);

            Rect bounds = GetBounds();

            for (int cntr = 0; cntr < bezier.ControlPoints.Length - 1; cntr++)
            {
                Point from = GetScaledPoint(bezier.ControlPoints[cntr], bounds);
                Point to   = GetScaledPoint(bezier.ControlPoints[cntr + 1], bounds);
                AddLine(from, to, _brushLightBlue);
            }

            if (bezier.ControlPoints.Length > 0)
            {
                Point from = GetScaledPoint(bezier.EndPoint0, bounds);
                Point to   = GetScaledPoint(bezier.ControlPoints[0], bounds);
                AddLine(from, to, _brushLightBlue);

                from = GetScaledPoint(bezier.EndPoint1, bounds);
                to   = GetScaledPoint(bezier.ControlPoints[bezier.ControlPoints.Length - 1], bounds);
                AddLine(from, to, _brushLightBlue);
            }
        }
コード例 #3
0
        private void DrawBellArms()
        {
            #region OLD
            //var controlPoints = new List<Tuple<Point, Point>>();

            //// Arm1
            //if (!trkBellArmsLeftLen.Value.IsNearZero())
            //{
            //    Vector arm1 = new Vector(1, 1).ToUnit() * trkBellArmsLeftLen.Value;

            //    arm1 = arm1.
            //        ToVector3D().
            //        GetRotatedVector(new Vector3D(0, 0, -1), trkBellArmsLeftAngle.Value).
            //        ToVector2D();

            //    controlPoints.Add(Tuple.Create(new Point(0, 0), arm1.ToPoint()));
            //}

            //// Arm2
            //if (!trkBellArmsRightLen.Value.IsNearZero())
            //{
            //    Vector arm2 = new Vector(-1, -1).ToUnit() * trkBellArmsRightLen.Value;

            //    arm2 = arm2.
            //        ToVector3D().
            //        GetRotatedVector(new Vector3D(0, 0, -1), trkBellArmsRightAngle.Value).
            //        ToVector2D();

            //    Point point = new Point(1, 1);
            //    controlPoints.Add(Tuple.Create(point, point + arm2));
            //}

            //// Bezier
            //Point3D[] controlPoints3D = controlPoints.
            //    Select(o => o.Item2.ToPoint3D()).
            //    ToArray();

            //BezierSegment3D bezier = new BezierSegment3D(0, 1, controlPoints3D, new[] { new Point3D(0, 0, 0), new Point3D(1, 1, 0) });
            #endregion

            RandomBellArgs bezier = new RandomBellArgs(trkBellArmsLeftLen.Value, trkBellArmsLeftAngle.Value, trkBellArmsRightLen.Value, trkBellArmsRightAngle.Value);

            // Points
            Random rand = StaticRandom.GetRandomForThread();

            IEnumerable <double> samples = Enumerable.Range(0, 75000).
                                           //Select(o => BezierUtil.GetPoint(rand.NextDouble(), bezier).Y);
                                           Select(o => rand.NextBell(bezier));

            IEnumerable <Point> idealLine = BezierUtil.GetPoints(100, bezier.Bezier).
                                            Select(o => o.ToPoint2D());

            // Draw
            DrawGraph(samples, idealLine);

            Rect bounds = GetBounds();

            if (!trkBellArmsLeftLen.Value.IsNearZero())
            {
                Point from = GetScaledPoint(bezier.Bezier.EndPoint0, bounds);
                Point to   = GetScaledPoint(bezier.Bezier.ControlPoints[0], bounds);
                AddLine(from, to, _brushLightBlue);
            }

            if (!trkBellArmsRightLen.Value.IsNearZero())
            {
                Point from = GetScaledPoint(bezier.Bezier.EndPoint1, bounds);
                Point to   = GetScaledPoint(bezier.Bezier.ControlPoints[bezier.Bezier.ControlPoints.Length - 1], bounds);
                AddLine(from, to, _brushLightBlue);
            }

            // Report coords
            lblBellValues.Text     = GetBellArmValues();
            lblBellCtrlPoints.Text = GetBellPoints(bezier.Bezier.ControlPoints.Select(o => o.ToPoint2D()));
        }