예제 #1
0
    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);
    }
예제 #2
0
    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;
    }
예제 #3
0
파일: ObjectSpin.cs 프로젝트: Y-dc/GeoSpace
    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;
    }