31 Окт

ИСПОЛЬЗОВАНИЕ МЕТОДА РАСТРОВОЙ РАЗВЁРТКИ ДЛЯ ЗАПОЛНЕНИЯ ТРЕУГОЛЬНИКОВ




Номер части:
Оглавление
Содержание
Журнал
Выходные данные


Науки и перечень статей вошедших в журнал:

//программа написана на языке программирования C++Builder6

#include <vcl.h>

#pragma hdrstop

#include <math.h>

#define C_P Canvas->Pixels

#define C_M Canvas->MoveTo

#define C_L Canvas->LineTo

#define C_P_C Canvas->Pen->Color

#define C_P_W Canvas->Pen->Width

#define C_P_S Canvas->Pen->Style

#define C_T Canvas->TextOutA

#define cB clBlack

#define cW clWhite

#define R_B RGB(200,200,200)

#define R_G RGB(5,137,216)

#include «Lab5_prim.h»

//——————————————————————————————————

#pragma package(smart_init)

#pragma resource «*.dfm»

TForm1 *Form1;

int mx=30,my=30;

struct Point

{int x; int y;};

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{      }

//——————————————————————————————————

 

void __fastcall TForm1::XoY(int cenx, int ceny)

{  //оси

//ось X

C_P_W=2;

C_M(cenx-12*mx,ceny);C_L(cenx+12*mx,ceny);

//стрелка

C_M(cenx+11.5*mx,ceny-0.25*my);C_L(cenx+12*mx,ceny);

C_L(cenx+11.5*mx,ceny+0.25*my);C_T(cenx+11.75*mx,ceny-1*my,»X»);

//ось Y

C_M(cenx,ceny-9*my);C_L(cenx,ceny+9*my);

//стрелка

C_M(cenx-0.25*mx,ceny-8.5*my);C_L(cenx,ceny-9*my);

C_L(cenx+0.25*mx,ceny-8.5*my);C_T(cenx+0.5*mx,ceny-9.1*my,»Y»);

C_P_W=1;}

//——————————————————————————————————

 

void __fastcall TForm1::DrawGip(int cenx, int ceny, int a, int b,

int endg_x, int endg_y)

{float a2,b2,a2a,b2b,d,e,st,r2,eks;int x,y;

x=a;y=0; e=0;

a2=a*a;b2=b*b; a2a=2*a2; b2b=2*b2;

d=b2-b2b*a-a2;st=sqrt(a2+b2);

eks=(float)st/(float)a;

while (r2<=abs(eks*x-a) && x<=endg_x && y<=endg_y)

{ DrawDot(cenx,ceny,x,y);

e=2*(d+a2*y)+a2;

//случаи 1 или 2

 if (d<0 && e<=0)

{//mh

++x;   d+=b2+b2b*x;   continue;  }

//определение случаев 4 или 5

e=2*(d-b2*x)-b2;

//случай 4 или 5

if(d>0 && e>0)

{//шаг mv

++y;   d+=-a2-a2a*y;   continue;   }

//шаг md

++x;   d+=b2b*x-a2a*y-a2+b2;   ++y; }

}

//——————————————————————————————————

 

void __fastcall TForm1::DrawDot(int cenx, int ceny, int x, int y)

{ C_P[cenx+x][ceny+y]=(TColor)cB;

C_P[cenx+x][ceny-y]=(TColor)cB;

C_P[cenx-x][ceny+y]=(TColor)cB;

C_P[cenx-x][ceny-y]=(TColor)cB;}

//——————————————————————————————————

 

void __fastcall TForm1::DrawPar(int cenx, int ceny, float ap,

 int endp, int cd_py)

{int x=0,y=0;int p,p_2,e,d,r;

C_P[cenx+x][ceny+y+cd_py]=(TColor)cB;

e=0;d=0;p=ap/2.;p_2=p/2;r=p_2+endp;

while (x<=r && y>=0 && y<=endp)

{ //1

C_P[cenx+x][ceny-y+cd_py]=(TColor)cB;

C_P[cenx-x][ceny-y+cd_py]=(TColor)cB;

//2

C_P[cenx+x][ceny+y-cd_py]=(TColor)cB;

C_P[cenx-x][ceny+y-cd_py]=(TColor)cB;

//определение случаев 1 или 2

e=2*(d-p);

if (d<0 && e<=0)

{ //шаг mh

++x; d+=2*x+1; continue; }

//определение случаев 4 или 5

e=2*(d-x)-1;

if (d>0 && e>0)

{ //шаг mv

++y; d+=-2*p; continue; }

//шаг md

++x; d+=2*x+1-2*p; ++y; }

}

//——————————————————————————————————

 

int __fastcall TForm1::Sign(int n)

{if (n>0) return 1;

else if (n==0)return 0;

else if (n<0) return -1;}

//——————————————————————————————————

 

void __fastcall TForm1::BrezenshemLine(int x1, int y1, int x2, int y2)

{ int dx,dy,sx,sy,flag,error,x,y,buf;

//инициализация переменных

dx=abs(x1-x2); dy=abs(y2-y1);

sx=Sign(x2-x1); sy=Sign(y2-y1);

x=x1; y=y1;

// обмен значений dx и dy  в зависимости от углового

// коэффициэнта наклона отрезка

flag=0;

if (dy>dx)

{ buf=dx; dx=dy; dy=buf; flag=1; }

// инициализация error с поправкой на половину пиксела

error=2*dy-dx;

// основной цикл

 for(int i=0;i<=dx;++i)

{ C_P[x][y]=(TColor)cB;

if (error>=0)

{ if (flag==1)    x+=sx;

else  y+=sy; error-=2*dx; }

if (flag==1)     y+=sy;

else   x+=sx; error+=2*dy; }

}

//——————————————————————————————————

 

void __fastcall TForm1::fillTriangle1(struct Point p1[])

{int iMax,iMin,iMid,i;

iMax=0;iMin=0;iMid=0;

for(i=1;i<3;i++)

if (p1[i].y<=p1[iMin].y) iMin=i;

else

if (p1[i].y>p1[iMax].y) iMax=i;

iMid=3-iMin-iMax;

Fixed dx01=p1[iMin].y!=p1[iMax].y?

int2Fixed(p1[iMin].x-p1[iMax].x)/

(p1[iMin].y-p1[iMax].y):01;

Fixed dx02=p1[iMax].y!=p1[iMid].y?

int2Fixed(p1[iMid].x-p1[iMax].x)/

(p1[iMid].y-p1[iMax].y):01;

Fixed dx21=p1[iMid].y!=p1[iMin].y?

int2Fixed(p1[iMin].x-p1[iMid].x)/

(p1[iMin].y-p1[iMid].y):01;

Fixed x1=int2Fixed(p1[iMax].x);

Fixed x2=x1;

for(i=p1[iMax].y;i>=p1[iMin].y;i—)

{x1+=dx02;

x2+=dx01;

C_P_C=(TColor)R_G;

C_M(fixed2Int(x1),i);C_L(fixed2Int(x2),i);}

for(i=p1[iMin].y+1;i>=p1[iMid].y;i—)

{x1+=dx01;

x2+=dx21;

C_P_C=(TColor)R_G;

C_M(fixed2Int(x1),i);C_L(fixed2Int(x2),i);}

}

//——————————————————————————————————

 

void __fastcall TForm1::fillTriangle2(struct Point p2[])

{int iMax,iMin,iMid,i;

iMax=0;iMin=0;iMid=0;

for(i=1;i<3;i++)

if (p2[i].y<p2[iMin].y) iMin=i;

else

if (p2[i].y>p2[iMax].y) iMax=i;

iMid=3-iMin-iMax;

Fixed dx01=p2[iMax].y!=p2[iMin].y?

      int2Fixed(p2[iMax].x-p2[iMin].x)/

(p2[iMax].y-p2[iMin].y):01;

Fixed dx02=p2[iMin].y!=p2[iMid].y?

      int2Fixed(p2[iMid].x-p2[iMin].x)/

(p2[iMid].y-p2[iMin].y):01;

Fixed dx21=p2[iMid].y!=p2[iMax].y?

int2Fixed(p2[iMax].x-p2[iMid].x)/

(p2[iMax].y-p2[iMid].y):01;

Fixed x1=int2Fixed(p2[iMin].x);

Fixed x2=x1;

for(i=p2[iMin].y;i<=p2[iMid].y;i++)

{C_P_C=(TColor)R_G;

C_M(fixed2Int(x1),i);C_L(fixed2Int(x2),i);

x1+=dx01;

x2+=dx02;}

for(i=p2[iMid].y+1;i<=p2[iMax].y;i++)

{x1+=dx01;

x2+=dx21;

C_P_C=(TColor)R_G;

C_M(fixed2Int(x1),i);C_L(fixed2Int(x2),i);}

}

//——————————————————————————————————

 

void __fastcall TForm1::FormPaint(TObject *Sender)

{Color=(TColor)cW;

int xc=14*mx,yc=9*my,I, endp=3*my,cd_py=8*my;

int a=8*mx,b=sqrt(28.07)*my-0.2*my, endg_x=11*mx,endg_y=5*my;

float ap=40.333*mx;

struct Point p[]={3*mx,4*my,

8.5*mx,9*my,

3*mx,14*my,

25*mx,4*my,

19.5*mx,9*my,

25*mx,14*my};

struct Point p1[]={3*mx,4*my,

25*mx,4*my,

14*mx,9*my,

3*mx,4*my};

struct Point p2[]={3*mx,14*my,

25*mx,14*my,

14*mx,9*my,

3*mx,14*my};

C_P_C=(TColor)cB;

XoY(xc,yc);

DrawGip(xc,yc,a,b,endg_x,endg_y);

C_T(22.7*mx,9.7*my,»x^2/64-y^2/28.07=1″);

C_M(22.7*mx,10.5*my);C_L(28*mx,10.5*my);

C_M(22.7*mx,10.5*my);C_L(22.35*mx,11*my);

DrawPar(xc,yc,ap,endp,cd_py);

C_T(1.1*mx,1.1*my,»x^2=40.333(y-5)»);

C_M(1.1*mx,1.85*my);C_L(5.8*mx,1.85*my);C_L(6*mx,2.7*my);

C_T(1*mx,16.7*my,»x^2=40.333(y+5)»);

C_M(1*mx,17.5*my);C_L(5.5*mx,17.5*my);C_L(7*mx,15.8*my);

for(i=0;i<2;i++)

BrezenshemLine(p[i].x,p[i].y,p[i+1].x,p[i+1].y);

for(i=3;i<5;i++)

BrezenshemLine(p[i].x,p[i].y,p[i+1].x,p[i+1].y);

//верхний треугольник

BrezenshemLine(p1[0].x,p1[0].y,p1[1].x,p1[1].y);

BrezenshemLine(p1[1].x,p1[1].y,p1[2].x,p1[2].y);

BrezenshemLine(p1[0].x,p1[0].y,p1[2].x,p1[2].y);

fillTriangle1(p1);

//нижний треугольник

BrezenshemLine(p2[0].x,p2[0].y,p2[1].x,p2[1].y);

BrezenshemLine(p2[1].x,p2[1].y,p2[2].x,p2[2].y);

BrezenshemLine(p2[0].x,p2[0].y,p2[2].x,p2[2].y);

fillTriangle2(p2);

}

//———————————————————————————————-

 

 Рисунок 1. Заданная фигура

Список литературы:

  1. Шикин Е.В., Боресков А.В. Компьютерная графика. Полигональные модели. — М.: ДИАЛОГ-МИФИ, 2005.-464с.: ил.
    . Построение всей фигуры осуществляется по алгоритму Брезенхема ( парабола, гипербола, линии). Метод растровой развёртки применяется в телевидении, при демонстрации кинофильмов. » author=»Ананьева Марина Алексеевна» publisher=»БАСАРАНОВИЧ ЕКАТЕРИНА» pubdate=»2017-01-25″ edition=»ЕВРАЗИЙСКИЙ СОЮЗ УЧЕНЫХ_31.10.15_10(19)» ebook=»yes» ]