Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Graficar superficies en 3d (https://www.clubdelphi.com/foros/showthread.php?t=57478)

colx007 16-06-2008 22:17:33

Graficar superficies en 3d
 
Hola,

¿Cómo puedo graficar superficies o mapas a partir de datos en 3 coordenadas (x, y, z)?

Gracias

coso 16-06-2008 23:51:41

te dejo un ejemplo para graficar funciones. Como ves, esta sacando las z de una funcion. Si tu creas un array donde colocas tu mapa de valores, entonces solo tendras q hacer z := mapa[x][y]; Esta funcion por eso es muy simple: pierde escala, etc... deberàs usar normalizadores varios (factores q multipliquen a las x e y en i,j) para tener una proyeccion más correcta.

Código Delphi [-]
unit proyect;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure DrawLine(x,y,z : integer);
    function  Cl(z : integer; mx : integer) : TColor;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses math;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
        x,y,z : integer;
begin

        for y := 300 downto -300 do
        for x := 600 downto -600 do
        begin
                z := Round(150*cos(PI*x/100)*sin(PI*y/200));
//                z := Round(150*Sin((x + y)/100));
                DrawLine(x,y,z);
                Application.ProcessMessages;
        end;
end;

procedure TForm1.DrawLine(x,y,z : integer);
var
        cx,cy : integer;
        i,j   : integer;
begin
        cx := Width div 2;
        cy := Height div 2;

        i := x - Round(-1.3*y) + cx;
        j := cy - y;

        Canvas.Pen.Color := Cl(z,150);
        Canvas.MoveTo(i,j);
        Canvas.LineTo(i,j-z)
end;

function TForm1.Cl(z : integer; mx : integer) : TColor;
begin
        if z > 0 then
        Cl := TColor(Round($FF*z/mx)*$000101)
        else
        Cl := TColor(Round($FF*-z/mx)*$010000);
end;

end.

me entretengo a ver si saco lo mismo con un array...

colx007 18-06-2008 17:01:54

Gracias, pero estoy programando en Builder c++ 6. De todas formas voy a ver cuales funciones me sirven.

coso 18-06-2008 17:02:52

bueno la traduccion es sencilla. Saludos.

BC++ 24-06-2008 14:31:47

graficar en 3d
 
Hola Amigo del foro, esto hice una vez. lo saque de navegar por internet y fui agregando cosas a mi modo, lo que hace este programa, es una funcion en 2d SIMPLE Y SENCILLA (1RO) .
(2DO) hago una funcion en 3D,con el concepto de que una figura en 3d se arma a partir de la suma de los planos la misma funcion en (x,y) , en (z,x) y (z,y) y las muestro por separadas(a estos planos) y por ultimo uno los 3 planos para mostrarlo ( podes con el ScrollBar ROTAR Y GIRARLO).

Soy principiante en el tema pero por esas cosas de la vida te puede servir.
Saludos.

BC++

te dejo el codigo, lo unico q tenes q hacer es poner en el form. TImages y botones

//----------------------CODIGO-------------------------------------------

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
double f(double ,double );
void __fastcall TForm1::Button1Click(TObject *Sender)
{ //ejemplo para 2d grafico unicamente los ejes
int Maxx=Image->Width;
int Maxy=Image->Height;
//Traza el eje X
Image->Canvas->MoveTo(0,Maxy/2);
Image->Canvas->LineTo(Maxx,Maxy/2);
//Traza el eje Y
Image->Canvas->MoveTo(Maxx/2,0);
Image->Canvas->LineTo(Maxx/2,Maxy);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ //grafico un seno, y lo superpongo sobre el eje x,y q cree en el boton de arriba
int Maxx=Image->Width;
int Maxy=Image->Height;
//Traza el eje X
Image->Canvas->MoveTo(0,Maxy/2);
Image->Canvas->LineTo(Maxx,Maxy/2);
//Traza el eje Y
Image->Canvas->MoveTo(Maxx/2,0);
Image->Canvas->LineTo(Maxx/2,Maxy);
//Declarando funciones que van a ser utilizadas
float x,y,var=0.01,xini=-10,xfin=10,posx,posy;
//Graficando la función en si
for(x=xini;x<xfin;x+=var)
{ y=sin(x);
posx=x*Maxx/(xfin-xini);
posy=y*Maxx/(xfin-xini);
Image->Canvas->Pixels[Maxx/2+posx][Maxy/2-posy]=clRed;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int Maxx=Image1->Width;
int Maxy=Image1->Height;
//Traza el eje X
Image1->Canvas->MoveTo(0,Maxy/2);
Image1->Canvas->LineTo(Maxx,Maxy/2);
//Traza el eje Y
Image1->Canvas->MoveTo(Maxx/2,0);
Image1->Canvas->LineTo(Maxx/2,Maxy);
//Declarando funciones que van a ser utilizadas
float x,y,z,var=0.1,xini=-10,xfin=10,posx,posy;
//Graficando la función en si
for(x=xini/3;x<xfin/3;x+=var)
{ for(z=xini/3;z<xfin/3;z+=var)
{ y=f(x,z);//y=sin(x)+z; //Llamada a una función ya definida
posx=x*Maxx/(xfin-xini);
posy=y*Maxx/(xfin-xini);
Image1->Canvas->Pixels[Maxx/2+posx][Maxy/2-posy]=clRed;
posx=x*Maxx/(xfin-xini);
posy=z*Maxx/(xfin-xini);
Image2->Canvas->Pixels[Maxx/2+posx][Maxy/2-posy]=clRed;
posx=y*Maxx/(xfin-xini);
posy=z*Maxx/(xfin-xini);
Image3->Canvas->Pixels[Maxx/2+posx][Maxy/2-posy]=clRed;
}
}
}
//--------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
int Maxx=Image1->Width;
int Maxy=Image1->Height;
Image4->Canvas->Pen->Color = clWhite;
Image4->Canvas->FillRect(Rect(0,0,Maxx,Maxy));
Image4->Canvas->Pen->Color = clBlack;

float Elev=ScrollBar1->Position*(2*M_PI)/100;
float Giro=ScrollBar2->Position*(2*M_PI)/100;
float x,y,z,var=0.1,xini=-10,xfin=10,posx,posy,x2D,y2D;
for(x=xini/3;x<xfin/3;x+=var)
{ for(z=xini/3;z<xfin/3;z+=var)
{ y=f(x,z);
x2D= x*cos(Elev)-z*sin(Elev);
y2D=-x*sin(Elev)*sin(Giro)+y*cos(Giro)-z*cos(Elev)*sin(Giro);
posx=x2D*Maxx/(xfin-xini);
posy=y2D*Maxx/(xfin-xini);
Image4->Canvas->Pixels[Maxx/2+posx][Maxy/2-posy]=clGreen+clBlue;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
{
Button5Click(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ScrollBar2Change(TObject *Sender)
{
Button5Click(this);
}
//---------------------------------------------------------------------------
double f(double x,double z)
{ return sin(x*x+z)*exp(x);
//return sqrt(z*z+x*x)*sin(x*x);
}
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int Maxx=Image1->Width;
int Maxy=Image1->Height;
//Traza el eje X
Image1->Canvas->MoveTo(0,Maxy/2);
Image1->Canvas->LineTo(Maxx,Maxy/2);
//Traza el eje Y
Image1->Canvas->MoveTo(Maxx/2,0);
Image1->Canvas->LineTo(Maxx/2,Maxy);
//Declarando funciones que van a ser utilizadas
float x,y,var=0.01,xini=-10,xfin=10,posx,posy;
//Graficando la función en si
for(x=xini;x<xfin;x+=var)
{ y=sin(x);
posx=x*Maxx/(xfin-xini);
posy=y*Maxx/(xfin-xini);
Image1->Canvas->Pixels[Maxx/2+posx][Maxy/2-posy]=clBlue;
}
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------

SUERTE!!
pD: Si alguno conoce la direccion Web de este codigo tendria que agregarlo, yo no me acuerdo lamentablemente.


La franja horaria es GMT +2. Ahora son las 03:07:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi