protected void KochGenerate(Vector3[] positions, bool outwards, float generatorMultiplyer) { _lineSegment.Clear(); for (int i = 0; i < positions.Length - 1; i++) { Linesegment line = new Linesegment(); line.StartPosition = positions[i]; if (i == positions.Length - 1) { line.EndPosition = positions[0]; } else { line.EndPosition = positions[i + 1]; } line.Direction = (line.EndPosition - line.StartPosition).normalized; line.Length = Vector3.Distance(line.EndPosition, line.StartPosition); _lineSegment.Add(line); } List <Vector3> newPos = new List <Vector3>(); List <Vector3> targetPos = new List <Vector3>(); for (int i = 0; i < _lineSegment.Count; i++) { newPos.Add(_lineSegment[i].StartPosition); targetPos.Add(_lineSegment[i].StartPosition); for (int j = 1; j < _keys.Length - 1; j++) { float moveAmount = _lineSegment[i].Length * _keys[j].time; float heightAmount = (_lineSegment[i].Length * _keys[j].value) * generatorMultiplyer; Vector3 movePos = _lineSegment[i].StartPosition + (_lineSegment[i].Direction * moveAmount); Vector3 Dir; if (outwards) { Dir = Quaternion.AngleAxis(-90, _rotateAxis) * _lineSegment[i].Direction; } else { Dir = Quaternion.AngleAxis(90, _rotateAxis) * _lineSegment[i].Direction; } newPos.Add(movePos); targetPos.Add(movePos + (Dir * heightAmount)); } } newPos.Add(_lineSegment[0].StartPosition); targetPos.Add(_lineSegment[0].StartPosition); _position = new Vector3[newPos.Count]; _targetPosition = new Vector3[newPos.Count]; _position = newPos.ToArray(); _targetPosition = targetPos.ToArray(); _bezierPosition = BezierCurve(_targetPosition, _bezierVertexCount); _generationCount++; }
// Bullet pattern generation taken from user Felsir on gamedev.stackexchange // from the following post https://gamedev.stackexchange.com/questions/124688/how-to-create-shockwave-of-objects-in-other-shapes-than-circle private IntersectionResult ProcessIntersection(Linesegment linesegment, Vector2 origin, double theta) { //since this is linesegment versus linesegment code; transform the ray into a point somewhere far away... Vector2 rayend = origin + new Vector2((float)Math.Cos(theta), (float)Math.Sin(theta)) * 1000; float ua = (rayend.X - origin.X) * (linesegment.point1.Y - origin.Y) - (rayend.Y - origin.Y) * (linesegment.point1.X - origin.X); float ub = (linesegment.point2.X - linesegment.point1.X) * (linesegment.point1.Y - origin.Y) - (linesegment.point2.Y - linesegment.point1.Y) * (linesegment.point1.X - origin.X); float denominator = (rayend.Y - origin.Y) * (linesegment.point2.X - linesegment.point1.X) - (rayend.X - origin.X) * (linesegment.point2.Y - linesegment.point1.Y); IntersectionResult result = new IntersectionResult { intersection = false, coincident = false, intersectionPoint = Vector2.Zero }; if (Math.Abs(denominator) <= 0.00001f) // epsilon, check if the point is on the line (within a very small distance for rounding errors). { if (Math.Abs(ua) <= 0.00001f && Math.Abs(ub) <= 0.00001f) { result.intersection = true; result.coincident = true; result.intersectionPoint = (linesegment.point1 + linesegment.point2) / 2; } } else { ua /= denominator; ub /= denominator; if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) { result.intersection = true; result.intersectionPoint.X = linesegment.point1.X + ua * (linesegment.point2.X - linesegment.point1.X); result.intersectionPoint.Y = linesegment.point1.Y + ua * (linesegment.point2.Y - linesegment.point1.Y); } } return(result); }