public ActionResult Index(BezierCurveModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    IBezierCurve cubicBezierCurve = CurveFactory.CreateCubicBezierCurve();

                    Point[] interMediapoints = new Point[] {
                        new Point {
                            X = model.pointP1_X, Y = model.pointP1_Y
                        },
                        new Point {
                            X = model.pointP2_X, Y = model.pointP2_Y
                        },
                        new Point {
                            X = model.pointP3_X, Y = model.pointP3_Y
                        },
                        new Point {
                            X = model.pointP4_X, Y = model.pointP4_Y
                        }
                    };

                    PointF[] result = Curves.BezierCurve(cubicBezierCurve, interMediapoints, 1 / model.interval);
                    model.result = ConvertArrayToString(result);
                }

                return(View(model));
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to calculate Bezier Curve.", ex);
            }
        }
Exemple #2
0
 public BezierMoveMotion(float Time, IBezierCurve BezierCurve, bool IsRelative)
     : base()
 {
     IsRelative_  = IsRelative;
     TotalTime_   = Time;
     BezierCurve_ = BezierCurve;
 }
Exemple #3
0
            static IList<PointF> GetBezierArcPoints(IBezierCurve e)
            {
                List<PointF> points = new List<PointF>(100);
                Angle angle = e.Data.Angle;
                var x = e.Data.X;
                var y = e.Data.Y;
               
                if (e.EndAngle > 179)
                {
                    var pts = Geometry.GetBezier4Points(x, y, e.Data.Rx, e.Data.Ry, e.StartAngle, 179);
                    Geometry.GetBezierPoints(4, ref points, pts);
                    pts = (Geometry.GetBezier4Points(x, y, e.Data.Rx, e.Data.Ry, 179, e.EndAngle));
                    Geometry.GetBezierPoints(4, ref points, pts);
                }
                else
                {
                    var pts = Geometry.GetBezier4Points(x, y, e.Data.Rx, e.Data.Ry, e.StartAngle, e.EndAngle);
                    Geometry.GetBezierPoints(4, ref points, pts);
                }
                IList<PointF> Points = points;

                if (angle.Valid)
                    Points = points.Rotate(angle);

                if (!e.IsArc)
                    Points.Insert(0, new PointF(e.Data.Cx, e.Data.Cy));

                return Points;
            }
Exemple #4
0
        public ArrowBullet(Transform Trans, ArrowBulletDescriptor Desc)
            : base(Trans, BulletType.Arrow, Desc.BaseBulletDesc)
        {
            StartPos_ = Desc.BaseBulletDesc.Position;
            EndPos_   = Desc.TargetPos;

            var MaxY       = Mathf.Max(StartPos_.y, EndPos_.y);
            var DisX       = Mathf.Abs(StartPos_.x - EndPos_.x);
            var ControlPos = new Vector2((StartPos_.x + EndPos_.x) / 2, MaxY + DisX / 2);

            BezierCurve_ = BezierCurveFactory.CreateBezierCurve(StartPos_, ControlPos, EndPos_);
            BezierTime_  = DisX / Mathf.Max(Desc.Speed, 1);
            CurrentTime_ = 0;

            StayTime_  = 1.0f;
            IsStaying_ = false;

            GetComponent <SpriteRenderer>().color = Desc.ArrowColor;

            var NextPos = BezierCurve_.Lerp(0.01f);

            SetRotationWithNextPos(NextPos);

            //AudioManager.PlaySound("audio/tf_arrow_bul.mp3");
        }
 public static void SetLines(this IBezierCurve curve)
 {
     curve.Line1.X1 = curve.PathFigure.StartPoint.X;
     curve.Line1.Y1 = curve.PathFigure.StartPoint.Y;
     curve.Line1.X2 = curve.BezierSegment.Point1.X;
     curve.Line1.Y2 = curve.BezierSegment.Point1.Y;
     curve.Line2.X1 = curve.BezierSegment.Point3.X;
     curve.Line2.Y1 = curve.BezierSegment.Point3.Y;
     curve.Line2.X2 = curve.BezierSegment.Point2.X;
     curve.Line2.Y2 = curve.BezierSegment.Point2.Y;
 }
Exemple #6
0
        public void TestMethod1()
        {
            IBezierCurve cubicBezierCurve = CurveFactory.CreateCubicBezierCurve();
            float        interval         = 10;

            Point[] interMediapoints = new Point[] { new Point {
                                                         X = 0, Y = 0
                                                     }, new Point {
                                                         X = 1, Y = 2
                                                     }, new Point {
                                                         X = 2, Y = 2
                                                     }, new Point {
                                                         X = 4, Y = 0
                                                     } };
            PointF[] curvePoints = Curves.BezierCurve(cubicBezierCurve, interMediapoints, 1 / interval);

            Assert.IsTrue(curvePoints.Length == interval);
        }
Exemple #7
0
        private void DrawWithCastiglio()
        {
            switch (m_lineType)
            {
            case BezierLineType.ArbitraryOrder:
            case BezierLineType.ThirdOrder:
            {
                m_curve          = new BezierCurve(m_points, Canvas);
                m_casteglioCurve = new CasteglioBezierCurve(m_points, Canvas);
                foreach (var point in m_points)
                {
                    Canvas.Children.Remove(point);
                }
                m_points = new List <SupportingPoint>();
                m_curve.Draw(Canvas);
                m_casteglioCurve.Draw(Canvas);
                m_isCurveDrawn             = true;
                CloseCurveButton.IsEnabled = true;
            }
            break;

            case BezierLineType.CompositeThirdOrder:
            {
                var supportingPoint = Utility.CalculateSymmetricPoint(m_points[0], m_points[1]);
                AddHandlers(supportingPoint);
                m_points.Insert(0, supportingPoint);
                m_curve          = new CompositeBezierCurve(m_points, Canvas);
                m_casteglioCurve = new CompositeCasteglioBezierCurve(m_points, Canvas);
                foreach (var point in m_points)
                {
                    Canvas.Children.Remove(point);
                }
                m_points = new List <SupportingPoint>();
                m_curve.Draw(Canvas);
                m_casteglioCurve.Draw(Canvas);
                m_isCurveDrawn             = true;
                CloseCurveButton.IsEnabled = true;
            }
            break;
            }
        }
Exemple #8
0
        //几何图形坐标转换
        private void GeometryCoordConvert(ref IGeometry pConvertGeometry, double A1, double B1, double C1, double A2, double B2, double C2, double A3, double C3)
        {
            object a      = System.Reflection.Missing.Value;
            object b      = System.Reflection.Missing.Value;
            bool   isRing = false;

            if (pConvertGeometry.GeometryType != esriGeometryType.esriGeometryPoint)//如果为线要素或面要素
            {
                IArray pArrayPoint    = new ArrayClass();
                IArray pGeometryArray = new ArrayClass();
                IGeometryCollection pGeometryCollection = pConvertGeometry as IGeometryCollection;
                for (int i = 0; i < pGeometryCollection.GeometryCount; i++)
                {
                    IGeometry pGeometry = pGeometryCollection.get_Geometry(i);
                    if (pGeometry.GeometryType != esriGeometryType.esriGeometryPoint)//
                    {
                        #region
                        if (pGeometry.GeometryType == esriGeometryType.esriGeometryRing)
                        {
                            isRing = true;
                        }

                        if (pGeometry.GeometryType == esriGeometryType.esriGeometryPolygon)
                        {
                            pGeometry = CommonFunction.GetPolygonBoundary((IPolygon)pGeometry);
                        }

                        ISegmentCollection pSegmentCol    = (ISegmentCollection)pGeometry;
                        ISegmentCollection pNewSegmentCol = new PolylineClass();
                        for (int k = 0; k < pSegmentCol.SegmentCount; k++)//遍历几何形体的每个节(片断)
                        {
                            //该节为直线段
                            if (pSegmentCol.get_Segment(k).GeometryType == esriGeometryType.esriGeometryLine)
                            {
                                IPointCollection pPointCol1 = new MultipointClass();
                                ILine            pLine      = (ILine)pSegmentCol.get_Segment(k);

                                IPoint pFromPoint = pLine.FromPoint;
                                pPointCol1.AddPoint((IPoint)pFromPoint, ref a, ref b);
                                IPoint pToPoint = pLine.ToPoint;
                                pPointCol1.AddPoint((IPoint)pToPoint, ref a, ref b);

                                PointCollCoordConvert(A1, B1, C1, A2, B2, C2, A3, C3, ref pPointCol1);//对点集做镜像

                                //修改线段的端点坐标
                                pLine.FromPoint = pPointCol1.get_Point(0);
                                pLine.ToPoint   = pPointCol1.get_Point(1);

                                pNewSegmentCol.AddSegment((ISegment)pLine, ref a, ref b);
                            }
                            //该节为圆弧
                            else if (pSegmentCol.get_Segment(k).GeometryType == esriGeometryType.esriGeometryCircularArc)
                            {
                                IPointCollection pPointCol2 = new MultipointClass();

                                ICircularArc pCircularArc = (ICircularArc)pSegmentCol.get_Segment(k);

                                try
                                {
                                    IPoint pCenterPoint = pCircularArc.CenterPoint;
                                    pPointCol2.AddPoint((IPoint)pCenterPoint, ref a, ref b);
                                    IPoint pFromPoint = pCircularArc.FromPoint;
                                    pPointCol2.AddPoint((IPoint)pFromPoint, ref a, ref b);
                                    IPoint pToPoint = pCircularArc.ToPoint;
                                    pPointCol2.AddPoint((IPoint)pToPoint, ref a, ref b);

                                    PointCollCoordConvert(A1, B1, C1, A2, B2, C2, A3, C3, ref pPointCol2);//对点集做镜像

                                    //构造新的圆弧
                                    ICircularArc pArc = new CircularArcClass();
                                    pArc.PutCoords(pPointCol2.get_Point(0), pPointCol2.get_Point(1), pPointCol2.get_Point(2),
                                                   (pCircularArc.IsCounterClockwise ? esriArcOrientation.esriArcCounterClockwise : esriArcOrientation.esriArcClockwise));

                                    pNewSegmentCol.AddSegment((ISegment)pArc, ref a, ref b);
                                }
                                catch { }
                            }
                            //该节为贝塞尔曲线
                            else if (pSegmentCol.get_Segment(k).GeometryType == esriGeometryType.esriGeometryBezier3Curve)
                            {
                                IPointCollection pPointCol3   = new MultipointClass();
                                IBezierCurve     pBezierCurve = (IBezierCurve)pSegmentCol.get_Segment(k);

                                //记录该节贝塞尔曲线的4个控制点
                                IPoint pFromPoint = new PointClass();
                                pBezierCurve.QueryCoord(0, pFromPoint);
                                pPointCol3.AddPoint(pFromPoint, ref a, ref b);
                                IPoint pFromTangentPoint = new PointClass();
                                pBezierCurve.QueryCoord(1, pFromTangentPoint);
                                pPointCol3.AddPoint(pFromTangentPoint, ref a, ref b);
                                IPoint pToTangentPoint = new PointClass();
                                pBezierCurve.QueryCoord(2, pToTangentPoint);
                                pPointCol3.AddPoint(pToTangentPoint, ref a, ref b);
                                IPoint pToPoint = new PointClass();
                                pBezierCurve.QueryCoord(3, pToPoint);
                                pPointCol3.AddPoint(pToPoint, ref a, ref b);

                                PointCollCoordConvert(A1, B1, C1, A2, B2, C2, A3, C3, ref pPointCol3);//对点集做镜像

                                //修改该节贝塞尔曲线的4个控制点
                                pBezierCurve.PutCoord(0, pPointCol3.get_Point(0));
                                pBezierCurve.PutCoord(1, pPointCol3.get_Point(1));
                                pBezierCurve.PutCoord(2, pPointCol3.get_Point(2));
                                pBezierCurve.PutCoord(3, pPointCol3.get_Point(3));

                                pNewSegmentCol.AddSegment((ISegment)pBezierCurve, ref a, ref b);
                            }
                        }//end for 遍历几何形体的每个节(片断)

                        CommonFunction.GeometryToArray(pNewSegmentCol as IGeometry, pArrayPoint);

                        IPolycurve2 pPolycurve2 = CommonFunction.BuildPolyLineFromSegmentCollection(pNewSegmentCol);

                        pGeometry = (IGeometry)pPolycurve2;

                        #endregion
                    }
                    if (pConvertGeometry.GeometryType == esriGeometryType.esriGeometryPolygon)//由线构成面
                    {
                        pGeometry = CommonFunction.PolylineToPolygon(pGeometry as IPolyline);
                    }
                    pGeometryArray.Add(pGeometry);
                }
                if (pGeometryArray.Count > 1)
                {
                    pConvertGeometry = pGeometryArray.get_Element(0) as IGeometry;
                    if (isRing == true)
                    {
                        for (int i = 1; i < pGeometryArray.Count; i++)
                        {
                            pConvertGeometry = CommonFunction.DiffenceGeometry(pConvertGeometry, pGeometryArray.get_Element(i) as IGeometry);
                        }
                    }
                    else
                    {
                        for (int i = 1; i < pGeometryArray.Count; i++)
                        {
                            pConvertGeometry = CommonFunction.UnionGeometry(pConvertGeometry, pGeometryArray.get_Element(i) as IGeometry);
                        }
                    }
                }
                else
                {
                    pConvertGeometry = pGeometryArray.get_Element(0) as IGeometry;
                }

                CommonFunction.AddZMValueForGeometry(ref pConvertGeometry, pArrayPoint);
            }
            else
            {
                PointCoordConvert(ref pConvertGeometry, A1, B1, C1, A2, B2, C2, A3, C3);
            }
        }
 public DraggedBezierPoint(IBezierCurve curve, DotType type)
 {
     Curve = curve;
     Type  = type;
 }
Exemple #10
0
 public MotionContainer BezierMove(float Time, IBezierCurve BezierCurve, bool IsRelative)
 {
     MotionList_.Add(new BezierMoveMotion(Time, BezierCurve, IsRelative));
     return(this);
 }
Exemple #11
0
            public void WithSideEffectsReturnsSameInstance(IPolyline expected, ILine line, IBezierCurve curve)
            {
                var path1 = (ISegmentCollection) new PathClass();

                path1.AddSegment((ISegment)line);
                ((IGeometryCollection)expected).AddGeometry((IGeometry)path1);

                var path2 = (ISegmentCollection) new PathClass();

                path2.AddSegment((ISegment)curve);
                ((IGeometryCollection)expected).AddGeometry((IGeometry)path2);

                var sut = new TestGeometryGeoJsonConverter(new GeoJsonSerializerSettings
                {
                    SerializerHasSideEffects = true,
                    Simplify = true
                });
                var actual = sut.TestPrepareGeometry(expected);

                Assert.Same(expected, actual);
            }
Exemple #12
0
        public void OnlyCurvesAreGeneralized(GeometryGeoJsonConverter sut, IPolyline polyline, ILine line, ILine otherLine, IPoint extensionPoint, IBezierCurve bezier)
        {
            // Create {otherLine} that is an extension to {line}.
            // This segment must not be simplified during the serialization.
            line.QueryPoint(esriSegmentExtension.esriExtendAtTo, line.Length + line.Length / 2, false, extensionPoint);
            otherLine.PutCoords(line.ToPoint, extensionPoint);

            // Prepare the actual test value.
            polyline.SetEmpty();

            var segments1 = (ISegmentCollection) new PathClass();

            segments1.AddSegment((ISegment)line);
            segments1.AddSegment((ISegment)otherLine);

            var segments2 = (ISegmentCollection) new PathClass();

            segments2.AddSegment((ISegment)bezier);

            ((IGeometryCollection)polyline).AddGeometry((IGeometry)segments1);
            ((IGeometryCollection)polyline).AddGeometry((IGeometry)segments2);

            var actual = JsonConvert.SerializeObject(polyline, Formatting.Indented, sut);

            // It must contain the "mid" point between line.FromPoint and otherLine.ToPoint.
            // If it is missing, the serialization merged the two segments even tho Simplify=false.
            JsonAssert.Contains($@"
[
  {otherLine.FromPoint.X.ToJsonString()},
  {otherLine.FromPoint.Y.ToJsonString()}
]", actual);
        }
Exemple #13
0
 /// <summary>
 ///  Returns the points on a Bezier Curve based on the
 ///  intermediate points and interval.
 ///  IBezierCurve supplied to inject and allow polymorphism to determine
 ///  correct points calculation for the curve be it:
 ///  Linear, Quadratic or Cubic.
 /// </summary>
 /// <param name="curve"></param>
 /// <param name="interMediaPoints"></param>
 /// <param name="interval"></param>
 /// <returns>PointF[]</returns>
 public static PointF[] BezierCurve(IBezierCurve curve, Point[] interMediaPoints, float interval)
 {
     PointF[] points = curve.BezierPoints(interMediaPoints, interval);
     return(points);
 }