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