Exemplo n.º 1
0
void enemy::clean_plane(int i){
	for(int j = 0; j < 4; j++){
		if(_enemy[i].position[j].Y < 24){
			SetPos(_enemy[i].position[j]);
			printf(" ");
		}
	}
	new_plane(a, b, i);
}
Exemplo n.º 2
0
void			load_scene5_objects(t_scene *scene)
{
	add_object(scene, new_object(CONE, new_cone(new_vector(0, 1, -0.5),
		new_vector(8, 4, -5), 30), new_color(LIGHT_BLUE), 100));
	add_object(scene, new_object(CYLINDER, new_cylinder(new_vector(0, 1, -0.3),
		new_vector(-10, 0, -5), 2), new_color(PASTEL_BLUE), 100));
	add_object(scene, new_object(SPHERE, new_sphere(-1, 3, 2, 2),
		new_color(BLUE), 100));
	add_object(scene, new_object(PLANE, new_plane(0, -1, 0, 0),
		new_color(DARK_GREY), 100));
}
Exemplo n.º 3
0
void enemy::move_plane(){
	clean_plane();
	for(int i = 0; i < 10; i++){
		if(_enemy[i].position[3].Y+1 > 24){
			new_plane(a, b, i);
		}
		else{
			for(int j = 0; j < 4; j++)
				_enemy[i].position[j].Y++;
		}
		int pos = random(a, b).X%4;
		switch(pos){
		case 0://Ïò×óÒƶ¯
			{
				if(_enemy[i].position[0].X-1 < 1){
					new_plane(a, b, i);
				}
				else{
					for(int j = 0; j < 4; j++)
						_enemy[i].position[j].X--;
				}
				break;
			}
		case 1:
			{
				if(_enemy[i].position[2].X+1 > 49){
					new_plane(a, b, i);
				}
				else{
					for(int j = 0; j < 4; j++)
						_enemy[i].position[j].X++;
				}
				break;
			}
		default:enemy_bullet[i].initial_enemy_bullet(_enemy[i].position[3]);break;
		}
		enemy_bullet[i].move_enemy_bullet();
		enemy_bullet[i].draw_enemy_bullet();
	}
	draw_plane();
}
Exemplo n.º 4
0
int	handle_input(t_env* env, char* line)
{
	char**	input;
	int	nb_args;

	input = id_strwordtab(line, " \t", &nb_args);
	if (input == NULL)
		return (-1);
	if (id_strcmp(input[0], "c") == 0)
		return (fill_camera(env, input, nb_args));
	else if (id_strcmp(input[0], "S") == 0)
		return (new_sphere(env, input, nb_args));
	else if (id_strcmp(input[0], "P") == 0)
		return (new_plane(env, input, nb_args));
	else if (id_strcmp(input[0], "C") == 0)
		return (new_cylinder(env, input, nb_args));
	else if (id_strcmp(input[0], "Li") == 0)
		return (new_light(env, input, nb_args));
	id_wordtabfree(input);
	return (0);
}
Exemplo n.º 5
0
	void Polyhedron<Real>::addConvexPointToPolyhedron(
													const std::vector<plane<Real >> &planes,
													const std::vector<vector3<Real >> &vertices,
													const std::vector<PolyhedronEdge> &edges,
													const vector3<Real> &spot,
													std::vector<plane<Real >> &new_planes,
													std::vector<vector3<Real >> &new_vertices,
													std::vector<PolyhedronEdge> &new_edges)
	{
		//TODO wyprofilować i zoptymalizować

		/*
		 założenia:
		 1) żaden wierzchołek się nie powtarza
		 2) żadna płaszczyzna się nie powtarza
		 */

		vector3<Real> averagePoint(vector3<Real>::zero);

		Real scale = ((Real) 1.0) / vertices.size();
		for (uint i = 0; i < vertices.size(); ++i)
			averagePoint += vertices[i] * scale;

		new_vertices.reserve(vertices.size() + 1);
		new_vertices.clear();
		new_vertices.push_back(spot);
		int num_spot = 0; // new_vertices.size() -1;

		new_edges.clear();
		new_planes.clear();

		std::vector<bool> isPlaneUseful(planes.size());
		std::vector<int> oldNewVertexMapping(vertices.size());
		std::vector<int> oldNewPlaneMapping(planes.size());

		/*
		 klucz - indeks starego wierzchołka (!= spot) nowej krawędzi
		 wartość - druga ściana która wspóldzieli nową krawędź lub pusta gdy nieznana
		 */
		std::map<int, int> oldEdgesToNewWalls;

		for (uint i = 0; i < oldNewVertexMapping.size(); ++i)
			oldNewVertexMapping[i] = -1; //unused
		for (uint i = 0; i < oldNewPlaneMapping.size(); ++i)
			oldNewPlaneMapping[i] = -1; //unused


		for (uint i = 0; i < planes.size(); ++i)
		{
			bool planeUseful = (planes[i].distance(spot) >= -std::max(error, std::fabs(error * planes[i].d)));
			isPlaneUseful[i] = planeUseful;
			if (planeUseful)
			{
				new_planes.push_back(planes[i]);
				oldNewPlaneMapping[i] = new_planes.size() - 1;
			}
		}

		for (uint i = 0; i < edges.size(); ++i)
		{
			char usefulness = 0;
			if (isPlaneUseful[edges[i].num_p1])
				usefulness++;
			if (isPlaneUseful[edges[i].num_p2])
				usefulness++;

			if (usefulness == 0)
				continue;

			/*
			 wierczhołkom mogły pozmieniać się numery, następne 10 linijek to
			 załatwia
			 */
			int new_num_v1 = oldNewVertexMapping[edges[i].num_v1];
			if (new_num_v1 == -1)
			{
				new_vertices.push_back(vertices[edges[i].num_v1]);
				new_num_v1 = new_vertices.size() - 1;
				oldNewVertexMapping[edges[i].num_v1] = new_num_v1;
			}

			int new_num_v2 = oldNewVertexMapping[edges[i].num_v2];
			if (new_num_v2 == -1)
			{
				new_vertices.push_back(vertices[edges[i].num_v2]);
				new_num_v2 = new_vertices.size() - 1;
				oldNewVertexMapping[edges[i].num_v2] = new_num_v2;
			}

			/*
			 płaszczyznom też mogły się zmienić numery, ale tu test na -1
			 (wyrzucenie złej płaszczyzny) zanużymy w podprzypadku.
			 */

			int new_num_p1 = oldNewPlaneMapping[edges[i].num_p1];
			int new_num_p2 = oldNewPlaneMapping[edges[i].num_p2];

			if (usefulness == 2) // obie płaszczyzny istnieją, super.
			{
				//PolyhedronEdge(uint _num_v1, uint _num_v2, uint _num_p1, uint _num_p2)
				new_edges.push_back(PolyhedronEdge(new_num_v1, new_num_v2, new_num_p1, new_num_p2));
			}
			else
			{ // jedna istnieje, druga nie.
				if (new_num_p1 == -1) // dla ułatwienia, zawsze druga nieistnieje
				{
					new_num_p1 = new_num_p2;
					new_num_p2 = -1;
				}

				// tworzę nową ścianę
				plane<Real> new_plane(new_vertices[new_num_v1], new_vertices[new_num_v2], spot);
				
				/*
				 plane<Real> new_plane2(plane<Real>::stablePlaneFromPoints(new_vertices[new_num_v1], new_vertices[new_num_v2], spot));
				
				NEWLOG("p1:[%f\t][%f\t][%f\t][%f\t]\np2:[%f\t][%f\t][%f\t][%f\t]",
					 new_plane.normal.x, new_plane.normal.y, new_plane.normal.z, new_plane.d,
					 new_plane2.normal.x, new_plane2.normal.y, new_plane2.normal.z, new_plane2.d);
				*/
				
				if (new_plane.distance(averagePoint) < -std::max(error, std::fabs(error * new_plane.d)))
					new_plane.flip();

				new_planes.push_back(new_plane);
				new_num_p2 = new_planes.size() - 1;

				//dodaję STARĄ krawędź

				new_edges.push_back(PolyhedronEdge(new_num_v1, new_num_v2, new_num_p1, new_num_p2));

				/*
				 próbuję dodać od 0 do 2 NOWYCH KRAWĘDZI
				 TUTAJ new_num_p1 jest już BEZUŻYTECZNE, (wskazuje starą ścianę, już załatwioną)
				 new_num_p2 wskazuje nowoutworzoną ścianę 
				 new_num_v1 i new_num_v2 wskazują stare wierzchołki
				 
				 poniższy kod działa tak:
				 dla każdego ze starych wierzchołków (new_num_v1, new_num_v2)
				 mam krawędź (stary_wierzchołek, spot) którą identyfikuję
				 za pomocą indeksu starego wierzchołka (wallKey)
				 
				 sprawdzam w mapie: jeśli druga ściana przyległa do tej krawędzi
				 już istnieje, to mogę dodać krawędź do zbioru nowych
				 (bo wreszcie znam wszystkie arg. konstruktora)
				 jeśli jeszcze nie istenieje, to zostawiam informacje o tej ścianie
				 i czekam, aż krawędź zostanie dodana przy okazji dodawania ściany
				 przyległej.
				 */
				std::map<int, int>::iterator secondWall;

				// najpierw sprawdzamy ścianę przyległą z new_num_v1
				int wallKey = new_num_v1;
				secondWall = oldEdgesToNewWalls.find(wallKey);

				if (secondWall == oldEdgesToNewWalls.end()) // nie znamy drugiej ściany dla tej krawędzi.
				{
					oldEdgesToNewWalls[wallKey] = new_num_p2; // to ją dodajemy i kiedyś do tego wrócimy
					//NEWLOG("pkt %d czeka", wallKey);
				}
				else // wiemy z którą ścianą ta krawędź będzie współdzielona
				{
					//NEWLOG("pkt %d się doczekał", secondWall->first);
					new_edges.push_back(PolyhedronEdge(new_num_v1, num_spot, new_num_p2, secondWall->second));
				}
				// teraz sprawdzamy ścianę przyległa z new_num_v2

				wallKey = new_num_v2;
				secondWall = oldEdgesToNewWalls.find(wallKey);

				if (secondWall == oldEdgesToNewWalls.end()) // nie znamy drugiej ściany dla tej krawędzi.
				{
					oldEdgesToNewWalls[wallKey] = new_num_p2; // to ją dodajemy i kiedyś do tego wrócimy
					//NEWLOG("pkt %d czeka", wallKey);
				}
				else // wiemy z którą ścianą ta krawędź będzie współdzielona
				{
					//NEWLOG("pkt %d się doczekał", secondWall->first);
					new_edges.push_back(PolyhedronEdge(new_num_v2, num_spot, new_num_p2, secondWall->second));
				}
			}
		}
	}