Example #1
0
    // retourne l'arc de cercle sous forme d'une liste de point
    // voir ArcDrawer pour l'algo
    public PolygonRawData GetCurve()
    {
        PolygonRawData rawCurve = new PolygonRawData ();

        Vector2 firstPoint2Add = _prevTangentPoint;
        Vector2 lastPoint2Add = _nextTangentPoint;

        Vector2 startVector = (_prevTangentPoint - _center).normalized;
        Vector2 endVector = (_nextTangentPoint - _center).normalized;

        Vector2 angleMeasureReference = Vector2.right;

        if (_angleType == AngleType.Outside)
        {
            startVector = (_nextTangentPoint - _center).normalized;
            endVector = (_prevTangentPoint - _center).normalized;

            firstPoint2Add = _nextTangentPoint;
            lastPoint2Add = _prevTangentPoint;
        }

        float startAngle;
        if (Utils.Approximately (Vector3.Cross (startVector, angleMeasureReference).z, 0))
        {
            startAngle = Vector2.Dot (startVector, angleMeasureReference) < 0 ? 180 : 0;
        }
        else
        {
            Quaternion startRotation = Quaternion.FromToRotation (angleMeasureReference, startVector);
            startAngle = startRotation.eulerAngles.z;
        }

        float endAngle;
        if (Utils.Approximately (Vector3.Cross (endVector, angleMeasureReference).z, 0))
        {
            endAngle = Vector2.Dot (endVector, angleMeasureReference) < 0 ? 180 : 0;
        }
        else
        {
            Quaternion endRotation = Quaternion.FromToRotation (angleMeasureReference, endVector);
            endAngle = endRotation.eulerAngles.z;
        }

        // round angle
        startAngle = Mathf.Round(startAngle * 100) / 100;
        endAngle = Mathf.Round(endAngle * 100) / 100;

        //Debug.Log (startAngle + " " + endAngle);

        if (startAngle > endAngle)
        {
            endAngle += 360;
        }

        startAngle += ANGLE_STEP;
        float currentAngle = startAngle;

        rawCurve.Add (firstPoint2Add);

        while (currentAngle < endAngle)
        {
            float radAngle = currentAngle * Mathf.Deg2Rad;
            Vector2 arcPoint = new Vector2 (Mathf.Cos (radAngle), Mathf.Sin (radAngle)) * _measuredRadius + _center;

            if (_angleType == AngleType.Outside)
            {
                rawCurve.Insert (0, arcPoint);
            }
            else
            {
                rawCurve.Add (arcPoint);
            }

            currentAngle += ANGLE_STEP;
        }

        if (_angleType == AngleType.Outside)
        {
            rawCurve.Insert (0, lastPoint2Add);
        }
        else
        {
            rawCurve.Add (lastPoint2Add);
        }

        //		if (_prevTangentPointMerged)
        //		{
        //			rawCurve.RemoveAt (0);
        //		}
        //
        //		if (_nextTangentPointMerged)
        //		{
        //			rawCurve.RemoveAt (rawCurve.Count - 1);
        //		}

        return rawCurve;
    }