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++;
    }
Esempio n. 2
0
        // 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);
        }