martes, 9 de octubre de 2012

LA RASTERIZACIÓN


es el proceso por el cual una imagen descrita en un formato gráfico vectorial se convierte en un conjunto de píxeles o puntos para ser desplegados en un medio de salida digital, como una pantalla de computadora, una impresora electrónica o una imagen de mapa de bits (bitmap). Este procedimiento se suele usar en momentos muy concretos:
§  Cuando se trabaja con imágenes de una gran complejidad (con muchos objetos independientes, muchos rellenos degradados, muchas capas, etc.) Ahora bien, puesto que al crear un mapa de bits se elimina toda información de los objetos vectoriales, debe tenerse en cuenta la posibilidad de efectuar copias de seguridad del archivo vectorial antes de ser rasterizado, o bien esperar a que la parte de la imagen que se va a rasterizar sea ya definitiva...
§  Cuando se van a aplicar filtros a la imagen resultante, cosa que no se efectúa con los objetos iniciales.
El resultado de este método de trabajo híbrido es un fichero que presenta ciertas partes vectoriales y ciertas partes bitmap. El fichero puede guardarse sin mayor problema en el formato correspondiente al programa de ilustración (en algunos casos, se permite que el mapa de bits no forme parte del archivo, sino que se enlace externamente al fichero vectorial solamente).

• El sistema gráfico dibuja estas primitivas transformándolos en pixels ----Rasterización


• Los métodos de conversión deben ser lo más eficientes posible
• La primitiva “Punto” es la más sencilla:
– se coloca la intensidad deseada en la celda de memoria del frame buffer correspondiente
– Cuando el haz de electrones pase por esa línea horizontal (scan-line), emitirá al pasar por esa
Posición
Dibujo de líneas rectas
• Para dibujar líneas rectas, habrá que calcular las posiciones intermedias entre los dos
extremos
• Este problema no existía en las pantallas vectoriales o plotters
• Sin embargo, las posiciones de los pixels son valores enteros, y los puntos obtenidos de
la ecuación son reales Æ existe un error (aliasing)
• A menor resolución, mayor es el efecto
• Es necesario disponer de métodos para convertir primitivas en pixels de la forma
más eficiente posible


Rasterización de Circunferencias
Como primera observación: el círculo tiene simetría central, que se aprovecha utilizando el {0,0} comocentro y rasterizando solamente un octavo del círculo. ¿Por que un octavo, y no una porción menor? Porque las simetrías que produce son sólo cambios de signo e intercambio de coordenadas, que transforman enteros en enteros; como puede verse en la figura siguiente.

Ecuacion implicita  x2+y2=r2
Ecuación explicita  y =raiz  r2-x2

En los algoritmos se aprovechan las simetrías



Se calcula el tramo que va de 90º a 45º, representado en el dibujo mediante un punto genérico de coordenadas {xi, yi}. Los puntos simétricos se pintan con el mismo par de enteros intercambiados o cambiados de signo. Al pintar los puntos hay que trasladarlos del origen al centro real. 
Iremos directamente al método del punto medio con el algoritmo de Bresenham. La curva es de tendencia horizontal, con x creciente e y decreciente; haremos que x aumente siempre una unidad. Hay que averiguar si el próximo punto medio está dentro o fuera de la circunferencia. Si el punto medio está dentro pintamos el píxel E y si esta fuera pintamos el SE.
Un punto cualquiera {x, y} está fuera del círculo si x2 + y2 > r2. Habrá que analizar si el próximo punto medio (en xi +1 e yi −.5, dado que x crece e y decrece) está o no dentro de la circunferencia:


Clases de algoritmos de iluminación
Raytracing o trazado de rayos 
El algoritmo de trazado de rayos extiende la idea de trazar los rayos para determinar las superficies visibles con un proceso de sombreado (cálculo de la intensidad del píxel) que tiene en cuenta efectos globales de iluminación como pueden ser reflexiones, refracciones o sombras arrojadas.
Para simular los efectos de reflexión y refracción se trazan rayos recursivamente desde el punto de intersección que se está sombreando dependiendo de las características del material del objeto intersecado.
Para simular las sombras arrojadas se lanzan rayos desde el punto de intersección hasta las fuentes de luz.


MÉTODO DE LA CARA POSTERIOR

En método rápido y sencillo de objeto-espacio para identificar las caras traseras de un poliedro se basa en las pruebas “interna y externa”. Un punto (x,y,z) está “adentro” de la superficie de un polígono con los planos A, B, C y D si,

Ax + By + Cz + D < 0
Cuando un punto interior está a lo largo de la vista de la superficie, el polígono debe ser una cara posterior (estamos en el interior de esa cara y no podemos ver el frente de la misma desde nuestra posición de vista).
Podemos simplificar esta prueba al considerar el vector normal N, para una superficie de polígono, que tiene los componentes cartesianos (A, B, C). En general, si V es un vector en la dirección de vista desde la posición del observador (o de la “cámara”), entonces este polígono es una cara posterior si,
V . N > 0
Además, si se han convertido las descripciones del objeto a coordenadas de proyección y nuestra dirección de vista es paralela al eje de vista de Zv, entonces V = (0, 0, Vz) y
V . N = Vz C
de modo que sólo debemos de considerar el signo de C, el componente de z del vector normal N.
En un sistema de vista de lado derecho, con dirección de vista a lo largo del eje negativo de Zv, el polígono es una cara posterior si C = 0, dado que nuestra posición de vista toca ese polígono. Por tanto, en general, podemos designar cualquier polígono como una cara posterior si su vector normal tiene un valor del componente de z:

C <= 0
MÉTODO DEL Z BUFFER (O MÉTODO DEL BUFFER CON PROFUNDIDAD)

Un planteamiento de imagen-espacio que se utiliza en forma común para detectar superficies visibles es el método de buffer con profundidad, que compara las profundidades de las superficies en cada posición de píxel en el plano de proyección. Este procedimiento se conoce también como el método de buffer z, ya que por lo regular, la profundidad del objeto se mide desde el plano de visión a lo largo del eje de las z de un sistema de vista. Cada superficie de una escena se procesa por separado, un punto a la vez a lo largo de la superficie. Por lo general el método se aplica en escenas que sólo contienen superficies de polígono porque los valores de profundidad se pueden calcular con gran rapidez y es fácil implementar el método. No obstante, el método se puede aplicar a superficies no planas.
Cuando se convierten las descripciones de los objetos a coordenadas de una proyección, cada posición (x, y, z) en una superficie de polígono corresponde al punto de proyección ortogonal (x, y) en el plano de visión. Por tanto, para cada posición del píxel (x, y) en el plano de visión, se pueden comparar las profundidades del objeto al comparar los valores de z.
Podemos implementar el algoritmo del z buffer en coordenadas normalizadas, de manera que los valores de z van de 0 en el plano de recorte posterior a zmax en el plano de recorte frontal. Se puede establecer el valor de zmax  sea como 1 (para un cubo unitario) o como el valor mas alto que sea posible almacenar en el sistema.
Como lo implica el nombre de este método, se requieren dos áreas del buffer. Se utiliza un buffer con profundidad para almacenar los valores de profundidad para cada posición de (x, y) conforme se procesan las superficies y el buffer de enfriamiento almacena los valores de intensidad para cada posición. Al principio, todas las posiciones en el buffer con profundidad se establecen como 0 (profundidad mínima) y se inicializa el buffer de enfriamiento a la intensidad del fondo. De este modo se procesa cada superficie que se lista en la tabla de polígonos, una linea a la vez, al calcular la profundidad (valor de z) en cada posición de píxel (x, y). La profundidad calculada se compara con el valor almacenado en forma previa en el buffer con profundidad de esa posición. Si la profundidad que se calcula es mayor que el valor que se almacena en el buffer con profundidad, se almacena el nuevo valor y se determina la intensidad de la superficie en esa posición y se sitúa en la misma posición de xy en el buffer de enfriamiento.

MÉTODO DE LÍNEA DE RASTREO (SCAN-LINE METHOD)

Este método de imagen-espacio para eliminar superficies ocultas es una extensión del algoritmo de línea de rastreo para llenar interiores de polígonos. En lugar de llenar sólo una superficie, ahora manejamos superficies múltiples. Conforme se procesa cada línea de rastreo, se analizan todas las superficies de polígono que intersectan esas esa línea para determinar cuáles son visibles. A lo largo de cada línea de rastreo, se realizan los cálculos de profundidad para cada superficie que se traslapa a fin de determinar cuál está mas cerca del plano de visión. Cuando se determina la superficie visible, se captura el valor de intensidad para esa posición en el buffer de enfriamiento.

Para ello suponemos que se establecen tablas para las diversas superficies, las cuales incluyen tanto una tabla de arista como una tabla de polígono. La tabla de aristas contiene los extremos de las coordenadas para cada línea de la escena, la pendiente inversa de cada línea y apuntadores en la tabla de polígono para identificar las superficies que se limitan por cada línea. La tabla de polígono contiene los coeficientes de la ecuación del plano para cada superficie, información de intensidad para las superficies y, quizá, apuntadores a la tabla de aristas. Para facilitar la búsqueda de superficie que intersectan a una línea de rastreo determinada, podemos establecer una lista activa de aristas con base en la información de la tabla de aristas. Esta lista activa contendrá solo aristas que cruzan la línea de rastreo actual, clasificadas en orden creciente de x. Además, definimos una bandera para cada superficie que se establece como activa o inactiva para indicar si una posición a lo largo de una línea de rastreo está adentro o afuera de la superficie. Las líneas de rastreo se procesan de izquierda a derecha. En la frontera del extremo izquierdo de una superficie, se activa la bandera de la superficie y en la frontera del extremo derecho, ésta se desactiva.



La figura  muestra el método de línea de rastreo para localizar las porciones visibles de las superficies para las posiciones de píxel a lo largo de la linea. La lista activa para la línea de rastreo 1 contiene información de la tabla de aristas para las aristas AB, BC, EH y FG. Para las posiciones a lo largo de esta línea de rastreo entre las aristas AB y BC, sólo se activa la bandera para la superficie S1. Por tanto, no se requieren cálculos de profundidad y la información de intensidad para la superficie S1 se captura a partir de la tabla de polígono en el búfer de enfriamiento. De modo similar, entre las aristas EH y FG, sólo se activa la bandera para la superficie S2 . No hay mas posiciones a lo largo de la línea de rastreo 1 que intersecten superficies, de manera que los valores de intesidad de las otras áreas se establecen como la intensidad del fondo. Se pueden cargar la intensidad del fondo a través del buffer en una rutina de inicialización.
Podemos aprovechar la coherencia a lo largo de las línea de rastreo conforme pasamos de una línea de rastreo a la siguiente. Es posible acceder cualquier número de superficies de polígono que se traslapan con este método. Las banderas de las superficies se establecen para indicar si una posición está adentro o afuera y se llevan a cabo los cálculos de profundidad cuando hay superficies que se superponen. Cuando se emplean estos métodos de coherencia, es necesario tener precaución para rastrar qué sección de la superficie es visible en cada línea de rastreo. Este planteamiento funciona sólo si las superficies no se intersectan o se traslapan en forma cíclica entre sí. Si en una escena se tiene cualquier clase de superposición cíclica, podemos dividir las superficies para eliminar las superposiciones. Las líneas de rayas en esta figura dónde se podrían subdividir los planos, de modo que se eliminen las superposiciones cíclicas.

Algoritmos de sombreado

ALGORITMO DE GOURAUD

El algoritmo de Gouraud se basa en calcular los vector normales en un vértice común a varias caras y realizar el promedio entre ellos, interpolando luego los colores por la cara. Veamos que se quiere decir con esto:

Supongamos que tenemos una cara de tres lados, A, B y C. Esos vértices pertenecen no solo a esa cara, sino también a las caras que estén en contacto con la primera. Al usar los algoritmos de iluminación, veíamos cada uno de esos vértices como tres (o más, depende del número de caras en contacto) vértices distintos, cada uno con su nivel de luz correspondiente. Esto es correcto en objetos con caras, pero no es un efecto deseable en una figura de revolución, pues se supone que es un solo punto. Entonces, si suponemos que el punto A pertenece a las caras a, b y c, lo que haremos será hallar los tres vectores normales en A respecto de a, b y c. Esos tres vectores los promediamos (con la media aritmetica), y nos dará el vector normal que habría en ese punto si la figura fuese realmente de revolución, y no una aproximación hecha con superficies planas.
Una vez que hemos calculado los vectores normales teóricos en cada punto, hallamos la iluminación de estos. Esto nos da que en la cara que teníamos, el punto A tiene un nivel de luz, el B otro y el C otro más, los cuales no tienen por qué ser iguales. ¿Cómo podemos pintar la cara, si tenemos tres niveles distintos? La solución consiste en interpolar los colores: si en A tiene un valor y en B tiene otro, en el punto medio de ambos tendrá la media.
Se puede hacer una simplificación, pues es fácil demostrar que el nivel de iluminación del punto calculado con la media de los tres vectores normales es igual a la media de los niveles de iluminación calculados con cada uno de los vectores normales. De esta forma, calcularemos la iluminación del punto con respecto a cada cara y hallaremos su media.
Para ahorrar tiempo de ejecución, podemos calcular primero la iluminación de cada punto (la media) y almacenarla en una tabla. Así no hará falta calcularlo repetidas veces, una por cada cara que comparta el vértice.
Pero, ¿cómo interpolamos los colores? Es fácil. Supongamos que tenemos una cara triangular, formada por los puntos A=(X0,Y0), B=(X1,Y1) y C=(X2,Y2). El nivel de luz en cada punto será La, Lb y Lc respectivamente. Sabemos que la ecuación de la recta que usamos es:

X = X0 + a*(X1-X0) Y = Y0 + a*(Y1-Y0)

siendo 'a' un valor entre 0 y 1. Pues bien, esta ecuación lo que hace es promediar los puntos situados entre X1 y X0 (o Y1 e Y0 en la otra), por lo que podemos usarla para hacer el promedio de los colores. El problema es que esto solo nos traza una línea. ¿Cómo podemos hacer para rellenar la figura completa?

La solución es simple: consideramos la línea que une los puntos A y B. Sería:

(X,Y) = A + a*(B-A)

En el punto (X,Y) (un punto cualquiera de la recta AB), el nivel de luz será L(x,y) = La + a*(Lb-La) (un detalle importante: el valor de 'a' es el mismo para todas las ecuaciones). Ahora sólo tenemos que repetir el proceso para cada punto de la recta que une C y (X,Y). De este modo, lo que hacemos es calcular un punto de la recta AB (el punto (X,Y) y promediar entre él y C; calcular el siguiente punto de la recta AB y promediar entre él y C. Y así hasta acabar con la recta AB.

ALGORITMO DE PHONG PARA ILUMINACIÓN Y REFRACCIÓN

El método pong para iluminación local fue desarrollado por Bui Tuong Phong y puede producir cierto grado de realimo en objetos tridimensionales combinando tres elementos: luz disfusa, especular y ambiental para cada punto en una superficie. Emplea muchas suposiciones, como por ejemplo que todas las luces son puntos, solouna superficie geométrica es considerada, solo modelos locales de disfusa y especular. Colores especulares son los mismos que los colores de luz y el ambiente es constante y global.

Disfuso:

Id = Ii kd cosθ     

donde Ies el brillo de la fuente de luz puntual. θ es el ángulo entre la superficie normal y la dirección de fuente de luz. kd

Para múltiples luces:


Donde L y N son vectores unitarios, L_n es el director director de la superficie a la n-ava fuente de luz.

Luz especular (luz alta)



Donde n indica la refractividad de la superficie. Infinito significará un espejo perfecto. Omega es el ángulo entre el espejo y el visor. R es la dirección de la luz especular y V es el actual vector. Este fallo produce la radiosidad, un fallo en Phong.
Combinando luces disfusas y especular es suficiente para la exactitud local. Para imitar las condiciones globales un elemento llamado “ambiente” debe ser añadido para proveer iluminación general, usualmente como un valor constante.

Ig = Iaka

Combinando los tres, obtenemos




Asumiendo la no reducción de la intensidad de luz con la distancia, la cual puede ser añadida si se desea.
Este es un modelo empírico, el cual no está basado en física, pero tiene una observación física. Phong observó que para cada pequeña superficie brillante la luz especular fue pequeña y la intensidad decae rápidamente, mientras que para superficies mas romas fue mas larga y decayó mas lentamente.




B spline




Bezier



lunes, 7 de mayo de 2012

imagen1

imagen2

imagen3

imagen4

imagen5



Creación de bases de datos

¿Qué es una tabla?
Como por ejemplo en Word, una tabla es una lista de datos, organizados por columnas y filas. Por ejemplo, la siguiente tabla muestra unas películas dentro de una lista.
 imagen 1.
Dentro de un sistema gestor de bases de datos, la información se puede organizar dentro de tablas, en las que solo tendremos que decidir qué columnas queremos que tenga y de que tipo va a ser la información que tendrán (Numérico, texto, etc)
Creando una base de datos
El nombre de nuestra base de datos será Videoteca. Se  abrirá una  ventana, donde abajo del todo veremos “Crear una base de datos”, en ella escribiremos el nombre de nuestra nueva base de datos, en este caso: Videoteca.

imagen 2

PD: en lo nombres no podemos escribir caracteres como, comas, acentos, ñ, etc.
Si todo ha ido bien, ahora nos pondrá que ya esta creada.

imagen 3

Crear tablas y campos para la base de datos
En el apartado anterior hemos aprendido a crear una base de datos MySQL, y he creado una, a la cual la he llamado “Videoteca”. Ahora el siguiente paso seria crear las tablas y los campos que nos hagan falta para posteriormente meter los datos.
Creando una Tabla y sus campos en MySQL
Existen varias formas y programas diferentes para crear una tabla en una base de datos MySQL, como  phpMyAdmin, el motivo de hacerlo desde phpMyAdmin y no de otra forma es porque comúnmente, en todos los servidores ya sean caseros o de un hosting privados siempre suele tener un phpMyAdmin a mano.
En primer lugar vamos a nuestro phpMyAdmin y seleccionamos la base de datos que hemos creado anteriormente (Videoteca) como vemos en la siguiente imagen:

imagen 4

Ahora se cargara la base de datos y nos saldrá un mensaje que pone “no se han encontrado tablas en la base de datos” y más abajo veremos un pequeño formulario para crear nuestra primera tabla.
En nombre pondremos película y en número de campos pondremos 3.

imagen 5

Ahora damos a continuar y se nos cargara la pagina para crear los campos, en este caso serán los 3 que hemos puesto antes.
Veremos que tendremos que rellenar varios datos, pero no tenemos que preocuparnos, ya que explicaremos uno a uno lo que significa.
·         En Campo, pondremos el nombre del campo.
·         En Tipo, debemos poner el tipo de datos que se van a incluir en el campo, por ejemplo pondríamos:
o    VARCHAR si vamos a incluir un texto inferior a 255 caracteres ejemplo (nombres, DNI, direcciones).
o    TEXT si vamos a incluir un texto más largo de 255 caracteres ejemplo (noticias).
o    INT si deseamos escribir exclusivamente números.
o    DATE para poner fechas, o DATETIME, si queremos poner hora y fecha.
·         En Longitud, deberemos de poner el número de caracteres máximo que puede contener dicho campo, esto no hace falta para todos los tipos de datos, ya que por ejemplo para los de tipo DATE, o TEXT no hace falta, pero para los INT y VARCHAR es imprescindible.
·         En Nulo, podemos elegir Null o Not Null dependiendo si queremos que el campo pueda estar vacío (sin datos) o no.
·         En predeterminado, podemos poner lo que queramos que se ponga en el campo en el caso de que no se rellenen los datos o que se rellene de forma incorrecta.
·         En extra, vemos que podemos seleccionar Auto_Increment, esto nos sirve para llevar un orden de los datos que tenemos, por ejemplo, creamos un campo llamado id, de tipo INT y le ponemos auto_increment, de esta forma cada vez que se cree un nuevo dato en este campo se le sumara 1 a la id anterior, de forma que podremos llevar un pequeño orden.
Debemos de poner en cada uno de los 3 campos:
Campo 1
Nombre: id_pelicula
Tipo: INT
Nulo: Not Null
Extra: Auto_increment
Y marcamos la llave de Primaria Descripción: http://www.cristalab.com/images/tips/php/crear-mysql/crear-mysql07.png
Campo 2
Nombre: pelicula
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null
Campo 3
Nombre: Director
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null
Índice
Un índice (o KEY, o INDEX) es un grupo de datos que MySQL asocia con una o varias columnas de la tabla. En este grupo de datos aparece la relación entre el contenido y el número de fila donde está ubicado.
Los índices -como los índices de los libros- sirven para agilizar las consultas a las tablas, evitando que mysql tenga que revisar todos los datos disponibles para devolver el resultado.
Creación de índices
Podemos crear el índice a la vez que creamos la tabla, usando la palabra INDEX seguida del nombre del índice a crear y columnas a indexar (que pueden ser varias):
INDEX nombre_indice (columna_indexada, columna_indexada2...)

La sintaxis es ligeramente distinta segun la clase de índice:
PRIMARY KEY (nombre_columna_1 [,nombre_columna2...]) UNIQUE INDEX nombre_indice (columna_indexada1 [,columna_indexada2 ...]) INDEX nombre_index (columna_indexada1 [,columna_indexada2...])
Podemos también añadirlos a una tabla después de creada:
ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada);
Si queremos eliminar un índice: ALTER TABLE tabla_nombre DROP INDEX nombre_indice¿para que sirven ?
LOs index permiten mayor rápidez en la ejecución de las consultas a la base de datos tipo SELECT ... WHERE
La regla básica es pues crear tus índices sobre aquellas columnas que vayas a usar con una cláusula WHERE, y no crearlos con aquellas columnas que vayan a ser objeto de un SELECT: SELECT texto from tabla_libros WHERE autor = Vazquez; En este ejemplo, la de autor es una columna buena candidata a un indice; la de texto, no.

Otra regla básica es que son mejores candidatas a indexar aquellas columnas que presentan muchos valores distintos, mientras que no son buenas candidatas las que tienen muchos valores idénticos, como por ejemplo sexo (masculino y femenino) porque cada consulta implicará siempre recorrer prácticamente la mitad del índice
.

MyISAM
Es la tecnología de almacenamiento de datos usada por defecto por el sistema administrador de bases de datos relacionales MySQL. Este tipo de tablas están basadas en el formato ISAM pero con nuevas extensiones. En las últimas versiones de MySQL, el motor InnoDB está empezando a reemplazar a este tipo de tablas por su capacidad de ejecutar transacciones de tipo ACID y bloqueo de registros e integridad referencial.
Cada tabla de tipo MyISAM se guarda en tres archivos. Los archivos tienen el nombre de la tabla y una extensión que indica el tipo de archivo,
§  .frm almacena la definición de la tabla
§  .MYD (MyData) contiene los registros de la tabla
§  .MYI (MyIndex) contiene los índices de la tabla
Para: especificar que deseas usar el tipo de tablas MyISAM, se indica con la opción ENGINE al crear la tabla o modificarla, por ejemplo
   CREATE TABLE t (i INT) ENGINE = MYISAM;
La principal característica de este tipo de almacenamiento es la gran velocidad que obtiene en las consultas, ya que no tiene que hacer comprobaciones de la integridad referencial, ni bloquear las tablas para realizar las operaciones por la ausencia de características de atomicidad. Este tipo de tablas está especialmente indicado para sistemas que no tienen un número elevado de inserciones como pueden ser las páginas web.


Creación de tablas
Muchas son las opciones que se ofrecen al generar tablas. No vamos a tratarlas detalladamente pues sale de lo estrictamente práctico. Tan sólo mostraremos algunos de los tipos de campos que pueden ser empleados en la creación de tablas con sus características:
Tipo
Bytes
Descripción
INT o INTEGER
4
Números enteros. Existen otros tipos de mayor o menor longitud específicos de cada base de datos.
DOUBLE o REAL
8
Números reales (grandes y con decimales). Permiten almacenar todo tipo de número no entero.
CHAR
1/caracter
Alfanuméricos de longitud fija predefinida
VARCHAR
1/caracter+1
Alfanuméricos de longitud variable
DATE
3
Fechas, existen multiples formatos específicos de cada base de datos
BLOB
1/caracter+2
Grandes textos no indexables
BIT o BOOLEAN
1
Almacenan un bit de información (verdadero o falso)


Las tablas InnoDB
Creación de una tabla InnoDB
La creación de tablas de este tipo no presenta ninguna dificultad añadida. El proceso es idéntico a las tablas habituales sin más que añadir Type=InnoDB después de cerrar el paréntesis de la sentencia de creación de la tabla.
Este script crea una tabla InnoDB con idénticos campos a los utilizados en el caso de la tabla MyISAM que hemos visto en páginas anteriores. La sintaxis, muy similar a la utilizada allí es esta:
<?php
#definimos (en minusculas) el nombre de la nueva tabla
$tabla="demoinno";
# escribimos la cadena que contiene la sentencia de creación de la nueva tabla
$crear="CREATE TABLE  $tabla (";
$crear.="Contador TINYINT(8)  UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,";
$crear.="DNI CHAR(8) NOT NULL,  ";
$crear.="Nombre VARCHAR (20)  NOT NULL, ";
$crear.="Apellido1 VARCHAR (15)  not null, ";
$crear.="Apellido2 VARCHAR (15)  not null, ";
$crear.="Nacimiento DATE DEFAULT '1970-12-21', ";
$crear.="Hora TIME DEFAULT '00:00:00', ";
$crear.="Sexo Enum('M','F') DEFAULT 'M' not null, ";
$crear.="Fumador CHAR(0) , ";
$crear.="Idiomas SET(' Castellano',' Francés','Inglés',
         ' Alemán',' Búlgaro',' Chino'), ";
$crear.=" PRIMARY KEY(DNI), ";
$crear.=" UNIQUE auto (Contador)";
$crear.=")";
# esta es la única diferencia con el proceso de
# creación de tablas MyISAM
 $crear.=" Type=InnoDB";
/* tenemos completa la sentencia MYSQL  solo falta ejecutarla crear la conexión y ejecutarla */

/*incluimos los parámetros de conexión */
include('mysqli.inc.php');
/* incluimos dos opciones de proceso y de programacion orientada a objetos. Podemos ejecutar
los ejemplos pasado mediante el metodo GET el tipo elegido.  */

    if(!empty ($_GET['tipo'])){
        $tipo_script=$_GET['tipo'];
    }else{
        $tipo_script="objetos";
    }


/*En caso de tipo proceso utilizaríamos esto */

if ($tipo_script=="proceso"){
    /******    Programación mediante procesos ***********/
    #conexion, selección de base de datos y verificacion de errores segun ejemplos anteriores
    $conexion=@mysqli_connect ($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);
    if(!mysqli_connect_errno()==0){
        print "<Mbr>No ha podido realizarse la conexión mediante procesos<br>";
        print "Error número: ". mysqli_connect_errno()." equivalente a: ". mysqli_connect_error();
        exit();
    }
    # Creación. Los parámetros requieren el orden aquí indicado al revés del caso mysql

    if(mysqli_query($conexion,$crear)){
            print "La tabla ha sido CREADA";
    }else{
            print "<br>No ha podido crearse la base de datos mediante procesos<br>";
            print "Error : ". mysqli_error($conexion);
            exit();
    }
    mysqli_close($conexion);

}

/* en caso de programacion orientada a objetos */
if ($tipo_script=="objetos"){
      #conexion, selección de base de datos y verificacion de errores segun ejemplos anteriores
    $objeto=@new mysqli ($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);
    if(!$objeto->connect_errno==0){
        print "
No ha podido realizarse la conexión mediante objetos<br>";
        print "Error número: ". $objeto->connect_errno." equivalente a: ". $objeto->connect_error;
        exit();
    }

    if($objeto->query($crear)){
            print "La tabla ha sido CREADA";
    }else{
                       print "<br>No ha podido crearse la tabla mediante objetos<br>";
            print "Error : ". $objeto->error;
            exit();
    }

    $objeto->close();
}
?>