Foros del Web » Programación para mayores de 30 ;) » Programación General »

Programcion de graficos..

Estas en el tema de Programcion de graficos.. en el foro de Programación General en Foros del Web. Hola que tal queria ver si alguie sabe bien del tema, queria meterme con programacion mas del tipo grafico pero no de juegos exactamente mas ...
  #1 (permalink)  
Antiguo 28/05/2011, 23:59
 
Fecha de Ingreso: junio-2009
Mensajes: 117
Antigüedad: 17 años, 3 meses
Puntos: 3
Programcion de graficos..

Hola que tal queria ver si alguie sabe bien del tema, queria meterme con programacion mas del tipo grafico pero no de juegos exactamente mas de este tipo:

http://www.softdistrict.com/wp-conte...l-software.jpg

por ejemplo software del tipo medico q se manejan con graficos, imagenes etc, o tambin tipo esto:

http://home.pacbell.net/mariusm/netstumbler_big.jpg
la ventanita de abajo que tiene el grafico


no se si me explico, directx no creo q sea la solucion.
Pero bueno.
__________________
Sitio: www.qubitek.com.ar
Uso: www.docstorus.com para mis documentos.
  #2 (permalink)  
Antiguo 29/05/2011, 11:01
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 18 años, 6 meses
Puntos: 1329
Respuesta: Programcion de graficos..

Existen librerías gráficas para la mayoría de los lenguajes de programación, la mayoría están orientadas a juegos, pero no significa que no puedan ser usados para otros fines, he visto aplicaciones del tipo que mencionas hechas con pygame una librería para desarrollo de juegos en python, y lo mismo con Java2D.

Por ejemplo en pyton está pygame, pyOpengl e incluso puedes usar wxPython. En java como te comenté puedes usar Java2D, Java3D, JOGL, JGL. También hay librerías multiplataforma como SDL, que además la puedes usar en varios lenguajes.

Saludos
__________________
Grupo Telegram Docker en Español
  #3 (permalink)  
Antiguo 29/05/2011, 20:19
 
Fecha de Ingreso: agosto-2009
Mensajes: 23
Antigüedad: 17 años, 1 mes
Puntos: 2
De acuerdo Respuesta: Programcion de graficos..

Holas;

Algo importante, en que lenguaje estas programando visual basic, c++, delphi, cual????.

Si quieres graficos del tipo medico, estos se obtienen mediante algoritmos matematicos bastantes complejos para obtener este tipo de imagen, mostrarlas en el form, el imprimir es algo mas facil, ya que solo lees los puntos su color y de ahi a un archivo de imagen.

Si es en WINAPI, debes manejar las separaciones de ecritorios, definir tamaño, ubicación, todo eso en el procedimiento paint WM_PAINT.

En el otro tipo de graficos de tipo barras, puntos, etc. es el mismo principio que el anterior caso, con la salvedad, que este es más facil de realizar, los ejes, tipo de puntos, crus estrellas, color, etc. Es programado en el evento WM_PAINT, escoger el tipo de brocha, colores, inicio y fin de punto, los numeros de klos ejes, titulos de ejes en sentido vertival u horizontal, todo se programa desde codigo.

En este sentido al realizarlo en WINAPI o Win32 en C ó C++, es más facil que en visual basic que necesitas de activeX, en winapi solo utilizas el kernel del windows para realizarlo en cuanto al personalizarlo.

Este es un ejemplo de graficar con WinApi y utilizando funciones de C y C++:

Código PHP:
#include <windows.h>
#include <cmath>
#include <cstdlib>
#include "app.h"
#include "win.h"

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpszArgument, int CmdShow)
{
    
MSG msg;
    
//
    
if(!InitApp(hinst,(WNDPROC) WindowProcedure,(LPCTSTR) szClassName));
    
//
    
if(!InitInstance(hinst,CmdShow,(LPCTSTR)szClassName,650,550));
    
//
    
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
    
//
    
return msg.wParam; 
}
//-------------------------------------------------------------------------------------------
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    switch (
message)
    {
        case 
WM_CREATE:
            
//-- Etiquetas
            
lbl[0] = MakeControl(3,"Grafico ScattertPlot",5,10,130,18,0,hwnd);
            
//-- Comandos
            
cmd[0] = MakeControl(1,"Graficar",5,100,80,20,100,hwnd);
            
//wnTexto = true;
            
break;
        case 
WM_COMMAND:
            switch(
LOWORD(wParam))
            {
                case 
100:
                    
RECT r;
                    
grafActivo = true;
                    
GetClientRect(hwnd, &r);
                    
InvalidateRect(hwnd, &r, TRUE);
                    
//graficar(hdc,hwnd);
                    
break;
                case 
110:
                    
RECT r1;
                    
wnTexto = true;
                    
GetClientRect(hwnd, &r1);
                    
InvalidateRect(hwnd, &r1, TRUE);
                    break;
            }
            break;
        case 
WM_PAINT:
            
hdc = BeginPaint(hwnd,&ps);
            if(
wnTexto)
            {
                
texto(hwnd,hdc);
            }
            if(
grafActivo)
            {
                
graficar(hdc,hwnd);
                
//texto(hwnd,hdc);
            
}
            
EndPaint(hwnd,&ps);
            break;
        case 
WM_DESTROY:
            
PostQuitMessage (0);
            break;
        default:
            return 
DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 
0;
} 
En WM_PAINT, es donde dibujas sobre cualquier control o ventana, se un boton, label, textbox, lo que sea, en visual basic es batsnate mas engorroso tienes que llamar a a las api, etccccc.

Con esto dibujas en una zona determinada de tu form o ventana principal y el resto lo llenas de controles, tal como aparece en la foto de medicina:

Código PHP:
if(grafActivo)
            {
                
graficar(hdc,hwnd);
                
//texto(hwnd,hdc);
            
} 
A continuacion el codigo para dibujar el grafico y las coordenas del dispositivo de contexto en donde dibujaras:

Código PHP:
/*--- Graficar Datos ---*/
void graficar(HDC hdc, HWND hwnd)
{
    
//hdc = GetDC(hwnd);
    //COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
    
SetMapMode(hdc,MM_ISOTROPIC);
    
SetWindowExtEx(hdc,640,400,NULL);
    
SetViewportExtEx(hdc,550,450,NULL);
    
SetViewportOrgEx(hdc,150,0,NULL);
    
//-eje x / y
    
hCPp = CreatePen(PS_SOLID,1,RGB(0,0,255));
    
SelectObject(hdc,hCPp);
    
MoveToEx(hdc,100,50,NULL);
    
LineTo(hdc,100,350);
    
LineTo(hdc,500,350);
    
//-- título gráfico
    /* 1. Fuente Coordenadas X*/
    
hFuente = CreateFont(16,12,0,0,FW_BOLD,FALSE,FALSE,FALSE,OEM_CHARSET,
                
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
                
DEFAULT_PITCH,"Verdana");
    
SetTextColor(hdc,RGB(136, 106, 106));
    
TextOut(hdc,(300-(strlen(titulo)*10/2)),15,titulo,strlen(titulo));
    
//-- etiqueta eje X
    
TextOut(hdc,(300-(strlen(label_x)*10/2)),365,label_x,strlen(label_x));
    
//-- marca eje X
    
TextOut(hdc,(500-(2*12/2)),355,"100",3);
    
//-- marca eje Y
    
TextOut(hdc,(90-3*12),45,"100",3);
    
/* 2. Fuente Coordenadas X*/
    
hFuente = CreateFont(16,10,900,900,FW_BOLD,FALSE,FALSE,FALSE,OEM_CHARSET,
                 
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
                 
DEFAULT_PITCH,"Verdana");
    
SelectObject(hdc,hFuente);
    
TextOut(hdc,50,200+(strlen(label_y)*10/2),label_y,strlen(label_y));
    
//-eje x
    
xDat = 140;
    for(
i=0;i<10;i++)
    {
       
yDat = 350;
       
MoveToEx(hdc,xDat,yDat,NULL);
       
yDat = 356;
       
LineTo(hdc,xDat,yDat);
       
xDat+=40;
    }
    
//- eje y
    
yDat = 50;
    for(
i=0;i<10;i++)
    {
        
xDat = 100;
        
MoveToEx(hdc,xDat,yDat,NULL);
        
xDat = 94;
        
LineTo(hdc,xDat,yDat);
        
yDat += 30;
    }
    
//--- Desarrollo Ecuación --------
    /*  Colocar puntos  */
    /*for(i=10;i < 340;i++)
    {
        SetPixel(hdc,100+i,350-(int)(0.0023*(i*i)),RGB(0,0,0));
    }*/
    /*SetPixel(hdc,100+40,350-50,RGB(0,0,0));
    SetPixel(hdc,100+80,350-108,RGB(0,0,0));
    SetPixel(hdc,100+120,350-23,RGB(0,0,0));*/
    
SetBkMode(hdc,TRANSPARENT);
    
SetTextColor(hdc,RGB(220,147,0));
    
TextOut(hdc,(int)(100+40*400/100)-5,(int)(350-10*300/100)+7,"x",1); // 
    
TextOut(hdc,(int)(100+45*400/100)-5,(int)(350-55*300/100)+7,"x",1); // 
    
TextOut(hdc,(int)(100+70*400/100)-5,(int)350-(25*300/100)+7,"x",1);
    
//TextOut(hdc,140+162,350-153,"x",1);
    //--------------------------------
    
DeleteObject(hCPp);
    
DeleteObject(hFuente);
    
//ValidateRect(hwnd,NULL);
    //ReleaseDC(hwnd,hdc);
} 
Con esta funcion dibujas el grafico y estas instrucciones, será donde coloques tu grafico con coordenadas dentro de tu ventana:

Código PHP:
SetMapMode(hdc,MM_ISOTROPIC);
    
SetWindowExtEx(hdc,640,400,NULL);
    
SetViewportExtEx(hdc,550,450,NULL);
    
SetViewportOrgEx(hdc,150,0,NULL); 
SetMapMode= tipo de unidades logicas a manejar, cm, [pulgadas, pixel, etc.
SetWindowExtEx y SetViewportExtEx= corresponden al tamaño que tendra tu grafico y las coordenas donde se dibujará tu gráfico.

Debes saber el uso de las siguientes funciones:

CreatePen
SelectObject
MoveToEx
LineTo
CreateFont
SetTextColor
TextOut
SetPixel
SetBkMode
SetTextColor
DeleteObject
ReleaseDC
BeginPaint
EndPaint
GetClientRect
InvalidateRect
RECT

Aqui tengo el codigo que van en commandbutton y cuando se activa, tira el valor del grafico a True y este dibuja donde le indique:

Código PHP:
case 100:
                    
RECT r;
                    
grafActivo = true;
                    
GetClientRect(hwnd, &r);
                    
InvalidateRect(hwnd, &r, TRUE);
                    
//graficar(hdc,hwnd);
                    
break; 
grafactivo si te fijas esta en WM_PAINT, de esta manera se dibuja, ahora, lo interesante es que puedes tener varios graficos mostrando datos diferentes y todos actualizandose en tiempo real, si llegan los datos por puerto serial, webcam, etc, con esto llegas fácilmente a ,lo que quieres tal como se muestra en el primer link de lo que quieres.

Suerte.....
  #4 (permalink)  
Antiguo 06/07/2011, 09:54
 
Fecha de Ingreso: junio-2009
Mensajes: 117
Antigüedad: 17 años, 3 meses
Puntos: 3
Respuesta: Programcion de graficos..

nostromos muchas gracias muy bien explicado, estuve practicando un pco con el gdi con c# y pude hacer algunas cosas con c++ todabia no me meti mucho, pero bueno gracias nuevamente.
__________________
Sitio: www.qubitek.com.ar
Uso: www.docstorus.com para mis documentos.

Etiquetas: graficos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:38.