Program vykreslí vrstevnice troch kopcov plus osi x,y

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Category: Source in Pascal

Program: Vrstev.pas
File exe: Vrstev.exe
need: Egavga.bgi

Program vykreslí vrstevnice troch kopcov plus osi x,y. Jednotlivé vrstevnice sú farebne odlíšené.
{ VRSTEV.PAS                Copyright (c) TrSek alias Zdeno Sekerak }
{ Program vykresli vrstevnice troch kopcov plus osy x,y.            }
{ Jednotlive vrstevnice su farebne odlisene.                        }
{                                                                   }
{ Datum:01.12.2004                             http://www.trsek.com }
 
program zobrazit_vrtevnice;
uses crt,dos,graph;
 
const pv=14;                    { pocet vrstiev }
      poc_vrs=7;                { pocet vrstevnic na jednu farbu }
      max_vys=pv*poc_vrs;       { maximalna zobrazena vyska }
      pozadie = Black;          { takto vypada pozadie }
      kriz    = White;          { takuto farbu ma osovy kriz }
      vrstvy:array[1..pv] of byte=(
          LightGray,
          Yellow,
          LightRed,
          Red,
          LightMagenta,
          Magenta,
          LightGreen,
          Green,
          LightCyan,
          Cyan,
          LightBlue,
          Blue,
          Brown,
          DarkGray);
 
 
var gd, gm: integer;
         i: integer;            { pocitadlo vrstevnic }
     kx,ky: real;               { mierka v osi x, y   }
     sx,sy: integer;            { posuv zaciatku v osi x,y }
      krok: integer;            { krok vrstevnice     }
        dlz_x, dlz_y: real;     { jednotlive maximalne suradnice }
      vrs_od, vrs_do: integer;  { odkial pokial zobrazit }
 vrch1, vrch2, vrch3: integer;  { vysky vrcholov      }
 
procedure EGAVGA_dr; external;
{$L EGAVGA.OBJ }
 
 
{ urci farbu vrstevnice }
{ podeli hodnotu vrsta premennou poc_vrst          }
{ ak vyjde farba mimo rozsah zvoli farbu pozadia   }
function Farba(vrstva:integer):integer;
var fa:integer;
begin
  fa:=(vrstva div poc_vrs)+1;
 
  if(fa>pv) then
     Farba:=pozadie             { taku uz mepoznam }
  else
     Farba:=vrstvy[fa];
end;
 
 
{ prevedie cislo na text }
function ToNumber(numb:real):string;
var s:string;
begin
  if( Frac(numb)<>0)then
    str(numb:0:2,s)
  else
    str(numb:0:0,s);
 
  ToNumber:=s;
end;
 
 
{ vykresli osovy kriz }
procedure OsKriz(dlz_x,dlz_y,kx,ky:real);
var StredX, StredY:integer;  { suradnice stredu }
    i,x,y:integer;
    krok:real;          { krok cisel na osovom krizi }
    pkrok:integer;      { kolko pixelov ma krok    }
    numb:string;        { pre prevod cisla na text }
begin
  SetColor(kriz);
  { vypocitaj suradnice stredu }
  StredX := GetMaxX div 2;
  StredY := GetMaxY div 2;
 
  { zobrazime osoveho kriza }
  Line(0, StredY, GetMaxX, StredY);
  Line(StredX, 0, StredX, GetMaxY);
 
  { pre zobrazime ciselnika os x }
  krok:=dlz_x/8;
 
  for i:=-10 to 10 do
  begin
    x:=StredX+Round(i*kx*krok);
    numb:=ToNumber(i*krok);
 
    Line(x, StredY-5, x, StredY+5);
    OutTextXY(x-(TextWidth(numb) div 2), StredY+12, numb );
  end;
 
  { pre zobrazime ciselnika os y }
  krok:=dlz_y/8;
 
  for i:=-10 to 10 do
  begin
    y:=StredY+Round(i*ky*krok);
    numb:=ToNumber(-i*krok);
 
    Line(StredX-5, y, StredX+5, y);
    OutTextXY(StredX+12, y-(TextHeight(numb) div 2), numb );
  end;
end;
 
 
{ nakresli vrstvu - obycajna elipsa }
{ vstupne parametre x,y-pozicia stredu, s-sirka, v-vyska }
procedure KresliVrstvu(x,y,s,v:integer;kx,ky:real);
begin
  { upravime podla mierky }
  x:=round(x*kx);
  y:=round(y*ky);
  s:=round(s*kx);
  v:=round(v*ky);
 
  { vstupne podmienky }
  if( s<=0 ) then exit;
  if( v<=0 ) then exit;
 
  { tuto vykresli vrstvu }
  Ellipse(x, y, 0, 360, s, v );
end;
 
 
{ nakresli vrstvu - valec }
{ vstupne parametre x,y-pozicia stredu, s-sirka, v-vyska }
procedure KresliVrstvu2(x,y,s,v:integer;kx,ky:real);
var v2,s2:integer;
begin
  { upravime podla mierky }
  x:=round(x*kx);
  y:=round(y*ky);
  s:=round(s*kx);
  v:=round(v*ky);
 
  { vstupne podmienky }
  if( s<=0 ) then exit;
  if( v<=0 ) then exit;
 
  v2:=v div 2;
  s2:=s div 2;
 
  { tuto vykresli vrstvu }
  line( x-s2+v2, y-v2, x+s2-v2, y-v2);
  line( x-s2+v2, y+v2, x+s2-v2, y+v2);
 
  arc( x-s2+v2, y, 90,270, v2);
  arc( x+s2-v2, y, 270,90, v2);
end;
 
 
BEGIN
  { len pre potreby testovania }
  dlz_x:=320;
  dlz_y:=240;
 
  vrs_od:=1;
  vrs_do:=100;
  krok:=5;
 
  vrch1:=100;
  vrch2:=100;
  vrch3:=100;
 
  ClrScr;
  {
  WriteLn('Kreslenie vrstevnic podla vstupnych parametrov.');
  Write('Zadaj maximalnu hodnotu osi x [max 320]: ');
  ReadLn(dlz_x);
 
  Write('Zadaj maximalnu hodnotu osi y [max 240]: ');
  ReadLn(dlz_y);
 
  Write('Zadaj maximalnu vysku vrstevnic [1..',max_vys,']: ');
  ReadLn(vrs_do);
 
  Write('Zadaj minimalnu vysku vrstevnic [1..',max_vys,']: ');
  ReadLn(vrs_od);
 
  Write('          Zadaj krok vrstevnice [1..20]: ');
  ReadLn(krok);
 
  Write('            Zadaj vysku 1 kopca [1..',max_vys,']: ');  ReadLn(vrch1);
  Write('            Zadaj vysku 2 kopca [1..',max_vys,']: ');  ReadLn(vrch2);
  Write('            Zadaj vysku 3 kopca [1..',max_vys,']: ');  ReadLn(vrch3);
  }
 
  { trochu upravime premenne vrch }
  vrch1:=max_vys - vrch1;
  vrch2:=max_vys - vrch2;
  vrch3:=max_vys - vrch3;
 
  { inicializacia grafiky }
  Gd := Detect;
  RegisterBGIdriver(@egavga_dr);
  gd:=9;gm:=2;
  InitGraph(Gd, Gm,' ');
  if GraphResult <> grOk then Halt(1);
 
  { vypocitame konstanty pre mierku }
  kx:=(GetMaxX+1)/(2*dlz_x);
  ky:=(GetMaxY+1)/(2*dlz_y);
 
  sx:=Round((GetMaxX+1-(2*dlz_x))/2);
  sy:=Round((GetMaxY+1-(2*dlz_y))/2);
 
  for i:=vrs_od to vrs_do do
  begin
    if(i div krok = (i/krok)) then
    begin
      SetColor(Farba(i));
 
      { kopec vlavo hore }
      KresliVrstvu( 100-sx, 100+i-sy div 2, 1*(i-vrch1), 2*(i-vrch1), kx, ky);
 
      { kopec vpravo hore }
      KresliVrstvu( 300+i-sx, 100-sy, 2*(i-vrch2), 1*(i-vrch2), kx, ky);
 
      { kopec vstrede dole }
      KresliVrstvu2( 370+i-sx, 300+i-sy, 6*(i-vrch3), 4*(i-vrch3), kx, ky);
    end;
  end;
 
  { vykresli osovy kriz }
  OsKriz(dlz_x,dlz_y,kx,ky);
 
  { pocka na stlacenie klavesu Enter a zavrie grafiku }
  Readln;
  CloseGraph;
END.