public Vector3 GetClosestPoint(Vector3 p, ref int closestSeg, out float distance, int searchRange = 5, int subdivisions = 50) { distance = 3.40282347E+38f; Vector3 result = p; if (nodes.Length > 1) { int num = Mathf.Max(closestSeg - searchRange, 1); int num2 = Mathf.Min(closestSeg + searchRange, nodes.Length - 1); for (int i = num; i <= num2; i++) { Transform transform = nodes[i - 1].transform; Transform transform2 = nodes[i].transform; Vector3 position = transform.position; Vector3 p2 = transform.position + transform.forward * nodes[i - 1].OutHandleLength; Vector3 p3 = transform2.position - transform2.forward * nodes[i].InHandleLength; Vector3 position2 = transform2.position; float distance2; Vector3 vector = BezierMath.FindClosest(position, p2, p3, position2, p, out distance2, subdivisions); if (distance2 < distance) { distance = distance2; result = vector; closestSeg = i; } } } return(result); }
public void Perfect_Hit_In_Newton_Approx_Should_Not_Return_NaN() { var bezier = new BezierCurve(new Vector2(0, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(1, 1)); var result = BezierMath.GetYAtX(bezier, 0.5f); Assert.IsFalse(float.IsNaN(result)); }
public float EstimateSegmentLength(int segment, int subdivisions = 50) { float num = 0f; Debug.Assert(nodes.Length > segment, "Invalid segment number."); SmoothBezierNode smoothBezierNode = nodes[segment]; SmoothBezierNode smoothBezierNode2 = nodes[segment + 1]; Transform transform = smoothBezierNode.transform; Transform transform2 = smoothBezierNode2.transform; Vector3 position = transform.position; Vector3 p = transform.position + transform.forward * smoothBezierNode.OutHandleLength; Vector3 p2 = transform2.position - transform2.forward * smoothBezierNode2.InHandleLength; Vector3 position2 = transform2.position; Vector3 zero = Vector3.zero; Vector3 vector = BezierMath.Interpolate(position, p, p2, position2, 0f); float num2 = 1f / (float)subdivisions; for (int i = 0; i < subdivisions; i++) { zero = vector; vector = BezierMath.Interpolate(position, p, p2, position2, num2 * (float)(i + 1)); num += Vector3.Distance(zero, vector); } return(num); }
private static void PrintBezierPoints(BezierCurve bezier) { var points = 20; for (var i = 0; i < points + 1; i++) { var x = i / (float)points; Console.WriteLine($"({x:0.00}, {BezierMath.GetYAtX(bezier, x)})"); } }
protected bool CheckBezierCrossingSpawner(Vector3[] nodes) { for (int currIndex = 0; currIndex <= spawner.BezierLength; currIndex++) { Vector3 currentCurvePoint = BezierMath.BernsteinBezier( currIndex / (float)spawner.BezierLength, 2, nodes); if (Vector3.Distance(currentCurvePoint, spawner.transform.position) < spawner.DefenseBezierMinDistance) { return(true); } } return(false); }
public Vector3 InterpolateSegment(int segment, float u) { Debug.Assert(nodes.Length > segment, "Invalid segment number."); SmoothBezierNode smoothBezierNode = nodes[segment]; SmoothBezierNode smoothBezierNode2 = nodes[segment + 1]; Transform transform = smoothBezierNode.transform; Transform transform2 = smoothBezierNode2.transform; Vector3 position = transform.position; Vector3 p = transform.position + transform.forward * smoothBezierNode.OutHandleLength; Vector3 p2 = transform2.position - transform2.forward * smoothBezierNode2.InHandleLength; Vector3 position2 = transform2.position; return(BezierMath.Interpolate(position, p, p2, position2, u)); }
private List <Vector2> TwoPointInterpolation(HermiteNodeComponent first, HermiteNodeComponent second) { Vector3 p0, p3; p0 = first.transform.position; p3 = second.transform.position; Vector3 m0 = first.GetTangent() * tangentSize; Vector3 m1 = second.GetTangent() * tangentSize; LineRenderer lineRenderer = GetComponent <LineRenderer>(); List <Vector2> linePoints = new List <Vector2>(); for (int currIndex = 0; currIndex <= bezierLength; currIndex++) { float t = currIndex / (float)bezierLength; var h0_3 = BezierMath.BernsteinPolynomial(0, 3, t) + BezierMath.BernsteinPolynomial(1, 3, t); var h1_3 = BezierMath.BernsteinPolynomial(1, 3, t) * 1 / 3; var h2_3 = -BezierMath.BernsteinPolynomial(2, 3, t) * 1 / 3; var h3_3 = BezierMath.BernsteinPolynomial(3, 3, t) + BezierMath.BernsteinPolynomial(2, 3, t); Vector3 newPoint = h0_3 * p0 + h3_3 * p3 + h1_3 * m0 + h2_3 * m1; linePoints.Add(newPoint); } return(linePoints); }
IEnumerator BuildBezier(Vector3[] nodes) { var lineRenderer = GetComponent <LineRenderer>(); var collider = GetComponent <EdgeCollider2D>(); List <Vector2> linePoints = new List <Vector2>(); for (int currIndex = 0; currIndex <= bezierLength; currIndex++) { Vector3 currentCurvePoint = BezierMath.BernsteinBezier( currIndex / (float)bezierLength, 2, nodes ); linePoints.Add(currentCurvePoint); } collider.points = linePoints.ToArray(); //The second for loop will render the actual line. This is done to build //the collider before the actual rendering for (int i = 0; i <= bezierLength; i++) { lineRenderer.positionCount = i + 1; lineRenderer.SetPosition(i, linePoints[i]); yield return(null); } }
private Vector3 getTrajectoryPosition(float time) { float u = Mathf.Tan(time - 0.5f) / (Mathf.Tan(0.5f) * 2f) + 0.5f; return(BezierMath.Interpolate(startPosition, startTangent, endTangent, endPosition, u)); }
void Update() { transform.position = BezierLerp.GetPoint(p0.position, p1.position, p2.position, p3.position, t); transform.rotation = Quaternion.LookRotation(BezierMath.GetFirstDerivative(p0.position, p1.position, p2.position, p3.position, t)); }