DUzun's Web
Programare, proiecte personale, divertisment

DUzun it's ME
 
/ 08 aprilie 2025, 20:54:23 /  
Conținut

Fig3D.pas

 
unit Fig3D;
interface
uses graph, D3, crt, dos, Strings;
const
  mElements=$FF;      // maximum elements
  mFigs=$FF;          // maximum figures
  DefColor=$ff8f0f;   // default color
type
  fElements =0..mElements;
  Figures   =0..mFigs;
  Colors    =0..$FFFFFF;            // 24 bits color
  LineName=array[1..2]of fElements; // a line is defined via 2 points
  TriangleName=array[1..3]of fElements;
     IDDist=record
      d:real;    //Distanta
      n:word;    //Nr. de ordine
      t:byte;    //Tipul fig:1-Triunghi; 2-Figura
     end;
 TFig=^TFig3D;
 TFig3D=object
   Constructor Init;
   Destructor Done;
   Procedure Drow(Orig:point);
   Procedure LDrow(n:fElements);             // LineDrow
   Procedure LDrow_rP(p1,p2:word);           // LineDrow relative points
   Procedure TDrow(n:fElements);             // TriangleDrow
   Function AddP(p1:point):fElements;        // AddPoint to figure
   Function AddL(n1,n2:fElements):fElements; // AddLine to figure
   Function AddFig(F:TFig):Figures;          // AddFigure to figure
   Function GetPN:fElements;                 // GetPointsNumber
//    Function GetLN:fElements;
   Function GetFN:Figures;
   Function GetTN:fElements;
   Function GetON:fElements;
   Procedure SetClr(c:Colors);           // SetColor
   Procedure MoveV(v:vector);            // Move by given vector
   Procedure MoveRel(x,y,z:longint);     // Move relatively
   Procedure AddIndex(n:word;t:byte);    // Add to index (for consecutive drow)
   Procedure OrdIndex;                   // Order figures in index by distance from O
   Procedure Calc_rP;                    // Calculate relative points
   Procedure CalcDynam;
   Procedure ReadFile(fn:string);
   Procedure ReadF(var F:text);
   Procedure WriteFile(fn:string);
   Procedure WriteF(var F:text);
   Procedure Optimize;
  Public
   Name: string[16];
   Clr:     ^Colors;
   Index:   array[word]of ^IDDist;
   nIndex:  Word;
{Fizics}
   speed: Vector;  // Speed
   m:     Word;    // Mass
{Geometry}
   Radius: Word;
   aC: Point;                             //Absolut Center
   rP: array[fElements]of ^Point;         //Relative Points
   Rate:    integer;
   Figs:    array[Figures]of TFig;
   nPoint, nLine, nTriangle: fElements;
   nFig: Figures;
   fC:^Point;     // Figures' center
   fP: array[fElements]of ^sPoint;
   fT: array[fElements]of ^TriangleName;
   tC: array[fElements]of ^Point;
   fL: array[fElements]of LineName;
   tPerpV: array[fElements]of ^Vector;
   tClr:   array[fElements]of ^Colors;
   Procedure tInit;
   oFL: ^text;
  end;
var i,j,k: longint;
    tmpP : point;
    tmpV : vector;
    Fig  : TFig3D;
Function Exist(fn:string):boolean;
Function DistP(p1,p2:point):real;
Function ClrIntens(v:vector;p,Lght:point):real;
implementation
uses Grph3D;
// ~ CalcDynam ~ //
Procedure TFig3D.CalcDynam;
var i:fElements;
begin
 i:=0;
 while not(Figs[i]=nil) do begin
  Figs[i]^.CalcDynam;  inc(i);
 end;
// pDif(o,aC,TP); if pModul(TP)<Radius then vDif(speed,Mv,speed);
      Gravity(speed,aC,0);
      for i:=1 to 3 do Speed[i]:=Speed[i]*miu;
      MoveV(speed);
end;
// ~ MoveV ~ //
Procedure TFig3D.MoveV;
begin
  for i:=1 to 3 do aC[i]:=round(aC[i]+v[i]);
end;
// ~ MoveRel ~ //
Procedure TFig3D.MoveRel;
begin
 fC^[1]:=fC^[1]+(x);
 fC^[2]:=fC^[2]+(y);
 fC^[3]:=fC^[3]+(z);
end;
// ~ Calc_rP ~ //
Procedure TFig3D.Calc_rP;
Begin
 if nPoint>0 then for i:=0 to nPoint-1 do begin
  pSum(aC,fP[i]^,tmpP);
  rP[i]^[1]:=PCrd(tmpP,1);
  if rP[i]^[1]>-deeph then begin
   rP[i]^[3]:=PCrd(tmpP,3);
   rP[i]^[2]:=PCrd(tmpP,2);
  end;
 end;
End;
// ~ LDrow_rP ~ //
Procedure TFig3D.LDrow_rP(p1,p2:word);
 var r1,r2:real;
 begin
   if(rP[p1]^[1]>0)and(rP[p2]^[1]>0)then begin
    r1:=DphP(rP[p1]^[1]);r2:=DphP(rP[p2]^[1]);
    line(ex+round(rP[p1]^[3]*r1),ey-round(rP[p1]^[2]*r1),
         ex+round(rP[p2]^[3]*r2),ey-round(rP[p2]^[2]*r2));
   end
 end;
// ~ TDrow ~ //
Procedure TFig3D.TDrow(n:fElements);
 var r1,r2,r3,intense:real;
     cl:Colors;
     c1,c2,c3:byte;
Begin
   if tClr[n]=nil then if Clr=nil then cl:=DefColor else cl:=Clr^ else cl:=tClr[n]^;
      outtextxy(mx-100,2,tex(cl));
      c1:=cl mod $100;
      c2:=cl div $100;
      c2:=cl div $10000;
      intense:=ClrIntens(tPerpV[n]^,tC[n]^,Lght);
      cl:=round(c1*intense)+round(c2*intense)*$100+round(c3*intense)*$10000;
      outtextxy(mx-100,30,tex(round(intense*10000)));
   SetFillColor(cl);
   if(rP[fT[n]^[1]]^[1]>0)and(rP[fT[n]^[2]]^[1]>0)and(rP[fT[n]^[3]]^[1]>0)then begin
    r1:=DphP(rP[fT[n]^[1]]^[1]);
    r2:=DphP(rP[fT[n]^[2]]^[1]);
    r3:=DphP(rP[fT[n]^[3]]^[1]);
    FillTriangle(ex+round(rP[fT[n]^[1]]^[3]*r1),ey-round(rP[fT[n]^[1]]^[2]*r1),
                 ex+round(rP[fT[n]^[2]]^[3]*r2),ey-round(rP[fT[n]^[2]]^[2]*r2),
                 ex+round(rP[fT[n]^[3]]^[3]*r3),ey-round(rP[fT[n]^[3]]^[2]*r3));
   end
End;
// ~ Drow ~ //
Procedure TFig3D.Drow(Orig:point);
var i:word; b:byte; pct:Point;nID:IDDist;
 Procedure CompOrdF(n:Figures);
 begin
  if(n>0)and(Index[n]^.d>Index[n-1]^.d)then begin
   nID:=Index[n]^;Index[n]^:=Index[n-1]^;Index[n-1]^:=nID;
   CompOrdF(n-1);
  end;
 end;
Begin
{Gasirea punctelor in Sp relativ din cel absolut}
 Calc_rP;
 {Desenarea liniilor, folosind punctele din sp rel}
 setColor(Clr^);
 if nLine>0 then for i:=0 to nLine-1 do LDrow(i);
 pDif(Orig,o,tmpP);
 GetVec(tmpP,tmpV);
 for j:=0 to nFig-1 do with Index[j]^,Figs[j]^ do begin
  n:=j;t:=2;
  if(fC^[1]=0)and(fC^[2]=0)and(fC^[3]=0)then d:=0 else
  d:=vpProd(tmpV,fC^)/pModul(fC^);
  CompOrdF(j);
 end;
 for j:=0 to nTriangle-1 do with Index[j]^ do begin
  n:=j;t:=1;
  if(tC[j]^[1]=0)and(tC[j]^[2]=0)and(tC[j]^[3]=0)then d:=0 else
  d:=vpProd(tmpV,tC[j]^)/pModul(tC[j]^);
  CompOrdF(j);
 end;
 for j:=0 to nIndex-1 do
  case Index[j]^.t of
   1:tDrow(Index[j]^.n);
   2:Figs[Index[j]^.n]^.Drow(fC^);
  end;
End;
// ~ LDrow ~ //
Procedure TFig3D.LDrow(n:fElements);begin LDrow_rP(fL[n][1],fL[n][2]);end;
// ~ AddIndex ~ //            ??????????????????????????
Procedure TFig3D.AddIndex;
Begin
 New(Index[nIndex]);
 Index[nIndex]^.n:=n;
 Index[nIndex]^.t:=t;
 Inc(nIndex);
End;
// ~ OrdIndex ~ //
Procedure TFig3D.OrdIndex;
Begin
End;
// ~ tInit ~ //
Procedure TFig3D.tInit;
begin
 if GetTN>0 then for i:=0 to nTriangle-1 do begin
  new(tC[i]);
  new(tPerpV[i]);
  for j:=1 to 3 do tC[i]^[j] := (fP[fT[i]^[1]]^[j] + fP[fT[i]^[2]]^[j] + fP[fT[i]^[3]]^[j]) div 3;
  vGetPerp(fP[fT[i]^[1]]^,fP[fT[i]^[2]]^,fP[fT[i]^[3]]^,tPerpV[i]^);
  VecUnit(tPerpV[i]^,tPerpV[i]^);
  AddIndex(I,1);
 end;
end;
// ~ Init ~ //
Constructor TFig3D.Init;
begin
 GetPN;
 Radius:=1000;
 for i:=0 to nPoint-1 do begin
   new(rP[i]);
 end;
//  nLine := 0;
//  GetLN;
 If fC<>nil then pSum(aC,fC^,aC);// else begin new(fC); fC^:=zero; end;
 tInit;
 nFig:=0;
 while not(Figs[nFig]=nil) do begin
  Figs[nFig]^.aC:=aC;
  Figs[nFig]^.Init;
  inc(nFig);
 end;
 for i:=0 to nFig-1 do AddIndex(I,2);
end;
// ~  ~ //
Function DistP;begin Result:=((sqr(p2[1]-p1[1])+sqr(p2[2]-p1[2])+sqr(p2[3]-p1[3])));end;
Function Exist;var sr:TSearchRec;begin FindFirst(fn,$3f,sr);if doserror=0 then Exist:=true else exist:=false;end;
Function ClrIntens(v:vector;p,Lght:point):real;
var l:point;dst:real;
begin
 PDif(p,Lght,l);
 dst:=pModul(l);
 ClrIntens:=abs(vpProd(v,l)*sqr(10000)/(sqr(dst)*dst));
end;
// ~ AddP ~ //
Function TFig3D.AddP;
var i:fElements;
begin
 i:=0;
 while((p1[1]<>fP[i]^[1])or(p1[2]<>fP[i]^[2])or(p1[3]<>fP[i]^[3]))and(i<nPoint)do inc(i);
 if i<nPoint then result:=i else begin
  new(fP[nPoint]);fP[nPoint]^:=p1;new(rP[nPoint]);result:=nPoint;inc(nPoint);
 end;
end;
// ~ AddL ~ //
Function TFig3D.AddL;
begin
//   new(fL[nLine]);
  fL[nLine][1]:=n1;
  fL[nLine][2]:=n2;
  result:=nLine;
  inc(nLine);
end;
// ~ AddFig ~ //
Function TFig3D.AddFig;
begin
 new(figs[nFig]);
 if F<>nil then figs[nFig]:=F;
 Result:=nFig;
 inc(nFig);
end;
{// --- Dealing with files... --- }
// ~ ReadFile ~ //
Procedure TFig3D.ReadFile;
begin
 if Exist(fn)then begin
  if not(Figs[0]=nil)then Done;
  new(Ofl); assign(OFL^,fn); reset(OFL^);
  ReadF(oFL^);
  close(OFL^); dispose(Ofl);
 end;
end;
// ~ ReadF ~ //
Procedure TFig3D.ReadF;
var c:char;
    ln:string;
    np:longint;
begin
 if Clr=nil then begin
  new(Clr);
  Clr^:=DefColor;
 end;
 fC^:=zero;
 WriteLN(#10,' ~Begin~');
 while not eof(F) do begin
  ln:='';
  repeat
  Read(F,c);
  if not(ord(c)in[32,10,13,61])then begin ln:=ln+upcase(c);end;
  until(c='=')or(eof(F));
{}if ln='RATE'then begin readLn(F,rate)end
{}else if ln='NAME' then begin readLn(F,Name);writeln('Name=',name)end
{}else if ln='COLOR' then begin SetClr(0);readLn(F,Clr^);writeln('Color=',Clr^)end
{}else if ln='XYZ'then begin new(Fc);readLn(F,fC^[1],fC^[2],fC^[3]);writeln('XYZ=',fC^[1],' ',fC^[2],' ',fC^[3])end
{}else if ln='POINTS'then begin
   readLn(F,np);writeln('nPoints=',nP);
   for i:=0 to np-1 do begin
    if eof(F)then exit;
    new(fP[i]);
    ReadLn(F,fP[i]^[1],fP[i]^[2],fP[i]^[3]);
    if rate<>0 then for j:=1 to 3 do fP[i]^[j]:=fP[i]^[j]*rate;
   end;
  end
{}else if ln='LINES'then begin
   readLn(F,np);writeln('nLines=',nP);
   for i:=0 to np-1 do begin
    if eof(F) then Break;
    inc(nLine);
//     new(fL[i]);
    readLn(F,fL[i][1],fL[i][2]);
{    dec(fL[i]^[1]); dec(fL[i]^[2]);}
   end;
  end
{}else if ln='FIGURE' then begin
   readLn(F,ln);
   if UpperCase(ln)='[END]'then begin Writeln(' ~End~'); exit;end;
   new(figs[GetFN]); inc(nFig);
   If UpperCase(ln)='[BEGIN]' then figs[nFig-1]^.ReadF(F)
                              else figs[nFig-1]^.ReadFile(ln);
  end
{}else readLn(F);
 end;
 Writeln(' ~End~',#10);
//  Init;
 Optimize;
end;
// ~ WriteFile ~ //
Procedure TFig3D.WriteFile;
begin
 if fn='' then fn:=name+'.3Df';
 new(oFL); assign(oFL^,fn); rewrite(oFL^);
 WriteF(oFL^);
 Close(oFL^); Dispose(oFL);
end;
// ~ WriteF ~ //
Procedure TFig3D.WriteF;
var fg:Figures;
begin
Writeln(f,#13#10,'Figure=[Begin]');
if name<>''then WriteLn(f,'NAME=',name);
if Clr<>nil then WriteLn(f,'COLOR=',Clr^);
if (fC^[1]or fC^[2]or fC^[3])<>0 then WriteLn(f,'XYZ=',FC^[1],' ',FC^[2],' ',FC^[3]);
if GetPN>0 then begin WriteLn(f,'POINTS=',nPoint);for i:=0 to nPoint-1 do WriteLn(f,fP[i]^[1],#32,fP[i]^[2],#32,fP[i]^[3]);end;
if nLine>0 then begin WriteLn(f,'LINES=',nLine);for i:=0 to nLine-1 do WriteLn(f,fL[i][1],' ',fL[i][2]);end;
if GetFN>0 then begin for fg:=0 to nFig-1 do Figs[fg]^.WriteF(f);end;
Writeln(f,'Figure=[End]');
end;
// ~ Optimize ~ //
Procedure TFig3D.Optimize;
var n:longint;
    eq:boolean;
    i,j,k: integer;
begin
for i:=nPoint-1 downto 1 do for j:=i-1 downto 0 do begin
 eq:=false;
 k:=1;
 while(k<4)and(fP[i]^[k]=fP[j]^[k])do inc(k);
 if k=4 then begin
    dec(nPoint);
    fP[i]^ := fP[nPoint]^;
    dispose(fP[nPoint]);
    for k:=0 to nLine-1 do begin
       n:=fL[k][1]; if n=i then n:=j else if n=nPoint then n:=i; fL[k][1]:=n;
       n:=fL[k][2]; if n=i then n:=j else if n=nPoint then n:=i; fL[k][2]:=n;
    end;
 end;
end;
for i:=nLine-1 downto 1 do for j:=i-1 downto 0 do
 if(fL[i][1]=fL[j][1])and(fL[i][2]=fL[j][2])then begin
   dec(nLine);
   fL[i]:=fL[nLine];
//   dispose(fL[nLine]);
 end;
end;
// ~ Get*N ~ //
Function TFig3D.GetPN;begin nPoint:=0; while not(fP[nPoint]=nil)do inc(nPoint);result:=nPoint;end;
// Function TFig3D.GetLN;begin nLine:=0; while not(fl[nLine]=nil)do inc(nLine);result:=nLine;end;
Function TFig3D.GetTN;begin nTriangle:=0; while not(fT[nTriangle]=nil)do inc(nTriangle);result:=nTriangle;end;
Function TFig3D.GetFN;begin nFig:=0; while not(Figs[nFig]=nil)do inc(nFig);result:=nFig;end;
Function TFig3D.GetON;begin nIndex:=0; while not(Index[nIndex]=nil)do inc(nIndex);result:=nIndex;end;
// ~ SetClr ~ //
Procedure TFig3D.SetClr(c:Colors);begin if Clr=nil then new(Clr);Clr^:=c;end;
// ~ Done ~ //
Destructor TFig3D.Done;
var i:Figures;
begin
if GetFN>0 then for i:=nFig-1 downto 0 do begin
  Figs[i]^.Done;
  dispose(Figs[i]);
end;
//i:=0;
//while(fL[i]<>nil)do begin dispose(fL[i]);inc(i);end;
i:=0;
while(fP[i]<>nil)do begin dispose(fP[i]);inc(i);end;
i:=0;
while(rP[i]<>nil)do begin dispose(rP[i]);inc(i);end;
end;
Procedure SPLine(p1,p2:point);
 var r1,r2:real;c1,c2:longint;
 begin
   c1:=PCrd(p1,1);
   if(c1>0)then begin c2:=PCrd(p2,1);if(c2>0)then begin
    r1:=DphP(c1);r2:=DphP(c2);
    line(ex+round(pCrd(p1,3)*r1),ey-round(PCrd(p1,2)*r1),
         ex+round(PCrd(p2,3)*r2),ey-round(PCrd(p2,2)*r2));
   end end
 end;
End.

Aici acumulez programe şi algoritmi interesanti alcătuiţi de mine (cu mici excepţii) pe parcursul studierii unor limbaje de programare.

Cea mai mare parte din ele sunt realizate în Pascal. 

Nu am scopul creării unui curs specializat sau a descrierii detaliate a anumitor limbaje, ci doar prezint informaţii utile, plus ceva exemple interesante...

 

Răsfoitorul de fișiere (File Browser):

Codul sursă al programelor este organizat în mape şi fişiere.

Paginile care conțin cod sursă de programe de regulă au un răsfoitor de fișiere în partea stangă a paginii reprezentat de un bloc cu titlul „File Browser”.

Pentru a vizualiza un program sau conţinutul unei mape, faceţi click pe numele fişierului / mapei. Dacă fişierul nu este textual, el se va descărca automat, iar dacă este textual, conținutul lui se va afișa într-un bloc pe centrul paginii.

Pentru a descărca un fişier, faceţi click pe dimensiunea (size) lui.

arr_d Limba / Language


 


arr_r Login
 
 
Loading...