Ayuda con un problema de Estructura de Datos

Iniciado por Beginner Web, 11 Junio 2018, 22:43 PM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

Necesito ayuda con la creacion de un TDA Simple,
El problema dice asi;
Definir el TDA Pixel con las siguientes operaciones;
*Crear pixel: Dado 3 valores enteros devuelve un pixel
*Validar Pixel: Dado un pixel, determinar si sus valores son correctos. Considere que los puntos asumen valores solo en el rango[0,255]
*Mostrar pixel: Muestra el valor de sus componentes
*Crear blanco: Dado un pixel genera a sus  puntos los valores apropiados para generar blanco
*Crear negro: Dado un pixel genera a sus  puntos los valores apropiados para generar negro

Implementar el TDA PIxel utilizando a) arreglos, b)registros.

No entiendo bien como y que es lo que tengo que hacer si alguien me ayuda, estare muy agradecido, cualquer ayuda , manual lo que sea me sirve desde ya muchas gracias.

Código (cpp) [Seleccionar]

#include <iostream>
#include <string.h>
#include <fstream>

using namespace std;

typedef struct{
int rojo;
int azul;
int verde;
}tpixel;

const int x=255, y=255;

void crear_pixel(tpixel &color);
bool validar_pixel(tpixel color);
void mostrar_pixel(tpixel color);
void generar_blanco();
void generar_negro();

int main()
{
tpixel color_pixel;
crear_pixel(color_pixel);
mostrar_pixel(color_pixel);
generar_blanco();
generar_negro();
system("pause");
return 0;
}

void crear_pixel(tpixel &color)
{
do{
cout << "Ingrese rojo : "; cin >> color.rojo;
cout << "Ingrese verde: "; cin >> color.verde;
cout << "Ingrese azul : "; cin >> color.azul;
}while(validar_pixel(color)!=true);
}

bool validar_pixel(tpixel color)
{
if((color.rojo<0 || color.rojo>255) || (color.verde<0 || color.verde>255) || (color.azul<0 || color.azul>255)){
return false;
}
else{
return true;
}
}

void mostrar_pixel(tpixel color)
{
cout << "Rojo : " << color.rojo << endl;
cout << "Verde: " << color.verde << endl;
cout << "Azul : " << color.azul << endl;
}

void generar_blanco()
{
ofstream img("picture.ppm");
img << "P3" << endl;
img << x << " " << y << endl;
img << "255" << endl;
for(int i=0; i<x; i++){
for(int k=0; k<y; k++){
int r=x%255;
int g=y%255;
int b=y*x%255;
img << r << " " << g << " " << b << endl;
}
}
system("open picture.ppm");
}

void generar_negro()
{

}


7w7

Serapis

#1
Más o menos como lo llevas...


con registros:

Estructura Pixel
   byte rojo
   byte verde
   byte azul
fin estructura


* Crear pixel: Dado 3 valores enteros devuelve un pixel

pixel = funcion CrearPixel(entero rojo, entero Verde, entero Azul)
   pixel px
   
   // Como pide que entren enteros y no bytes es preciso verificar que están en el rango dado (y si no se truncan al límite).
   px.Rojo = FijarRangoByte(rojo)
   px.Verde = FijarRangoByte(verde)
   px.Azul = FijarRangoByte(azul)

   devolver px
fin funcion


*Validar Pixel: Dado un pixel, determinar si sus valores son correctos. Considere que los puntos asumen valores solo en el rango[0,255]
OJO: esta función no es exactamente 'validar', validar supone rechazar si no están en el rango reclamado, aquí se trunca, se fuerza un valor si o sí...

// Trunca un entero a byte si queda fuera de los límites de byte.
byte = FijarRangoByte(entero Valor)
   byte b
   Si valor <0
       b= 0
   osi valor> 255
       b= 255
   sino
       b = valor
   fin si

   devolver b
fin funcion



*Validar Pixel: Dado un pixel, determinar si sus valores son correctos. Considere que los puntos asumen valores solo en el rango[0,255]

// Aquí se valida, pero no se indica queé hacer en caso de que falle la validación... luego no resulta útil por sí misma.
buleano = ValidarRangoByte(entero Valor)
   Si ((valor >= 0) y (valor <= 255))
       devolver TRUE
   sino
       devolver FALSE
   fin si
fin funcion


*Mostrar pixel: Muestra el valor de sus componentes

funcion MostrarPixel(pixel px)
   imprimir "los valores del píxel son: " + nuevalinea + "   Rojo: " + px.rojo + nuevalinea + "   Verde: " + px.verde + nuevalinea + "   Azul: " + px.azul
fin funcion


*Crear blanco: Dado un pixel genera a sus  puntos los valores apropiados para generar blanco
Te pongo 2 funciones. Realmente las dos son iguales, pero la enunciación parece pedirte la 2ª...

pixel = funcion  CrearPixelBlanco
   devolver CrearPixelGris(255)
fin funcion

funcion CrearPixelBlanco(pixel px)
   ModificarPixelGris(px, 255)
fin funcion


*Crear negro: Dado un pixel genera a sus  puntos los valores apropiados para generar negro
Te pongo 2 funciones. Realmente las dos son iguales, pero la enunciación parece pedirte la 2ª...

pixel = funcion  CrearPixelNegro
   devolver CrearPixelGris(0)
fin funcion

funcion CrearPixelNegro(pixel px)
   ModificarPixelGris(px, 0)
fin funcio


Crear Gris: genera los valores apropiados para generar un nivel de gris (0-255)

// Asigna el mismo valor a los 3 canales del pixel CREADO...
pixel = funcion CrearPixelGris(byte valor)
   pixel px
   px.Rojo = valor
   px.verde = valor
   px.Azul = valor

   devolver px
fin funcion

// Asigna el mismo valor a los 3 canales del pixel RECIBIDO...
funcion ModificarPixelGris(pixel px, byte valor)
   px.Rojo = valor
   px.verde = valor
   px.Azul = valor
fin funcion








Luego te pide lo mismo (o de forma alternativa?), pero en vez de usar una estructura, usar un array, como se muestra aquí:

Array bytes Pixel[0 a 2]


es básicamente lo mismo pero usando un array en vez de una estructura, luego solo te pongo la 1ª función...
* Crear pixel: Dado 3 valores enteros devuelve un pixel

array bytes = funcion CrearPixel(entero rojo, entero Verde, entero Azul)
   array bytes px[0 a 2]
   
   // Como pide que entren enteros y no bytes es preciso verificar que están en el rango dado (y si no se truncan al límite).
   px[0] = FijarRangoByte(rojo)
   px[1] = FijarRangoByte(verde)
   px[2] = FijarRangoByte(azul)

   devolver px
fin funcion



p.d.: en el enunciado que pones no señala nada acerca de alguna imagen , todo parece referirse in situ a un píxel individual... si al final debe aplicarse sobre una imagen las funciones deben modificarse (para lojar el bucle que recorra la imagen entera en la función) o bien añadir un bucle para llamarlas por cada píxel (esto es mucho más lento, pero vale si su único propósito es un ejercicio).

Beginner Web

Gracias @NEBIRE ahora lo entiendo un poco mas, lo que no se es como mostrar pixel/color en la consola de comandos.  ;-)

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

typedef struct{
int rojo;
int verde;
int azul;
}tpixel;

void crear_pixel(tpixel &color);
bool validar_pixel(tpixel color);
void mostrar_pixel(tpixel color);
void generar_blanco(tpixel color);
void generar_negro(tpixel color);

int main()
{
tpixel p;
crear_pixel(p);
mostrar_pixel(p);
generar_blanco(p);
generar_negro(p);
system("pause");
return 0;
}

void crear_pixel(tpixel &color)
{
do{
cout << "Ingrese rojo : "; cin >> color.rojo;
cout << "Ingrese verde: "; cin >> color.verde;
cout << "Ingrese azul : "; cin >> color.azul;
}while(validar_pixel(color)!=true);
}

bool validar_pixel(tpixel color)
{
if((color.rojo<0 || color.rojo>255) || (color.verde<0 || color.verde>255) || (color.azul<0 || color.azul>255)){
return false;
}
else{
return true;
}
}

void mostrar_pixel(tpixel color)
{
cout << "Rojo : " << color.rojo << endl;
cout << "Verde: " << color.verde << endl;
cout << "Azul : " << color.azul << endl;
}

void generar_blanco(tpixel color)
{
color.rojo=255;
color.verde=255;
color.azul=255;
cout << "Blanco" << endl;
mostrar_pixel(color);
}

void generar_negro(tpixel color)
{
color.rojo=0;
color.verde=0;
color.azul=0;
cout << "Negro" << endl;
mostrar_pixel(color);
}
7w7