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); } }
public BezierMoveMotion(float Time, IBezierCurve BezierCurve, bool IsRelative) : base() { IsRelative_ = IsRelative; TotalTime_ = Time; BezierCurve_ = BezierCurve; }
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; }
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; }
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); }
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; } }
//几何图形坐标转换 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; }
public MotionContainer BezierMove(float Time, IBezierCurve BezierCurve, bool IsRelative) { MotionList_.Add(new BezierMoveMotion(Time, BezierCurve, IsRelative)); return(this); }
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); }
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); }
/// <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); }