Esempio n. 1
0
Node* CylinderSurfaceModule::evaluate(Context* ctx)
{
	NumberValue* heightValue = dynamic_cast<NumberValue*>(getParameterArgument(ctx,0));
	decimal h=1.0;
	if(heightValue)
		h=heightValue->getNumber();

	NumberValue* rValue = dynamic_cast<NumberValue*>(getParameterArgument(ctx,1));
	decimal r=1.0;
	if(rValue)
		r=rValue->getNumber();

	Value* centerValue=getParameterArgument(ctx,2);
	bool center=false;

	if(centerValue)
		center=centerValue->isTrue();

	decimal z1,z2;
	z1 = 0.0;
	z2 = h;

	Fragment* fg = Fragment::createFragment(ctx);
	int f = fg->getFragments(r);
	delete fg;

	QList<Point> c1=getCircle(r,f,z1);
	QList<Point> c2=getCircle(r,f,z2);

	PrimitiveNode* p=new PrimitiveNode(reporter);
	p->setChildren(ctx->getInputNodes());

	foreach(Point pt,c1) {
		p->createVertex(pt);
	}
Esempio n. 2
0
Node* CylinderModule::evaluate(Context* ctx)
{
	NumberValue* heightValue = dynamic_cast<NumberValue*>(getParameterArgument(ctx,0));
	decimal h=1.0;
	if(heightValue)
		h=heightValue->getNumber();

	NumberValue* r1Value = dynamic_cast<NumberValue*>(ctx->getArgument(1,"radius1"));
	NumberValue* r2Value = dynamic_cast<NumberValue*>(ctx->getArgument(2,"radius2"));
	BooleanValue* centerValue;

	decimal r1=1.0,r2=1.0;
	if(!r1Value) {
		NumberValue* rValue = dynamic_cast<NumberValue*>(getParameterArgument(ctx,1));
		centerValue = dynamic_cast<BooleanValue*>(getParameterArgument(ctx,2));
		if(rValue) {
			r1=r2=rValue->getNumber();
		} else {
			NumberValue* dValue = dynamic_cast<NumberValue*>(ctx->getArgument(1,"diameter"));
			if(dValue)
				r1=r2=(dValue->getNumber()/2.0);
		}
	} else {
		if(r1Value)
			r1=r1Value->getNumber();
		if(r2Value)
			r2=r2Value->getNumber();
		else
			r2=r1;
		centerValue = dynamic_cast<BooleanValue*>(ctx->getArgument(3,"center"));
	}
	bool center = false;
	if(centerValue)
		center=centerValue->isTrue();

	decimal z1,z2;
	z1 = 0.0;
	z2 = h;

	decimal r=fmax(r1,r2);
	Fragment fg=getSpecialVariables(ctx);
	int f = fg.getFragments(r);

	QList<Point> c1=getCircle(r1,f,z1);
	QList<Point> c2=getCircle(r2,f,z2);

	PrimitiveNode* p = new PrimitiveNode();

	int n=0;
	Polygon* pg;
	if(r1>0) {
		pg=p->createPolygon();
		foreach(Point pt,c1) {
			p->createVertex(pt);
			pg->append(n++);
		}
Esempio n. 3
0
void fillEllipse(
    const geom::Point2D& center,
    const geom::Point2D& radius,
    int sizeIdx)
{
    glPushMatrix();
    {
        int size;
        P2* a = getCircle(sizeIdx, size);

        glTranslatef(center.x, center.y, 0.f);
        glScalef(radius.x, radius.y, 1.f);


        glBegin(GL_TRIANGLE_FAN);
        {
            glVertex2f(0.f, 0.f);

            for (int i = 0; i != size - 1; ++i)
            {
                glVertex2f(a[i].x, a[i].y);
                glVertex2f(a[i+1].x, a[i+1].y);
            }

            glVertex2f(a[size - 1].x, a[size - 1].y);
            glVertex2f(a[0].x, a[0].y);
        }
        glEnd();
    }
    glPopMatrix();
}
Esempio n. 4
0
Node* CylinderSurfaceModule::evaluate(Context* ctx)
{
	NumberValue* heightValue = dynamic_cast<NumberValue*>(getParameterArgument(ctx,0));
	double h=1.0;
	if(heightValue)
		h=heightValue->getNumber();

	NumberValue* rValue = dynamic_cast<NumberValue*>(getParameterArgument(ctx,1));
	double r=1.0;
	if(rValue)
		r=rValue->getNumber();

	Value* centerValue=getParameterArgument(ctx,2);
	bool center=false;
	if(centerValue)
		center=centerValue->isTrue();

	double z1,z2;
	if(center) {
		z1 = -h/2;
		z2 = +h/2;
	} else {
		z1 = 0.0;
		z2 = h;
	}

	int f = getFragments(r,ctx);
	Polygon c1 = getCircle(r,f,z1);
	Polygon c2 = getCircle(r,f,z2);
	PrimitiveNode* p = new PrimitiveNode();

	for(int i=0; i<f; i++) {
		int j=(i+1)%f;
		p->createPolygon();
		p->appendVertex(c1.at(i));
		p->appendVertex(c2.at(i));
		p->appendVertex(c2.at(j));
		p->appendVertex(c1.at(j));
	}

	return p;
}
Esempio n. 5
0
  void MesherFixedEvenStem::calcVertices(otVertices* vertices)
  {
    if (circleRes <= 2) circleRes = 3;
    if (curveRes <= 0) curveRes = 1;

    vertexOffset = vertices->getCount();

    getCap(vertices, false);
    for (int j = 0; j<=curveRes; j++)
    {
      getCircle(j, vertices);
    }
    getCap(vertices, true);
  }
Esempio n. 6
0
list<pos_t> scanner::scanlistAroundWalls(pos_t center, const pixelshade_map &scanmap, unsigned int radius)
{
	list<pos_t> cups;
	if(r!=radius)
			update_circle(radius);

	list<pos_t> reachables = scanmap.getReachables(getCircle(center),center);

	for(auto i:reachables) {
		try {
			if( WSPACE_IS_CUP(scanmap.const_coordVal(i))) {
				cups.push_back(i);
			}
		} catch (const std::out_of_range& oor) {(void)oor;}
	}
	return move(cups);
}
Esempio n. 7
0
Node* CircleModule::evaluate(Context* ctx)
{
	NumberValue* rValue=dynamic_cast<NumberValue*>(getParameterArgument(ctx,0));

	double r=1;
	if(rValue) {
		r=rValue->getNumber();
	}

	int f = getFragments(r,ctx);
	Polygon c = getCircle(r,f,0);
	PrimitiveNode* p = new PrimitiveNode();

	if(r > 0) {
		p->createPolygon();
		for(int i=0; i<f; i++)
			p->appendVertex(c.at(i));
	}

	return p;
}
Esempio n. 8
0
void drawEllipse(
    const geom::Point2D& center,
    const geom::Point2D& radius,
    int sizeIdx)
{
    glPushMatrix();
    {
        int size;
        P2* a = getCircle(sizeIdx, size);

        glTranslatef(center.x, center.y, 0.f);
        glScalef(radius.x, radius.y, 1.f);

        glBegin(GL_LINE_LOOP);
        {
            for (int i = 0; i != size; ++i)
            {
                glVertex2f(a[i].x, a[i].y);
            }
        }
        glEnd();
    }
    glPopMatrix();
}
Esempio n. 9
0
Node* SphereModule::evaluate(Context* ctx)
{
	NumberValue* rValue=dynamic_cast<NumberValue*>(getParameterArgument(ctx,0));
	Value* centerValue=getParameterArgument(ctx,1);

	bool center=true;
	if(centerValue)
		center=centerValue->isTrue();

	double r=1.0;
	if(rValue) {
		r=rValue->getNumber();
	} else {
		NumberValue* dValue = dynamic_cast<NumberValue*>(ctx->getArgument(0,"diameter"));
		if(dValue)
			r=(dValue->getNumber()/2.0);
	}

	int f = getFragments(r,ctx);
	int ringCount=f/2;

	QList<Polygon> rings;
	for(int i=0; i<ringCount; i++) {
		double phi = (M_PI*(i+0.5)) / ringCount;
		double r2 = r*sin(phi);
		double z = r*cos(phi)+!center*r;
		Polygon c = getCircle(r2,f,z);
		rings.append(c);
	}

	PrimitiveNode* p = new PrimitiveNode();

	p->createPolygon();
	for(int i=0; i<f; i++)
		p->appendVertex(rings.at(0).at(i));

	for(int i = 0; i < ringCount-1; i++) {
		Polygon r1 = rings.at(i);
		Polygon r2 = rings.at(i+1);
		int r1i = 0, r2i = 0;
		while(r1i < f || r2i < f) {
			if(r1i >= f)
				goto next_r2;
			if(r2i >= f)
				goto next_r1;
			if((double)r1i / f <
					(double)r2i / f) {
next_r1:
				p->createPolygon();
				int r1j = (r1i+1) % f;
				p->prependVertex(r1.at(r1i));
				p->prependVertex(r1.at(r1j));
				p->prependVertex(r2.at(r2i % f));
				r1i++;
			} else {
next_r2:
				p->createPolygon();
				int r2j = (r2i+1) % f;
				p->appendVertex(r2.at(r2i));
				p->appendVertex(r2.at(r2j));
				p->appendVertex(r1.at(r1i % f));
				r2i++;
			}
		}
	}

	p->createPolygon();
	for(int i=0; i<f; i++)
		p->prependVertex(rings.at(ringCount-1).at(i));

	return p;
}
Esempio n. 10
0
Node* ConeModule::evaluate(Context* ctx)
{
	NumberValue* heightValue = dynamic_cast<NumberValue*>(getParameterArgument(ctx,0));
	NumberValue* r1Value = dynamic_cast<NumberValue*>(getParameterArgument(ctx,1));
	NumberValue* r2Value = dynamic_cast<NumberValue*>(getParameterArgument(ctx,2));
	Value* centerValue = getParameterArgument(ctx,3);

	decimal h=1.0;
	if(heightValue)
		h=heightValue->getNumber();

	decimal r1=0,r2=0;
	if(r1Value)
		r1=r1Value->getNumber();
	if(r2Value)
		r2=r2Value->getNumber();

	bool center = false;
	if(centerValue)
		center=centerValue->isTrue();

	decimal z1,z2;
	z1 = 0.0;
	z2 = h;

	Fragment fg=getSpecialVariables(ctx);
	decimal r=fmax(r1,r2);
	int f = fg.getFragments(r);

	Polygon* p1 = getCircle(r1,f,z1);
	Polygon* p2 = getCircle(r2,f,z2);

	QList<Point> c1=p1->getPoints();
	QList<Point> c2=p2->getPoints();

	PrimitiveNode* p = new PrimitiveNode();

	if(r1 > 0) {
		p->createPolygon();
		foreach(Point pt, c1)
			p->appendVertex(pt);
	}

	if(h==0.0)
		return p;

	for(int i=0; i<f; i++) {
		int j=(i+1)%f;
		if(r1 > 0) {
			p->createPolygon();
			p->appendVertex(c1.at(i));
			p->appendVertex(c2.at(i));
			p->appendVertex(c1.at(j));
		}
		if(r2 > 0) {
			p->createPolygon();
			p->appendVertex(c2.at(i));
			p->appendVertex(c2.at(j));
			p->appendVertex(c1.at(j));
		}
	}

	if(r2 > 0) {
		p->createPolygon();
		foreach(Point pt,c2)
			p->prependVertex(pt);
	}

	if(center) {
		AlignNode* n=new AlignNode();
		n->setCenter(true);
		n->addChild(p);
		return n;
	}

	return p;
}
Esempio n. 11
0
Node* SphereModule::evaluate(Context* ctx)
{
	NumberValue* rValue=dynamic_cast<NumberValue*>(getParameterArgument(ctx,0));
	Value* centerValue=getParameterArgument(ctx,1);

	bool center=true;
	if(centerValue)
		center=centerValue->isTrue();

	decimal r=0.0;
	if(rValue) {
		r=rValue->getNumber();
	} else {
		NumberValue* dValue = dynamic_cast<NumberValue*>(ctx->getArgument(0,"diameter"));
		if(dValue)
			r=(dValue->getNumber()/2.0);
	}
	if(r==0.0)
		return new PointNode();

	Fragment fg=getSpecialVariables(ctx);
	int f = fg.getFragments(r);
	int ringCount=f/2;

	decimal h=center?0.0:r;
	QList<Polygon> rings;
	for(int i=0; i<ringCount; i++) {
		decimal phi = (M_PI*(i+0.5)) / ringCount;
		decimal r2 = r*sin(phi);
		decimal z = r*cos(phi)+h;
		Polygon* c = getCircle(r2,f,z);
		rings.append(*c);
	}

	PrimitiveNode* p = new PrimitiveNode();

	p->createPolygon();
	Polygon top=rings.at(0);
	foreach(Point pt, top.getPoints())
		p->appendVertex(pt);

	for(int i = 0; i < ringCount-1; i++) {
		QList<Point> r1 = rings.at(i).getPoints();
		QList<Point> r2 = rings.at(i+1).getPoints();
		int r1i = 0, r2i = 0;
		while(r1i < f || r2i < f) {
			if(r2i >= f||(decimal)r1i/f<(decimal)r2i/f) {
				p->createPolygon();
				int r1j = (r1i+1) % f;
				p->prependVertex(r1.at(r1i));
				p->prependVertex(r1.at(r1j));
				p->prependVertex(r2.at(r2i % f));
				r1i++;
			} else {
				p->createPolygon();
				int r2j = (r2i+1) % f;
				p->appendVertex(r2.at(r2i));
				p->appendVertex(r2.at(r2j));
				p->appendVertex(r1.at(r1i % f));
				r2i++;
			}
		}
	}

	p->createPolygon();
	Polygon bottom=rings.at(ringCount-1);
	foreach(Point pt, bottom.getPoints())
		p->prependVertex(pt);

	if(center) {
		AlignNode* n=new AlignNode();
		n->setCenter(true);
		n->addChild(p);
		return n;
	}

	return p;
}
Esempio n. 12
0
	void playback()
	{
		std::ofstream timing_file("timing_APD.txt");
		std::ofstream timing_construct_file("timing_construct_APD.txt");

		std::string base_name = "../data/models/Box2D/spider_cinfigs/dump_transform";

		std::vector<Polygon> poly = readPolyFile("../data/models/Box2D/nazca_spider77.polys", 3);

		for(std::size_t i = 0; i < 7; ++i)
			distance_weight[i] = 1;

		{
			double Ix, Iy;
			inertia(poly, Ix, Iy);
			double rotation_weight = sqrt(Ix * Ix + Iy * Iy);
			distance_weight[0] = 1; distance_weight[1] = 1; distance_weight[2] = rotation_weight;
		}


		ContactSpaceSE2 contactspace(poly, poly, 0.2 * (getCircle(poly).second + getCircle(poly).second));

		SVMLearner learner;

		learner.setC(50);
		learner.setScaler(contactspace.getScaler());
		learner.setUseScaler(true);
		learner.setGamma(50);
		std::vector<ContactSpaceSampleData> contactspace_samples = contactspace.uniform_sample(100000);
		std::ofstream scaler_file("scaler.txt");
		scaler_file << contactspace.getScaler() << std::endl;
		learner.learn(contactspace_samples, contactspace.active_data_dim());
		learner.save("model.txt");
		std::cout << empiricalErrorRatio(contactspace_samples, learner) << " " << errorRatioOnGrid(contactspace, learner, 20) << std::endl;

		Collider2D collider(poly, poly);

		// flann::HierarchicalClusteringIndex<ContactSpaceSE2::DistanceType>* query_index = learner.constructIndexOfSupportVectorsForQuery<ContactSpaceSE2, flann::HierarchicalClusteringIndex, flann::HierarchicalClusteringIndexParams>();


		int knn_k = 2; // 50;

		std::vector<ContactSpaceSampleData> support_samples;
		learner.collectSupportVectors(support_samples);
		ExtendedModel<ContactSpaceSE2, flann::HierarchicalClusteringIndex> extended_model = constructExtendedModelForModelDecisionBoundary<ContactSpaceSE2, SVMLearner, flann::HierarchicalClusteringIndex, flann::HierarchicalClusteringIndexParams>(contactspace, learner, support_samples, 0.01, knn_k);

		for(std::size_t i = 1001; i < 9999; ++i)
		{
			std::stringstream ss;
			ss << i;
			std::string ret;
			ss >> ret;
			std::size_t len = ret.length();
			for(std::size_t j = 0; j < 4 - len; ++j)
				ret = "0" + ret;

			std::string filename = base_name + ret + ".txt";

			std::string PD_file_name= std::string("PD_APD") + ret + ".txt";


			std::ofstream PD_file(PD_file_name.c_str());

			std::vector<std::vector<std::pair<std::string, DataVector> > > frame = readDumpFile(filename);

			double timing_per_frame = 0;

			for(std::size_t j = 0; j < frame.size(); ++j)
			{
				std::cout << i << " " << j << std::endl;

				if(frame[j][0].first == "Wall" || frame[j][1].first == "Wall") continue;

				boost::timer t;
				DataVector q = relative2D(frame[j][0].second, frame[j][1].second);
				if(collider.isCollide(q))
				{
					// QueryResult PD_result = PD_query(learner, contactspace, query_index, q);
					QueryResult PD_result = PD_query(learner, contactspace, extended_model.index, extended_model.samples, q);
					PD_file << PD_result.PD << " ";
				}
				else
				{
					PD_file << 0 << " ";
				}

				timing_per_frame += t.elapsed();
			}

			timing_file << timing_per_frame << " ";
			timing_file.flush();

			PD_file.flush();
		}
	}
Esempio n. 13
0
        //for any one-time only initialization of the
        //   virtual world before any rendering takes place
        //   BUT after OpenGL has been initialized
        void init()
        {
            glEnable(GL_LIGHTING);
            
/*
            points = {
                {{ -4.0f, -5.0f }}, {{ -4.0f,  5.0f }},
                {{  0.0f,  7.0f }}, {{  4.0f,  5.0f }},
                {{  4.0f, -5.0f }}, {{  0.0f, -7.0f }}
            };
            
*/
            points3d = {
                {{ -4.0f, -5.0f,5.0f }},
                {{  4.0f,  5.0f,5.0f }},
                {{  8.0f,  7.0f,5.0f }},
                {{  12.0f,  5.0f,5.0f }},
                {{  16.0f, -5.0f,5.0f }},
                {{  20.0f, -7.0f,5.0f }}
            };

            auto circle = getCircle(2, 10);
            for (auto &v : circle) points.push_back({{ v[0], v[2] }});

            //spring:
            points3d = generateSpline(-50, 50, 150,
                                      [](float z)->float { return sin(z/2.0) * 15; },
                                      [](float x)->float { return cos(x/2.0) * 15; },
                                      [](float y)->float { return y; });
            // heart:
            /*
            points3d = generateSpline(-50, 50, 150,
                                      [](float z)->float {
                                            float t = z/5.0;
                                            return 16 * sin(t) * sin(t) * sin(t);
                                        },
                                      [](float x)->float {
                                            float t = x/5.0;
                                            return 13 * cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t);
                                        });
            */

            extrude = new Extrusion(points);
            extrude->setDepth(8);
            loft = new Loft(points, points3d);
            
            //Low-polygons dragon (5835 triangles)
            mymodelloader.load("data/model_lowpolygonstanforddragon.txt",100);
            deer = new Mesh("data/deer.obj");
            deer->setFlatColor({{.8, .2, .8}});
            deer->setTranslateX(10.5f);
            deer->setScale(0.5f);
            
            elephant = new Mesh("data/elephant-triangulated.obj");
            elephant->setFlatColor({{ .8, .1, .15 }});
            elephant->setTranslateX(-10.5f);
            elephant->setRotateY(-45.0f);
            
            pts = getCircle(8, 7);
            
            vec3 startNormal  = {{ 0, 1, 0 }};
            vec3 targetNormal = {{ 0.3333, 0.3333, 0.3333 }};
            mat3 rotationMatrix = getRotationMatrix(startNormal, targetNormal);
            
            for (auto &p : pts) {
                ptsTransformed.push_back(mult(rotationMatrix, p));
            }
            //Try this:
            //High-polygons dragon (original model of Stanford Dragon)
            // (871414 triangles) will take some minutes for it to get loaded
            //mymodelloader.load("data/model_highpolygonstanforddragon.txt",100);
            
            //mymodelloader.load("data/model_rose.txt", 0.2);
            
            //mymodelloader.load("data/model_shuttle.txt", 0.1);
            
            timeold = glutGet(GLUT_ELAPSED_TIME);
            
        }
Esempio n. 14
0
Snowflake::Snowflake(Point p, Terrain* t, Camera* camera) : Bone(getCircle())
{
	this->position = p;
	this->terrain = t;
	this->camera = camera;
}
Esempio n. 15
0
Snowflake::Snowflake(Terrain* t, Camera* camera) : Bone(getCircle())
{
	this->terrain = t;
	this->position = getRandomPosition(false);
	this->camera = camera;
}
Esempio n. 16
0
unordered_set<pos_t> scanner::getCircle(const pos_t &center)
{ return move(getCircle(center,r)); }