private void SpreadCone() { float Radius = circular.radius1; float height = circular.Vertices[0].y - circular.Vertices[1].y; float width = circular.Vertices[2].z - circular.Vertices[1].z; float fanRadius = Mathf.Sqrt(height * height + width * width); positionZ = fanRadius / 2; geoCamera.TriggerMoveZAnimation(270, 0, positionZ); VertexSpace u0 = new VertexSpace(circular.Vertices[0]); VertexSpace u1 = new VertexSpace(circular.Vertices[2]); VertexSpace u2 = new VertexSpace(circular.Vertices[1]); int segments = 60; float angleRad = Mathf.Deg2Rad * (360 * Radius / fanRadius); float angleCur = Mathf.Deg2Rad * (180 - Mathf.Acos(height / fanRadius) * 180 / Mathf.PI - 360 * Radius / fanRadius); float angledelta = angleRad / segments; int vertices_count = segments + 1; VertexSpace v1; VertexSpace v2; GeoFace f; Vector3[] vertices = new Vector3[vertices_count]; for (int i = 0; i < vertices_count; i++) { float cosA = Mathf.Cos(angleCur); float sinA = Mathf.Sin(angleCur); vertices[i] = new Vector3(u0.Position().x + 0, u0.Position().y + fanRadius * cosA, u0.Position().x + fanRadius * sinA); angleCur += angledelta; } VertexSpace[] vertexs = new VertexSpace[vertices_count + 1]; vertexs[0] = u0; for (int i = 0; i < vertices_count - 1; i++) { v1 = new VertexSpace(vertices[i]); v2 = new VertexSpace(vertices[i + 1]); vertexs[i + 1] = v1; vertexs[i + 2] = v2; geometryBehaviour.AddElement(new GeoEdge(v1, v2, false)); } f = new GeoFace(vertexs, false, FaceType.SpreadFan); geometryBehaviour.AddElement(f); GeoEdge e1 = new GeoEdge(u0, new VertexSpace(vertices[0]), false); GeoEdge e2 = new GeoEdge(u0, new VertexSpace(vertices[vertices_count - 1]), false); geometryBehaviour.AddElement(e1); geometryBehaviour.AddElement(e2); VertexSpace u3 = new VertexSpace(0, circular.Vertices[0].y, fanRadius + Radius); GeoCircle c2 = new GeoCircle(u3, Radius, CircleDirection.X, true, FaceType.SpreadConeCircle); geometryBehaviour.AddElement(c2); }
private void AddCurFace(float Angle) { float X1 = Radius1 * Mathf.Sin(Mathf.Deg2Rad * Angle); float Z1 = Radius1 * Mathf.Cos(Mathf.Deg2Rad * Angle); float preX1 = Radius1 * Mathf.Sin(Mathf.Deg2Rad * PreAngle); float preZ1 = Radius1 * Mathf.Cos(Mathf.Deg2Rad * PreAngle); float X2 = Radius2 * Mathf.Sin(Mathf.Deg2Rad * Angle); float Z2 = Radius2 * Mathf.Cos(Mathf.Deg2Rad * Angle); float preX2 = Radius2 * Mathf.Sin(Mathf.Deg2Rad * PreAngle); float preZ2 = Radius2 * Mathf.Cos(Mathf.Deg2Rad * PreAngle); if (vertices.Length == 3) { VertexSpace v1 = new VertexSpace(vertices[0].Position()); VertexSpace v2 = new VertexSpace(vertices[1].Position()); VertexSpace v3 = new VertexSpace(X1, vertices[2].Position().y, Z1); VertexSpace v4 = new VertexSpace(preX1, vertices[2].Position().y, preZ1); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v1, v3, v4 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v2, v3, v4 })); geometryBehaviour.AddElement(new GeoEdge(v3, v4)); addBorderLine(v1.Position(), v3.Position()); addBorderLine(v2.Position(), v3.Position()); } else if (vertices.Length == 4) { VertexSpace v1 = new VertexSpace(vertices[0].Position()); VertexSpace v2 = new VertexSpace(X2, vertices[3].Position().y, Z2); VertexSpace v3 = new VertexSpace(preX2, vertices[3].Position().y, preZ2); VertexSpace v4 = new VertexSpace(vertices[1].Position()); VertexSpace v5 = new VertexSpace(X1, vertices[2].Position().y, Z1); VertexSpace v6 = new VertexSpace(preX1, vertices[2].Position().y, preZ1); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v1, v2, v3 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v4, v5, v6 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v2, v5, v6, v3 })); geometryBehaviour.AddElement(new GeoEdge(v2, v3)); geometryBehaviour.AddElement(new GeoEdge(v5, v6)); addBorderLine(v1.Position(), v2.Position()); addBorderLine(v2.Position(), v5.Position()); addBorderLine(v4.Position(), v5.Position()); } PreAngle = Angle; }
private void AddCurFace(float Angle) { float sin = Mathf.Sin(Mathf.Deg2Rad * Angle); float pre_sin = Mathf.Sin(Mathf.Deg2Rad * PreAngle); float cos = Mathf.Cos(Mathf.Deg2Rad * Angle); float pre_cos = Mathf.Cos(Mathf.Deg2Rad * PreAngle); float X0 = Radius0 * sin; float Z0 = Radius0 * cos; float preX0 = Radius0 * pre_sin; float preZ0 = Radius0 * pre_cos; float X1 = Radius1 * sin; float Z1 = Radius1 * cos; float preX1 = Radius1 * pre_sin; float preZ1 = Radius1 * pre_cos; float X2 = Radius2 * sin; float Z2 = Radius2 * cos; float preX2 = Radius2 * pre_sin; float preZ2 = Radius2 * pre_cos; if (vertices.Length == 3) { VertexSpace v0 = new VertexSpace(X0, vertices[0].Position().y, Z0); VertexSpace v1 = new VertexSpace(preX0, vertices[0].Position().y, preZ0); VertexSpace v2 = new VertexSpace(X1, vertices[1].Position().y, Z1); VertexSpace v3 = new VertexSpace(preX1, vertices[1].Position().y, preZ1); VertexSpace v4 = new VertexSpace(X2, vertices[2].Position().y, Z2); VertexSpace v5 = new VertexSpace(preX2, vertices[2].Position().y, preZ2); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v0, v2, v3, v1 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v0, v1, v5, v4 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v2, v3, v5, v4 })); geometryBehaviour.AddElement(new GeoEdge(v0, v1)); geometryBehaviour.AddElement(new GeoEdge(v2, v3)); geometryBehaviour.AddElement(new GeoEdge(v4, v5)); addBorderLine(v0.Position(), v2.Position()); addBorderLine(v2.Position(), v4.Position()); addBorderLine(v4.Position(), v0.Position()); } else if (vertices.Length == 4) { float X3 = Radius3 * sin; float Z3 = Radius3 * cos; float preX3 = Radius3 * pre_sin; float preZ3 = Radius3 * pre_cos; VertexSpace v0 = new VertexSpace(X0, vertices[0].Position().y, Z0); VertexSpace v1 = new VertexSpace(preX0, vertices[0].Position().y, preZ0); VertexSpace v2 = new VertexSpace(X1, vertices[1].Position().y, Z1); VertexSpace v3 = new VertexSpace(preX1, vertices[1].Position().y, preZ1); VertexSpace v4 = new VertexSpace(X2, vertices[2].Position().y, Z2); VertexSpace v5 = new VertexSpace(preX2, vertices[2].Position().y, preZ2); VertexSpace v6 = new VertexSpace(X3, vertices[3].Position().y, Z3); VertexSpace v7 = new VertexSpace(preX3, vertices[3].Position().y, preZ3); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v0, v2, v3, v1 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v0, v1, v7, v6 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v2, v3, v5, v4 })); geometryBehaviour.AddElement(new GeoFace(new VertexUnit[] { v4, v5, v7, v6 })); geometryBehaviour.AddElement(new GeoEdge(v0, v1)); geometryBehaviour.AddElement(new GeoEdge(v2, v3)); geometryBehaviour.AddElement(new GeoEdge(v4, v5)); geometryBehaviour.AddElement(new GeoEdge(v6, v7)); addBorderLine(v0.Position(), v2.Position()); addBorderLine(v2.Position(), v4.Position()); addBorderLine(v4.Position(), v6.Position()); addBorderLine(v6.Position(), v0.Position()); } PreAngle = Angle; }