private CVAngle Init(CMAngle model, Transform parent, CVLineSegment segment1, CVLineSegment segment2) { CVPoint point = segment1.GetCommonPoint(segment2); // функция вычисления направлений линий, образующих угол Func <CVLineSegment, Vector3> getDir = segment => segment.RealDirection.normalized * (point == segment.FirstPoint ? 1 : -1); // создание обозначения угла const float radius = 0.2f; Vector3[] positions = null; if (model.IsRightAngle) { positions = CalcRightAngleContour(radius, getDir(segment1), getDir(segment2)); } else { positions = CalcAngleContour(radius, getDir(segment1), getDir(segment2)); } CreateLineRenderer(transform, positions); // привязка обозначения угла к месту угла transform.parent = parent; transform.localPosition = point.RealPosition; transform.localRotation = Quaternion.identity; transform.localScale = Vector3.one; Model = model; return(this); }
// отложенная обработка события выбора отрезка private IEnumerator LineView_Selected_Coroutine(CVLine view, CVLineSegment segment) { switch (CurState) { case State.SetAngle: if (activeSegments.Count != 0 && segment.GetCommonPoint(activeSegments.Top) == null) { activeSegments.Clear(); } activeSegments.ToXor(segment); break; case State.BuildLine: Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (curAction != null && curAction.IsDone) { curAction.Undo(); yield return(null); } RaycastHit raycastHit = new RaycastHit(); if (activePoints.Top != null && Physics.Raycast(ray, out raycastHit)) { CVLineSegment correctSegment = raycastHit.transform.gameObject.GetComponent <CVLineSegment>(); curAction = new CBuildLineAction(this, activePoints.Top, correctSegment, raycastHit.point); curAction.Do(); } break; case State.DivideLine: activeSegments.ToXor(segment); break; case State.Static: break; } yield return(null); }