public VoronoiDiagram(Vector3[] inputPoints, VBorder border) { m_border = border; m_parabolas = new List <VParabola>(); Edges = new List <VEdge>(); Vertices = new List <Vector3>(); m_eventQueues = new List <VEvent>(); for (int i = 0; i < inputPoints.Length; i++) { m_eventQueues.Add(new VEvent(inputPoints[i], true)); } SortEventQueues(); while (m_eventQueues.Count > 0) { VEvent currentEvent = m_eventQueues[0]; m_eventQueues.RemoveAt(0); m_ly = currentEvent.Site.z; if (currentEvent.IsSiteEvent) { AddSiteEvent(currentEvent.Site, m_ly); } else { AddCircleEvent(currentEvent); } } FinishEdge(); }
public void Finish(VBorder border) { if (!m_hasVertex) { float x = 0; if (m_direction == Direction.Left) { x = -border.HalfWidth; } else { x = border.HalfWidth; } if (!IsInfinityLerp()) { float z = m_lerp * x + m_intercept; if (z > border.HalfHeight || z < -border.HalfHeight) { z = Mathf.Clamp(z, -border.HalfHeight, border.HalfHeight); x = (z - m_intercept) / m_lerp; } SetVertexPoint(new Vector3(x, 0, z)); } else { SetVertexPoint(new Vector3(EndPoint.x, 0, -border.HalfHeight)); } } if (StartPoint.x < -border.HalfWidth || StartPoint.x > border.HalfWidth || StartPoint.z < -border.HalfHeight || StartPoint.z > border.HalfHeight) { if (StartPoint.x < -border.HalfWidth || StartPoint.x > border.HalfWidth) { StartPoint.x = Mathf.Clamp(StartPoint.x, -border.HalfWidth, border.HalfWidth); if (!IsInfinityLerp()) { StartPoint.z = m_lerp * StartPoint.x + m_intercept; if (StartPoint.z < -border.HalfHeight || StartPoint.z > border.HalfHeight) { StartPoint.z = Mathf.Clamp(StartPoint.z, -border.HalfHeight, border.HalfHeight); StartPoint.x = (StartPoint.z - m_intercept) / m_lerp; } } } else { StartPoint.z = Mathf.Clamp(StartPoint.z, -border.HalfHeight, border.HalfHeight); StartPoint.x = (StartPoint.z - m_intercept) / m_lerp; if (StartPoint.x < -border.HalfWidth || StartPoint.x > border.HalfWidth) { StartPoint.x = Mathf.Clamp(StartPoint.x, -border.HalfWidth, border.HalfWidth); StartPoint.z = m_lerp * StartPoint.x + m_intercept; } } } if (VertexPoint.x < -border.HalfWidth || VertexPoint.x > border.HalfWidth || VertexPoint.z < -border.HalfHeight || VertexPoint.z > border.HalfHeight) { if (VertexPoint.x < -border.HalfWidth || VertexPoint.x > border.HalfWidth) { VertexPoint.x = Mathf.Clamp(VertexPoint.x, -border.HalfWidth, border.HalfWidth); if (!IsInfinityLerp()) { VertexPoint.z = m_lerp * VertexPoint.x + m_intercept; if (VertexPoint.z < -border.HalfHeight || VertexPoint.z > border.HalfHeight) { VertexPoint.z = Mathf.Clamp(VertexPoint.z, -border.HalfHeight, border.HalfHeight); VertexPoint.x = (VertexPoint.z - m_intercept) / m_lerp; } } } else { VertexPoint.z = Mathf.Clamp(VertexPoint.z, -border.HalfHeight, border.HalfHeight); VertexPoint.x = (VertexPoint.z - m_intercept) / m_lerp; if (VertexPoint.x < -border.HalfWidth || VertexPoint.x > border.HalfWidth) { VertexPoint.x = Mathf.Clamp(VertexPoint.x, -border.HalfWidth, border.HalfWidth); VertexPoint.z = m_lerp * VertexPoint.x + m_intercept; } } } }