Перспективасы және көлеңкесі бар үш өлшемді дене.
Шынайы үш өлшемді кескін үшін оның проекциясының перспектива заңдарына сәйкес көмескіленетінін ескеру қажет. Қалындығы тұрақты көлемді дене үшін перспективаны модельдеу ең жеңіл. Жазықтықтардың біреуінің төбелерінің координаттары (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>
Достарыңызбен бөлісу: |