public static int linearProgram2(NativeList <Line> lines, float radius, float2 optVelocity, bool directionOpt, ref float2 result) { if (directionOpt) { /* * Optimize direction. Note that the optimization velocity is of * unit length in this case. */ result = optVelocity * radius; } else if (optVelocity.LengthSquared() > radius.Square()) { /* Optimize closest point and outside circle. */ result = math.normalize(optVelocity) * radius; } else { /* Optimize closest point and inside circle. */ result = optVelocity; } for (int i = 0; i < lines.Length; ++i) { if (lines[i].direction.CrossScalar(lines[i].point - result) > 0.0f) { /* Result does not satisfy constraint i. Compute new optimal result. */ float2 tempResult = result; if (!linearProgram1(lines, i, radius, optVelocity, directionOpt, ref result)) { result = tempResult; return(i); } } } return(lines.Length); }