Е. Жақсылықов мультимедиалық ЖҮйелерді жобалау және қҰрастыру


Үш өлшемді денелер геометриясы



бет5/9
Дата21.07.2016
өлшемі3.19 Mb.
#214513
1   2   3   4   5   6   7   8   9

7 Үш өлшемді денелер геометриясы


Перспективасы және көлеңкесі бар үш өлшемді дене.

Шынайы үш өлшемді кескін үшін оның проекциясының перспектива заңдарына сәйкес көмескіленетінін ескеру қажет. Қалындығы тұрақты көлемді дене үшін перспективаны модельдеу ең жеңіл. Жазықтықтардың біреуінің төбелерінің координаттары (X.,Y.) i=1,…,n. Көкжиектегі сызықтардың қиылысу нүктесінің (9.1 сур.) кординаттары (X0,Y0). (X0,Y0) нүктесі арқылы өтетін түзу сызықтар шоғының параметрлі теңдеуін жазайық:


t[0,1]
Егер t=0, сонда (х,у) = (Xi,Yi). t = 1 болғанда (х,у) = (X0,Y0). t=h, 0<һ<1 бекітілген мәнінде бұл теңдеуден Р жазықтығынан (Xi,Yi) нүктесіне қарай жылжыған нүктелер тобының кординаттарын аламыз:

Xi =Xi +h (X0-Xi)

Yi =Yi +h (Y0-Yi)

Р аймағынан көлеңкені құру үшін, жарық көзі () нүктесінде орналасқан деп есептейік. у = у түзуі Р жазықтығының көлденең бетке проекциясы болсын. Сонда А() нүктесінен А көлеңке нүктесін табу үшін келесі теңдеулер жүйесін шешу қажет:

мұндағы (): () нүктесінің у = у түзуіне проекциясы. Жүйенің шешімі келесідегідей:
;


Мысал 14. «RWS-3.X» символар жолының көлеңкесі бар көлемді суретті құратын бағарлама жазу.

Тапсырманы орындау технологиясы:

String_3D процедурасына енетін параметрлері келесі мәндерге ие:

s енгізілетін жол;

жолдың басының экрандық абциссасы;

сызықтардың қосылу нүктесінің координаттары;

символдар арасындағы қашықтық;

төменгі шектің ординатасы;

жарық көзінің координаттары;

cs символдар түсі;

ct көлеңке түсі;

l1,l2,h ені, биіктігі және қалыңдығының ұлғаю коэффициенті.

Әрбір символдың контуры (), 1,…,Nu сияқты салыстырмалы координаттар массиві ретінде беріледі. және -тің мәндері ‘s.fnt’ мәтіндік файлында жазылған. String_3D процедурасы файлдан оқып, ShowStr процедурасына жүгінеді. ShowStr процедурасы () координаттарын ()-ке ығыстырады да, координаттар жүйесін l1, l2 коэффициенттерімен созады, символдың бүйір жағын перспективаны есепке ала отырып, қатынасына сәйкес құрады, сонан соң символдың алдыңғы жағын құрып, соңында көлеңкені келесі формула бойынша құрады:




Перспективасы мен көлеңкесі бар денелерді бейнелеу модулінің мәтіні
Unit Unit1;

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;



Type

TForm1 = class(TForm)

Panel1: TPanel;

Image1: TImage;

procedure FormActivate(Sender: Object);

private


{Private declarations}

Procedure String_3D(s: string;

xn, {жол басы}

x0,y0, {кіру нүктесі}

hn, {әріптер арасында}

yb, {төменгі шек}

xc,yc: integer; {күн}

cs, {символдар түсі}

ct: byte; {көлеңке түсі}

l1, l2, h: real); {ені, бикітігі, қалыңдығы}

public

{Public declarations}



end;
var Form1: TForm1;
implementation

{SR *.DFM}


procedure TForm1.String_3D (s: string;

xn, {жол басы}

x0,y0, {кіру нүктесі}

hn, {әріптер арасында}

yb, {төменгі шек}

xc,yc: integer; {күн}

cs, {символдар түсі}

ct: byte; {көлеңке түсі}

l1, l2, h: real); {ені, бикітігі, қалыңдығы}

var xk, yk,xt,yt: longint;

i, j, Nu: byte;

Po: array[1..60] of TPoint;

xx, yy: array [1..60] of integer;

f: textFile;

ch: char;
procedure Pr(x,y: longint; var xt, yt: longint);

begin


if ((x0-x)*(yc-y) - (xc-x)*(y0-yb))< > 0

then yt := (yb*(x0-x)*(yc-y) – y*(xc-x)*(y0-yb)) div ((x0-x)*(yc-y) - (xc-x)*(y0-yb))

else yt := (yb*(yc-y) – y*(y0-yb)) div ((yc-y) - (y0-yb));

xt := x+(yt-yb)*(x0-x) div (y0-yb);

end;

procedure ShowStr(xk, yk: integer);



var i: integer;

begin


with Image1.Canvas do

begin


Brush.Color := $0F0F0F; {Cs mod 16;}

Pen.Color := $0F0F0F; {Cs mod 16;}

xt := xx[1]; yt := yy[1];

for i := 2 to Nu do {бүйір жағы}

begin

Po[1].x := xk + Trunc(l1*xx[i-1]);



Po[1].y := yk - Trunc(l2*yy[i-1]);

Po[2].x := xk + Trunc(l1*xx[i]);

Po[2].y := yk - Trunc(l2*yy[i]);

Po[3].x := Trunc((1-h)*(xk+l1*xx[i]) + h*x0);

Po[3].x := Trunc((1-h)*(yk+l2*yy[i]) + h*y0);

Po[4].x := Trunc((1-h)*(xk+l1*xx[i-1]) + h*x0);

Po[4].x := Trunc((1-h)*(yk+l2*yy[i-1]) + h*y0);

Polygon(Slice(Po, 4));

end;

for i := to Nu do {алдыңғы жағы}



begin

Po[i].x := xk + Trunc(l1*xx[i]);

Po[i].y := yk - Trunc(l2*yy[i]);

end;


Brush.Color := clRed; {Cs div 16;}

Pen.Color := clRed; {Cs div 16;}

Polygon(Slice(Po, Nu));

for i := 1 to Nu do

begin

Pr(xk + Trunc(l1*xx[i]), yk - Trunc(l2*yy[i]), xt, yt);



Po[i].x := xt; Po[i].y:=yt;

end;


Brush.Color := Ct; Pen.Color := Ct;

Polygon(Slice(Po, Nu));

end;

end;
begin



AssignFile(f,’s.fnt’);

for i := to Length(s) do

begin

reset(f); ch := ‘ ‘;



while not EOF(f) and (ch<>s[i]) do

begin


Read(f, ch, Nu );

if ch<> s[i] then readln(f);

end;

if ch = s[i] then



begin

for j := 1 to Nu do read(f, xx[j]); readln(f);

read(f, ch, Nu); for j := 1 to Nu do read(f, yy[j]);

ShowStr(xn+(i-1)*hn, yb-8);

end;

CloseFile(f);



end;

end;

procedure TForm1.FormActivate(Sender: Object);

begin


String_3D(‘RwS-3.e‘, 100, 320, 120, 55, 238, 320, -100, $E4, 8, 0.6,1.0, 0.06 );

end;


end.


Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет