C++ Компьютерная графика
Построить изображение поверхности z=f(x,y) в параллельной проекции ex = y – 0.7 x, ey = z – 0.7 x.
ЗаданиеРазработать программу на языке программирования Borland C++ Builder для вывода на экран изображения поверхности
z=f(x,y)
с удалением невидимых линий.Введение
В данной работе отражен вывод на экран изображения поверхности
z=f(x,y)
в среде программирования Borland С++ Builder 6 Enterprise.Построить изображение поверхности
z=f(x,y)
в параллельной проекции ex=y-0,7x
, ey=z-0,7x
.//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "rgz03.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#include <stdlib.h>
#include <math.h>
#define nx 100
#define ny 100
int algor=1;
float xmax = 3, xmin = -3, ymax = 3, ymin = -3, zmax = 3, zmin = -2,hx,hy;
float xv = 50, yv = 30.5 , zv = 10 ; // положение наблюдателя
float d = 1,zz=0.2 ; // расстояние до плоскости проекции
float cosa, sina ; // меридиана точки наблюдения
float exmax, exmin, eymax, eymin ;
int gmex, gmey ;
int *phimin, *phimax ;
float cvals[ny+1], cval ;
void line(int x0, int y0, int x1, int y1){
Form1->Image1->Canvas->MoveTo(x0,y0);
Form1->Image1->Canvas->LineTo(x1,y1);
}
void sline( int x0, int y0, int x1, int y1 ){
int i,j, temp, x, y, maxacc, accx, accy, dx, dy,
length=abs(x1-x0);
if ((i=abs(y1-y0))>length) length=i;
// if (length==0) return;
maxacc=2*length; accx=accy=length;
for (j=0; j<2; j++){
dx=2*(x1-x0); dy=2*(y1-y0); x=x0; y=y0;
length+=j;
for (i=0; i<length; i++){
if (y0<=y1&&phimax[x]<y){
Form1->Image1->Canvas->Pixels[x][gmey-y]=clBlack;
phimax[x]=y;
}
if (y0>=y1&&phimin[x]>y){
Form1->Image1->Canvas->Pixels[x][gmey-y]=clBlack;
phimin[x]=y;
}
accx+=dx; accy+=dy;
if (accx>=maxacc){
accx-=maxacc; x++;
} else if (accx<0){
accx+=maxacc; x--;
}
if (accy>=maxacc){
accy-=maxacc; y++;
} else if (accy<0){
accy+=maxacc; y--;
}
}
temp=x0; x0=x1; x1=temp; temp=y0; y0=y1; y1=temp;
}
}
float fz(float x, float y) {return ((x*y)/(x*x+y*y))*zz;}
float ex(float x, float y, float z){
return y-0.5*x;
}
float ey ( float x, float y, float z ){
return z-2*x;
}
void vectphi(float x0, float y0, float z0,
float x1, float y1, float z1,int mm){
float ex0, ex1, ey0, ey1;
int ix0, ix1, iy0, iy1;
ex0=ex(x0,y0,z0);
ix0=(ex0-exmin)*gmex/(exmax-exmin);
ey0=ey(x0,y0,z0);
iy0=(ey0-eymin)*gmey/(eymax-eymin);
ex1=ex(x1,y1,z1);
ix1=(ex1-exmin)*gmex/(exmax-exmin);
ey1=ey(x1,y1,z1);
iy1=(ey1-eymin)*gmey/(eymax-eymin);
if (mm) sline(ix0,iy0,ix1,iy1);
else line(ix0,gmey-iy0,ix1,gmey-iy1);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner){
int i, j;
float x,y,z;
hy=(ymax-ymin)/ny;
hx=(xmax-xmin)/nx;
gmex=Form1->Image1->Width;
gmey=Form1->Image1->Height;
cosa=xv/sqrt(xv*xv+yv*yv);
sina=yv/sqrt(xv*xv+yv*yv );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender){
zz+=0.1;
int i,j; float x, y, z;
Form1->Image1->Canvas->FillRect(TRect(0,0,gmex,gmey));
zmin=zmax=0.;
for (i=0; i<=nx; i++)
for (j=0; j<=ny; j++){
z=fz(xmin+i*hx,ymin+j*hy);
if (z>zmax) zmax=z;
if (z<zmin) zmin=z;
}
exmax=ex(xmin, ymax, zmax);
exmin=ex(xmax, ymin, zmin);
eymax=ey(xmin, ymin, zmax);
eymin=ey(xmax, ymax, zmin);
for(x=xmin; x<=xmax; x+=xmax-xmin)
for(y=ymin; y<=ymax; y+=ymax-ymin)
for(z=zmin; z<=zmax; z+=zmax-zmin){
if (exmax<ex(x,y,z)) exmax=ex(x,y,z);
if (exmin>ex(x,y,z)) exmin=ex(x,y,z);
if (eymax<ey(x,y,z)) eymax=ey(x,y,z);
if (eymin>ex(x,y,z)) eymin=ey(x,y,z);
}
phimax=new int[gmex]; phimin=new int[gmex];
for(i=0;i<gmex;i++) {phimax[i]=0; phimin[i]=gmey;}
cval=fz(xmax, ymax);
for(i=ny-1;i>=0;i--){
cvals[i+1]=cval; y=ymin+hy*i;
cval=fz(xmax, y);
vectphi(xmax, y+hy, cvals[i+1], xmax, y, cval, 1);
}
cvals[0] = cval ;
for (j=nx-1;j>=0;j--){
x=xmin+hx*j;
cval=fz(x, ymax);
vectphi(x+hx, ymax, cvals[ny], x,ymax,cval, 1);
for(i=ny-1;i>=0;i--){
cvals[i+1]=cval; y=ymin+hy*i;
cval=fz(x, y);
vectphi(x+hx, y, cvals[i], x, y, cval, 1);
vectphi(x, y+hy, cvals[i+1], x, y, cval, 1);
}
cvals[0] = cval ;
}
vectphi(xmax, ymax, zmax, xmin, ymax, zmax, 0);
vectphi(xmax, ymax, zmax, xmax, ymax, zmin, 0);
vectphi(xmax, ymax, zmax, xmax, ymin, zmax, 0);
vectphi(xmin, ymax, zmin, xmin, ymax, zmax, 0);
vectphi(xmin, ymax, zmin, xmax, ymax, zmin, 0);
vectphi(xmax, ymin, zmin, xmax, ymin, zmax, 0);
vectphi(xmax, ymin, zmin, xmax, ymax, zmin, 0);
vectphi(xmin, ymin, zmin, xmin, ymin, zmax, 1);
vectphi(xmin, ymin, zmin, xmax, ymin, zmin, 1);
vectphi(xmin, ymin, zmin, xmin, ymax, zmin, 1);
vectphi(xmax, ymin, zmax, xmin, ymin, zmax, 1);
vectphi(xmin, ymax, zmax, xmin, ymin, zmax, 1);
delete phimax; delete phimin;
}
Программная реализация с использованием алгоритма плавающего горизонта показана на рисунке 1.
Рисунок 1 - метод плавающего горизонта
Комментарии 0 2018-01-07 17:04:34