#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <GLUT/glut.h>
#include <OpenGL/glext.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include "modelado.h"
#include "matematicas.h"

float dameX(float R, int N, int n) {
	float x = (float)R*cos(n*(2*PI)/N);
	return x;
}

float dameZ(float R, int N, int n) {
	float z = (float)R*sin(n*(2*PI)/N);
	return z;
}

void paralelo(float R, int N, float y) {
	float x, z;
	int i;

	glBegin(GL_LINE_LOOP);
		for(i = 0; i < N; i++) {
			x = dameX(R, N, i);
			z = dameZ(R, N, i);
			glVertex3f(x, y, z);
		}
	glEnd();
}

void tira(float R, float dR, float y, float dy, float N) {
  int i;
  float x, z;

  glDisable(GL_LIGHTING);
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  glBegin(GL_QUAD_STRIP);
  for(i = 0; i <= N; i++) {
    x = dameX(R, N, i);
    z = dameZ(R, N, i);
    glVertex3f(x, y, z);
    x = dameX(R+dR, N, i);
    z = dameZ(R+dR, N, i);
    glVertex3f(x, y+dy, z);
  }
  glEnd();
  glEnable(GL_LIGHTING);
}

void cinta(float R, float dR, float y, float dy, float N) {
  int i;
  float x, z;

  //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  glBegin(GL_QUAD_STRIP);
  for(i = 0; i <= N; i++) {
    x = dameX(R, N, i);
    z = dameZ(R, N, i);
    glVertex3f(x, y, z);
    x = dameX(R+dR, N, i);
    z = dameZ(R+dR, N, i);
    glVertex3f(x, y+dy, z);
  }
  glEnd();
}

void formaAlambre(float H, int N, float(*f)(float y)) {
  int i;
  float y, r1, r2;
  
  for(i = 0; i < N; i++) {
    y = i*H/N-(H/2);
    r1 = f(y);
    r2 = f(y+(H/N));
    tira(r1, r2-r1, y, H/N, N);
  }
}

void cilindroAlambre(int N) {
	formaAlambre(1.0f, N, fcl);
}

void conoAlambre(int N) {
	formaAlambre(1.0f, N, fc);
}

float fc(float y) {
	return (y+0.5f);
}

void conoSolido(int N) {
	formaSolida(1.0f, N, fc);
}

float fcl(float y) {
	return(0.5);
}

// dibujo de las tapas en conos y cilindros
void tapa(float R, float y, int N) {
	int i;
	float x, z;
	
	glBegin(GL_POLYGON);
	
	for(i = 0; i < N; i++) {
		x = dameX(R, N, i);
		z = dameZ(R, N, i);
		glVertex3f(x, y, z);
	}
	glEnd();
}

float fCilindro(float y) {
	return(0.5);
}

//cilindro s—lido
void cilindroSolido(int N) {
	formaSolida(1.0f, N, fCilindro);
	
	//tapa superior
	tapa(fCilindro(0.5), 0.5, N);
	//tapa inferior
	tapa(fCilindro(0.5), -0.5, N);
}

void formaSolida(float H, int N, float(*f)(float y)) {
  int i;
  float y, r1, r2;
  
  for(i = 0; i < N; i++) {
    y = i*H/N-(H/2);
    r1 = f(y);
    r2 = f(y+(H/N));
    cinta(r1, r2-r1, y, H/N, N);
  }
}



void escena(void) {
}
