[121] | 1 | // This file is a part of the Framsticks GDK. |
---|
[197] | 2 | // Copyright (C) 1999-2014 Maciej Komosinski and Szymon Ulatowski. See LICENSE.txt for details. |
---|
[121] | 3 | // Refer to http://www.framsticks.com/ for further information. |
---|
| 4 | |
---|
[109] | 5 | #include <stdio.h> |
---|
| 6 | #include <frams/model/model.h> |
---|
| 7 | #include <frams/model/modelparts.h> |
---|
| 8 | |
---|
| 9 | int main() |
---|
| 10 | { |
---|
[139] | 11 | Model m; |
---|
| 12 | Part *p1, *p2; |
---|
| 13 | Joint *j; |
---|
[109] | 14 | |
---|
[139] | 15 | m.open(); |
---|
[109] | 16 | |
---|
[139] | 17 | // chain of ellipsoids - subsequent parts are placed relative to the previous part's orientation and location |
---|
| 18 | p1 = m.addNewPart(Part::SHAPE_ELLIPSOID); //initial part |
---|
| 19 | p1->scale = Pt3D(1.0, 0.7, 0.4); |
---|
[109] | 20 | |
---|
[139] | 21 | Orient rotation = Orient_1; //must be initialized explicitly because the default Orient constructor does not initialize anything |
---|
| 22 | rotation.rotate(Pt3D(0.1, 0.2, 0.3)); |
---|
[109] | 23 | |
---|
[139] | 24 | for (int N = 10; N > 0; N--, p1 = p2) |
---|
[109] | 25 | { |
---|
[139] | 26 | p2 = m.addNewPart(Part::SHAPE_ELLIPSOID); |
---|
| 27 | p2->scale = p1->scale*0.9; //each part is smaller than its predecessor |
---|
[109] | 28 | |
---|
[139] | 29 | Pt3D advance(p1->scale.x, 0, 0); //advance by previous part's ellipsoid x radius |
---|
| 30 | p2->p = p1->p + p1->o.transform(advance); //advance vector transformed by p1's orientation (i.e., in p1's local coordinates) |
---|
| 31 | p2->setOrient(p1->o.transform(rotation)); //rotation transformed by p1's orientation |
---|
| 32 | |
---|
| 33 | m.addNewJoint(p1, p2, Joint::SHAPE_SOLID); //all parts must be connected |
---|
[109] | 34 | } |
---|
| 35 | |
---|
[139] | 36 | // chain of cyllinders - line segments between points calculated from the parametric formula P(a)=(2-2*cos(a),2*sin(a)) (circle with r=2) |
---|
| 37 | Pt3D prev, next; |
---|
| 38 | p1 = m.getPart(0); |
---|
| 39 | for (float a = 0; a<M_PI; a += M_PI / 10) |
---|
[109] | 40 | { |
---|
[139] | 41 | Pt3D next(2 - 2 * cos(a), 0, 2 * sin(a)); |
---|
| 42 | if (a>0) |
---|
[109] | 43 | { |
---|
[139] | 44 | p2 = m.addNewPart(Part::SHAPE_CYLINDER); |
---|
| 45 | p2->setPositionAndRotationFromAxis(prev, next); |
---|
| 46 | p2->scale = Pt3D(prev.distanceTo(next)*0.5, 0.05, 0.05);// distance*0.5 because scale is "radius", not cylinder length |
---|
[109] | 47 | |
---|
[139] | 48 | m.addNewJoint(p1, p2, Joint::SHAPE_SOLID); //all parts must be connected |
---|
[109] | 49 | } |
---|
[139] | 50 | p1 = p2; |
---|
| 51 | prev = next; |
---|
[109] | 52 | } |
---|
| 53 | |
---|
[139] | 54 | m.close(); |
---|
| 55 | puts((const char*)m.getF0Geno().toString()); |
---|
| 56 | // the genotype can be fed directly to the genotype viewer, like this: |
---|
[152] | 57 | // part_shapes | theater -g - |
---|
[109] | 58 | } |
---|