// 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; }