// * // * Builds a shape from control points // //----------------------------------------------------------------------- //Shape CubicHermiteSpline2::realizeShape() public Shape realizeShape() { Shape shape = new Shape(); int numPoints = mClosed ? mPoints.size() : (mPoints.size() - 1); //Precompute tangents for (int i = 0; i < mPoints.size(); ++i) { CubicHermiteSplineControlPoint <Vector2> mp = mPoints[i]; GlobalMembers.computeTangents(ref mp, safeGetPoint((i - 1)).position, safeGetPoint(i + 1).position); } for (int i = 0; i < numPoints; ++i) { ControlPoint pointBefore = mPoints[i]; ControlPoint pointAfter = safeGetPoint(i + 1); std_vector <Vector2> shape_getPointsReference = shape.getPointsReference(); GlobalMembers.computeCubicHermitePoints(pointBefore, pointAfter, (uint)mNumSeg, ref shape_getPointsReference); if (i == mPoints.size() - 2 && !mClosed) { shape.addPoint(pointAfter.position); } } if (mClosed) { shape.close(); } shape.setOutSide(mOutSide); return(shape); }
public static void computeTangents(ref CubicHermiteSplineControlPoint <Vector3> point, Vector3 pointBefore, Vector3 pointAfter) { switch (point.autoTangentBefore) { case CubicHermiteSplineAutoTangentMode.AT_STRAIGHT: point.tangentBefore = point.position - pointBefore; break; case CubicHermiteSplineAutoTangentMode.AT_CATMULL: point.tangentBefore = pointAfter - pointBefore; break; case CubicHermiteSplineAutoTangentMode.AT_NONE: break; } switch (point.autoTangentAfter) { case CubicHermiteSplineAutoTangentMode.AT_STRAIGHT: point.tangentAfter = pointAfter - point.position; break; case CubicHermiteSplineAutoTangentMode.AT_CATMULL: point.tangentAfter = pointAfter - pointBefore; break; case CubicHermiteSplineAutoTangentMode.AT_NONE: break; } }
// //ORIGINAL LINE: inline CubicHermiteSpline2& addPoint(Ogre::float x, Ogre::float y, CubicHermiteSplineAutoTangentMode autoTangentMode = AT_CATMULL) public CubicHermiteSpline2 addPoint(float x, float y, CubicHermiteSplineAutoTangentMode autoTangentMode) { CubicHermiteSplineControlPoint <Vector2> cp = new CubicHermiteSplineControlPoint <Vector2>(); cp.position = new Vector2(x, y); cp.autoTangentBefore = autoTangentMode; cp.autoTangentAfter = autoTangentMode; mPoints.push_back(cp); return(this); }
// //ORIGINAL LINE: inline CubicHermiteSpline3& addPoint(const Ogre::Vector3& p, CubicHermiteSplineAutoTangentMode autoTangentMode = AT_CATMULL) public CubicHermiteSpline3 addPoint(Vector3 p, CubicHermiteSplineAutoTangentMode autoTangentMode) { ControlPoint cp = new CubicHermiteSplineControlPoint <Vector3>(); cp.position = p; cp.autoTangentBefore = autoTangentMode; cp.autoTangentAfter = autoTangentMode; mPoints.push_back(cp); return(this); }
// //ORIGINAL LINE: inline CubicHermiteSpline2& addPoint(const Ogre::Vector2& p, CubicHermiteSplineAutoTangentMode autoTangentMode = AT_CATMULL) public CubicHermiteSpline2 addPoint(Vector2 p, CubicHermiteSplineAutoTangentMode autoTangentMode) { CubicHermiteSplineControlPoint <Vector2> cp = new CubicHermiteSplineControlPoint <Vector2>(); // //ORIGINAL LINE: cp.position = p; cp.position = (p); cp.autoTangentBefore = autoTangentMode; cp.autoTangentAfter = autoTangentMode; mPoints.push_back(cp); return(this); }
public static void computeCubicHermitePoints(CubicHermiteSplineControlPoint <Real> pointBefore, CubicHermiteSplineControlPoint <Real> pointAfter, uint numSeg, ref std_vector <Real> pointList) { Real p0 = pointBefore.position; Real m0 = pointBefore.tangentAfter; Real p1 = pointAfter.position; Real m1 = pointAfter.tangentBefore; for (uint j = 0; j < numSeg; ++j) { float t = (float)j / (float)numSeg; float t2 = t * t; float t3 = t2 * t; Real P = (2 * t3 - 3 * t2 + 1) * p0 + (t3 - 2 * t2 + t) * m0 + (-2 * t3 + 3 * t2) * p1 + (t3 - t2) * m1; pointList.Add(P); } }