Exemple #1
0
    public Plane createSymmetryPlane(VertexNode v1, Vector3 p1)
    {
        Vector3 midpoint = (v1.getPosition() + p1) / 2;
        Vector3 v        = v1.getPosition() - p1;

        return(new Plane(v, midpoint));
    }
Exemple #2
0
    // Given a vertex it moves it to the closest point to the selected not performing any creases
    public void displace(VertexNode vn, Vector3 p)
    {
        step++;
        Vector3 pos = new Vector3(0, 0, 0);

        List <Edge>       eL         = vn.edges;
        List <VertexNode> contiguous = new List <VertexNode>();

        for (int i = 0; i < eL.Count; i++)
        {
            if (eL[i].origin != vn)
            {
                contiguous.Add(eL[i].origin);
            }
            if (eL[i].end != vn)
            {
                contiguous.Add(eL[i].end);
            }
        }

        for (int i = 0; i < contiguous.Count; i++)
        {
            pos += contiguous[i].getPosition();
        }

        pos = pos / contiguous.Count;

        pos = vn.getPosition() + (pos - vn.getPosition()) * 2;



        ///
        /// p1 = (x0,->c1-c2)
        /// q = p projectat p1
        /// p2 = (q, cross(->q-c1,->q-c2))
        ///
        /// c = c1 +r1 -(r1+r2-d(c1,c2))/2
        /// rc = d(c, c2)
        /// r = sqrt(r2^2+rc^2)
        /// S = (c,r)

        //sage: x, y,z,a,b,c,d,e,f,g,h,i,j,k,l = var('x, y,z,a,b,c,d,e,f,g,h,i,j,k,l')
        //sage: solve([(x - a) ^ 2 + (y - b) ^ 2 + (z - c) ^ 2 == d, e * x + f * y + z * g == h, i * x + j * y + z * k == l], x, y,z)

        ////x == -((c * f * g - b * g ^ 2 - f * h) * i * j - (c * e * g - a * g ^ 2 - e * h) * j ^ 2 - (b * e * f - a * f ^ 2 - e * h) * k ^ 2 - ((c * f ^ 2 - b * f * g + g * h) * i - (c * e * f + (b * e - 2 * a * f) * g) * j) * k - (e * f * j + e * g * k - (f ^ 2 + g ^ 2) * i) * l - sqrt(-(2 * b * c * f * g + (a ^ 2 + b ^ 2 - d) * f ^ 2 + (a ^ 2 + c ^ 2 - d) * g ^ 2 - 2 * (b * f + c * g) * h + h ^ 2) * i ^ 2 - 2 * (a * b * g ^ 2 - (a ^ 2 + b ^ 2 - d) * e * f - (b * c * e + a * c * f) * g + (b * e + a * f) * h) * i * j - (2 * a * c * e * g + (a ^ 2 + b ^ 2 - d) * e ^ 2 + (b ^ 2 + c ^ 2 - d) * g ^ 2 - 2 * (a * e + c * g) * h + h ^ 2) * j ^ 2 - (2 * a * b * e * f + (a ^ 2 + c ^ 2 - d) * e ^ 2 + (b ^ 2 + c ^ 2 - d) * f ^ 2 - 2 * (a * e + b * f) * h + h ^ 2) * k ^ 2 - (e ^ 2 + f ^ 2 + g ^ 2) * l ^ 2 + 2 * ((b * c * e * f - a * c * f ^ 2 + (a * b * f + (a ^ 2 + c ^ 2 - d) * e) * g - (c * e + a * g) * h) * i - (b * c * e ^ 2 - a * c * e * f - (a * b * e + (b ^ 2 + c ^ 2 - d) * f) * g + (c * f + b * g) * h) * j) * k - 2 * ((b * e * f - a * f ^ 2 + c * e * g - a * g ^ 2 - e * h) * i - (b * e ^ 2 - a * e * f - c * f * g + b * g ^ 2 + f * h) * j - (c * e ^ 2 + c * f ^ 2 - (a * e + b * f) * g + g * h) * k) * l) * (g * j - f * k)) / (2 * e * f * i * j - (f ^ 2 + g ^ 2) * i ^ 2 - (e ^ 2 + g ^ 2) * j ^ 2 - (e ^ 2 + f ^ 2) * k ^ 2 + 2 * (e * g * i + f * g * j) * k),
        ///y == ((c * f * g - b * g ^ 2 - f * h) * i ^ 2 - (c * e * g - a * g ^ 2 - e * h) * i * j - (b * e ^ 2 - a * e * f + f * h) * k ^ 2 - ((c * e * f - (2 * b * e - a * f) * g) * i - (c * e ^ 2 - a * e * g + g * h) * j) * k + (e * f * i + f * g * k - (e ^ 2 + g ^ 2) * j) * l - sqrt(-(2 * b * c * f * g + (a ^ 2 + b ^ 2 - d) * f ^ 2 + (a ^ 2 + c ^ 2 - d) * g ^ 2 - 2 * (b * f + c * g) * h + h ^ 2) * i ^ 2 - 2 * (a * b * g ^ 2 - (a ^ 2 + b ^ 2 - d) * e * f - (b * c * e + a * c * f) * g + (b * e + a * f) * h) * i * j - (2 * a * c * e * g + (a ^ 2 + b ^ 2 - d) * e ^ 2 + (b ^ 2 + c ^ 2 - d) * g ^ 2 - 2 * (a * e + c * g) * h + h ^ 2) * j ^ 2 - (2 * a * b * e * f + (a ^ 2 + c ^ 2 - d) * e ^ 2 + (b ^ 2 + c ^ 2 - d) * f ^ 2 - 2 * (a * e + b * f) * h + h ^ 2) * k ^ 2 - (e ^ 2 + f ^ 2 + g ^ 2) * l ^ 2 + 2 * ((b * c * e * f - a * c * f ^ 2 + (a * b * f + (a ^ 2 + c ^ 2 - d) * e) * g - (c * e + a * g) * h) * i - (b * c * e ^ 2 - a * c * e * f - (a * b * e + (b ^ 2 + c ^ 2 - d) * f) * g + (c * f + b * g) * h) * j) * k - 2 * ((b * e * f - a * f ^ 2 + c * e * g - a * g ^ 2 - e * h) * i - (b * e ^ 2 - a * e * f - c * f * g + b * g ^ 2 + f * h) * j - (c * e ^ 2 + c * f ^ 2 - (a * e + b * f) * g + g * h) * k) * l) * (g * i - e * k)) / (2 * e * f * i * j - (f ^ 2 + g ^ 2) * i ^ 2 - (e ^ 2 + g ^ 2) * j ^ 2 - (e ^ 2 + f ^ 2) * k ^ 2 + 2 * (e * g * i + f * g * j) * k),
        ///z == -((c * f ^ 2 - b * f * g + g * h) * i ^ 2 - (2 * c * e * f - (b * e + a * f) * g) * i * j + (c * e ^ 2 - a * e * g + g * h) * j ^ 2 + ((b * e * f - a * f ^ 2 - e * h) * i - (b * e ^ 2 - a * e * f + f * h) * j) * k - (e * g * i + f * g * j - (e ^ 2 + f ^ 2) * k) * l - sqrt(-(2 * b * c * f * g + (a ^ 2 + b ^ 2 - d) * f ^ 2 + (a ^ 2 + c ^ 2 - d) * g ^ 2 - 2 * (b * f + c * g) * h + h ^ 2) * i ^ 2 - 2 * (a * b * g ^ 2 - (a ^ 2 + b ^ 2 - d) * e * f - (b * c * e + a * c * f) * g + (b * e + a * f) * h) * i * j - (2 * a * c * e * g + (a ^ 2 + b ^ 2 - d) * e ^ 2 + (b ^ 2 + c ^ 2 - d) * g ^ 2 - 2 * (a * e + c * g) * h + h ^ 2) * j ^ 2 - (2 * a * b * e * f + (a ^ 2 + c ^ 2 - d) * e ^ 2 + (b ^ 2 + c ^ 2 - d) * f ^ 2 - 2 * (a * e + b * f) * h + h ^ 2) * k ^ 2 - (e ^ 2 + f ^ 2 + g ^ 2) * l ^ 2 + 2 * ((b * c * e * f - a * c * f ^ 2 + (a * b * f + (a ^ 2 + c ^ 2 - d) * e) * g - (c * e + a * g) * h) * i - (b * c * e ^ 2 - a * c * e * f - (a * b * e + (b ^ 2 + c ^ 2 - d) * f) * g + (c * f + b * g) * h) * j) * k - 2 * ((b * e * f - a * f ^ 2 + c * e * g - a * g ^ 2 - e * h) * i - (b * e ^ 2 - a * e * f - c * f * g + b * g ^ 2 + f * h) * j - (c * e ^ 2 + c * f ^ 2 - (a * e + b * f) * g + g * h) * k) * l) * (f * i - e * j)) / (2 * e * f * i * j - (f ^ 2 + g ^ 2) * i ^ 2 - (e ^ 2 + g ^ 2) * j ^ 2 - (e ^ 2 + f ^ 2) * k ^ 2 + 2 * (e * g * i + f * g * j) * k)],
        ///[x == -((c* f* g - b* g^2 - f* h)*i* j - (c* e* g - a* g^2 - e* h)*j^2 - (b* e* f - a* f^2 - e* h)*k^2 - ((c* f^2 - b* f*g + g* h)*i - (c* e* f + (b* e - 2*a* f)*g)*j)*k - (e* f* j + e* g*k - (f^2 + g^2)*i)*l + sqrt(-(2*b* c*f* g + (a^2 + b^2 - d)*f^2 + (a^2 + c^2 - d)*g^2 - 2*(b* f + c* g)*h + h^2)*i^2 - 2*(a* b* g^2 - (a^2 + b^2 - d)*e* f - (b* c* e + a* c*f)*g + (b* e + a* f)*h)*i* j - (2*a* c*e* g + (a^2 + b^2 - d)*e^2 + (b^2 + c^2 - d)*g^2 - 2*(a* e + c* g)*h + h^2)*j^2 - (2*a* b*e* f + (a^2 + c^2 - d)*e^2 + (b^2 + c^2 - d)*f^2 - 2*(a* e + b* f)*h + h^2)*k^2 - (e^2 + f^2 + g^2)*l^2 + 2*((b* c* e* f - a* c*f^2 + (a* b* f + (a^2 + c^2 - d)*e)*g - (c* e + a* g)*h)*i - (b* c* e^2 - a* c*e* f - (a* b* e + (b^2 + c^2 - d)*f)*g + (c* f + b* g)*h)*j)*k - 2*((b* e* f - a* f^2 + c* e*g - a* g^2 - e* h)*i - (b* e^2 - a* e*f - c* f*g + b* g^2 + f* h)*j - (c* e^2 + c* f^2 - (a* e + b* f)*g + g* h)*k)*l)*(g* j - f* k))/(2*e* f*i* j - (f^2 + g^2)*i^2 - (e^2 + g^2)*j^2 - (e^2 + f^2)*k^2 + 2*(e* g* i + f* g*j)*k),
        ///y == ((c* f* g - b* g^2 - f* h)*i^2 - (c* e* g - a* g^2 - e* h)*i* j - (b* e^2 - a* e*f + f* h)*k^2 - ((c* e* f - (2*b* e - a* f)*g)*i - (c* e^2 - a* e*g + g* h)*j)*k + (e* f* i + f* g*k - (e^2 + g^2)*j)*l + sqrt(-(2*b* c*f* g + (a^2 + b^2 - d)*f^2 + (a^2 + c^2 - d)*g^2 - 2*(b* f + c* g)*h + h^2)*i^2 - 2*(a* b* g^2 - (a^2 + b^2 - d)*e* f - (b* c* e + a* c*f)*g + (b* e + a* f)*h)*i* j - (2*a* c*e* g + (a^2 + b^2 - d)*e^2 + (b^2 + c^2 - d)*g^2 - 2*(a* e + c* g)*h + h^2)*j^2 - (2*a* b*e* f + (a^2 + c^2 - d)*e^2 + (b^2 + c^2 - d)*f^2 - 2*(a* e + b* f)*h + h^2)*k^2 - (e^2 + f^2 + g^2)*l^2 + 2*((b* c* e* f - a* c*f^2 + (a* b* f + (a^2 + c^2 - d)*e)*g - (c* e + a* g)*h)*i - (b* c* e^2 - a* c*e* f - (a* b* e + (b^2 + c^2 - d)*f)*g + (c* f + b* g)*h)*j)*k - 2*((b* e* f - a* f^2 + c* e*g - a* g^2 - e* h)*i - (b* e^2 - a* e*f - c* f*g + b* g^2 + f* h)*j - (c* e^2 + c* f^2 - (a* e + b* f)*g + g* h)*k)*l)*(g* i - e* k))/(2*e* f*i* j - (f^2 + g^2)*i^2 - (e^2 + g^2)*j^2 - (e^2 + f^2)*k^2 + 2*(e* g* i + f* g*j)*k),
        ///z == -((c* f^2 - b* f*g + g* h)*i^2 - (2*c* e*f - (b* e + a* f)*g)*i* j + (c* e^2 - a* e*g + g* h)*j^2 + ((b* e* f - a* f^2 - e* h)*i - (b* e^2 - a* e*f + f* h)*j)*k - (e* g* i + f* g*j - (e^2 + f^2)*k)*l + sqrt(-(2*b* c*f* g + (a^2 + b^2 - d)*f^2 + (a^2 + c^2 - d)*g^2 - 2*(b* f + c* g)*h + h^2)*i^2 - 2*(a* b* g^2 - (a^2 + b^2 - d)*e* f - (b* c* e + a* c*f)*g + (b* e + a* f)*h)*i* j - (2*a* c*e* g + (a^2 + b^2 - d)*e^2 + (b^2 + c^2 - d)*g^2 - 2*(a* e + c* g)*h + h^2)*j^2 - (2*a* b*e* f + (a^2 + c^2 - d)*e^2 + (b^2 + c^2 - d)*f^2 - 2*(a* e + b* f)*h + h^2)*k^2 - (e^2 + f^2 + g^2)*l^2 + 2*((b* c* e* f - a* c*f^2 + (a* b* f + (a^2 + c^2 - d)*e)*g - (c* e + a* g)*h)*i - (b* c* e^2 - a* c*e* f - (a* b* e + (b^2 + c^2 - d)*f)*g + (c* f + b* g)*h)*j)*k - 2*((b* e* f - a* f^2 + c* e*g - a* g^2 - e* h)*i - (b* e^2 - a* e*f - c* f*g + b* g^2 + f* h)*j - (c* e^2 + c* f^2 - (a* e + b* f)*g + g* h)*k)*l)*(f* i - e* j))/(2*e* f*i* j - (f^2 + g^2)*i^2 - (e^2 + g^2)*j^2 - (e^2 + f^2)*k^2 + 2*(e* g* i + f* g*j)*k)



        Vertex newV = new Vertex(pos, step, vertexLL.count);

        vertexLL.count++;
        vn.Add(newV);
        unfoldCount = 0;
    }
Exemple #3
0
    //---------------------------------AUXILIAR FUNCTIONS-------------------------------------------//

    // Given 2 elements it creates the symmetry plane for the fold
    public Plane createSymmetryPlane(VertexNode v1, VertexNode v2)
    {
        Vector3 normal   = v1.getPosition() - v2.getPosition();
        Vector3 midpoint = (v1.getPosition() + v2.getPosition()) / 2;
        Plane   p        = new Plane(normal, midpoint);

        return(p);
    }
Exemple #4
0
    public void crease(VertexNode v1, Vector3 p1)
    {
        step++;
        Vector3 midpoint = (v1.getPosition() + p1) / 2;
        Vector3 v        = v1.getPosition() - p1;
        Vector3 n        = camToModel;
        Plane   p        = new Plane(Vector3.Cross(v, n), midpoint);

        generateNewCreases(p);
    }
Exemple #5
0
    // Given 2 elements i creates a crease between the two
    public void crease(VertexNode v1, VertexNode v2)
    {
        step++;
        Vector3  midpoint = (v1.getPosition() + v2.getPosition()) / 2;
        Vector3  v        = v1.getPosition() - v2.getPosition();
        Vector3  n;
        FaceNode f = shareFace(v1, v2);

        if (f != null)
        {
            n = f.face.normal;
        }
        else
        {
            n = camToModel;
        }
        Plane p = new Plane(Vector3.Cross(v, n), midpoint);

        generateNewCreases(p);
    }
Exemple #6
0
    // Creates the gameObjects necessary to visualize the model
    public void createVertexObject(VertexNode v)
    {
        GameObject vertex = GameObject.CreatePrimitive(PrimitiveType.Sphere);

        vertex.AddComponent <VertexObject>();
        vertex.transform.Translate(v.getPosition());
        vertex.transform.localScale            = new Vector3(0.04f, 0.04f, 0.04f);
        vertex.GetComponent <VertexObject>().v = v;
        vertex.GetComponent <VertexObject>().c = this;

        plot.Add(vertex.GetComponent <VertexObject>());
    }
Exemple #7
0
    // Checks if the given plane cuts the edge and returns the point if it does
    public Vector3 isCut(Plane p)
    {
        float t, para;

        para = (p.A * (end.getPosition().x - origin.getPosition().x) + p.B * (end.getPosition().y - origin.getPosition().y) + p.C * (end.getPosition().z - origin.getPosition().z));
        if (para != 0)
        {
            t = (p.D - p.A * origin.getPosition().x - p.B * origin.getPosition().y - p.C * origin.getPosition().z) / para;
        }
        else
        {
            return(new Vector3(9999, 9999, 9999));;
        }
        if (t < 1 && t > 0)
        {
            return(t * (end.getPosition() - origin.getPosition()) + origin.getPosition());
        }
        else
        {
            return(new Vector3(9999, 9999, 9999));;
        }
    }