[Pascal] Jak vybarvím svůj stromek

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod valecny 1. 2. 2007 22:25

Ahoj. Jsem naprostý začátečník v Pascalu. S pomocí kámoše jsem vykutil stromek. Potřeboval bych ho ale vybarvit na zeleno, popřípadně na něho hodit kolečko barevné jako baňku. A na hoře hvězdu.
Mám Borland Pascal 7.
program Tzima;
uses graph,crt;
const
{stromek}
stromek_x: array[1..17] of Integer = (500,460,500,470,500,480,500,490,525,560,550,570,550,580,550,590,550);
stromek_y: array[1..17] of Integer = (450,450,430,430,410,410,390,390,350,390,390,410,410,430,430,450,450);
var gm,gd,i:integer;
begin
initgraph(gd,gm,'../BGI');
setbkcolor(brown);

for i:= 1 to 17 do begin
Line(stromek_x[i], stromek_y[i], stromek_x[i+1], stromek_y[i+1]);
end;
{konec_stromku}
{domek}
setcolor(2);
SetFillstyle(1,2);
rectangle(320,350,430,450);


{konec_domku}



readln; {program ceka na stisk enteru}
closegraph;
end.

Toho domku si moc nevšímejte je to malý pokus nakreslit domek:D
Víte, jaké byly tři největší katastrofy v dějinách lidstva? Hirosima 45, Cernobyl 86 a Windows 95.
valecny
Junior
Uživatelský avatar

Odeslat příspěvekod JM 1. 2. 2007 23:28

Na vybarvování se použije FloodFill, podívej se do nápovědy.

Ostatně - tohle nemůže fungovat, protože stromek_x[i+1] způsobí při i=17 chybu 201. A ten stromek není dole uzavřený, takže by ti to vybarvilo celou obrazovku.
JM
Junior
Uživatelský avatar

Odeslat příspěvekod valecny 2. 2. 2007 11:20

No tak teda jak by jsem ten stromek měl nakreslit??
Víte, jaké byly tři největší katastrofy v dějinách lidstva? Hirosima 45, Cernobyl 86 a Windows 95.
valecny
Junior
Uživatelský avatar

Odeslat příspěvekod fatman 2. 2. 2007 11:52

Máš stromek_x definovaný jako array[1..17], ale pro proměnnou i=17 v řádku
Kód: Vybrat vše
Line(stromek_x[i], stromek_y[i], stromek_x[i+1], stromek_y[i+1]);
už máš stromek_x[i+1] přeci stromek_x[18] (analogicky pro stromek_y). Takže tu poslední spojnici buď nakresli samostatným příkazem Line nebo si definuj array[1..18], cyklus for nech do 17 a 18. hodnotu v definici array dej stejnou jako 1.

Btw., když máš ve for jen jeden příkaz, nemusíš ho dávat mezi begin ... end.
"Věřím v reinkarnaci, jakožto nutnou likvidaci materialisace lidské idealisace, bez vyloučení sensace!"
(J. Váchal, Krvavý román)
fatman
Junior
Uživatelský avatar

Odeslat příspěvekod valecny 2. 2. 2007 14:24

Mám:)a tedka jak ho vybarvím ten stromek??
Víte, jaké byly tři největší katastrofy v dějinách lidstva? Hirosima 45, Cernobyl 86 a Windows 95.
valecny
Junior
Uživatelský avatar

Odeslat příspěvekod fatman 2. 2. 2007 14:30

JM píše:Na vybarvování se použije FloodFill, podívej se do nápovědy.v/quote]


Přesně jak píše JM. :wink:
"Věřím v reinkarnaci, jakožto nutnou likvidaci materialisace lidské idealisace, bez vyloučení sensace!"
(J. Váchal, Krvavý román)
fatman
Junior
Uživatelský avatar

Odeslat příspěvekod valecny 2. 2. 2007 15:04

no zkoušel jsem to ale vybarví se mi celé pozadí:((
Přikládám už novější*.pas
program Tzima;
uses graph,crt;

type
Polypoint = record
x,y:integer
end;
const
{stromek}
stromek_x: array[1..20] of Integer = (500,500,460,500,470,500,480,500,490,525,560,550,570,550,580,550,590,550,550,500);
stromek_y: array[1..20] of Integer = (450,420,420,400,400,370,370,350,350,310,350,350,370,370,400,400,420,420,450,450);
strecha: array[1..4] of Polypoint = ((x: 260; y:290),(x: 345; y:200),(x: 430; y:290),(x: 260; y:290));
strecha_bouda: array[1..3] of Polypoint = ((x:180; y:400), (x:205; y:380), (x:230; y:400));

var gm,gd,i:integer;

begin
initgraph(gd,gm,'../BGI');
setbkcolor(black);
setFillStyle(1,green);
bar(0,410,640,480);

for i:= 1 to 19 do begin
Line(stromek_x[i], stromek_y[i], stromek_x[i+1], stromek_y[i+1]);
end;
{konec_stromku}

{domek}
setcolor(white);
SetFillstyle(1,yellow);
bar(260,290,430,440);

{okna}
setFillStyle(1,blue);
bar(270,310,330,340);
bar(360,310,420,340);
bar(270,365,330,395);
{zaluzie}
setFillStyle(1,9);
bar(270,312,330,314); bar(270,318,330,320); bar(270,324,330,326);
bar(270,330,330,332); bar(270,336,330,338);

bar(360,312,420,314); bar(360,318,420,320); bar(360,324,420,326);
bar(360,330,420,332); bar(360,336,420,338);

bar(270,367,330,369); bar(270,373,330,375); bar(270,379,330,381);
bar(270,385,330,387); bar(270,391,330,393);
{konec zaluzii}
{konec_oken}

{dvere}
setcolor(black);
setFillStyle(1,brown);
bar(370,380,420,440);
setFillStyle(1,0);
Pieslice(395,390,0,360,1);
line(410,410,415,410);
setFillStyle(1,0);
bar(390,430,400,440);
{konec dveri}

{strecha}
setcolor(white);
setFillStyle(1,red);
FillPoly(SizeOf(Strecha) div SizeOf(Polypoint),Strecha);
setcolor(yellow);
line(260,290,430,290);
{konec strechy}
{konec_domku}

{bouda}
setFillStyle(1,brown);
bar(180,400,230,440);
setcolor(0);
line(180,440,230,440); line(180,400,180,440); line(230,400,230,440);
{strecha boudy}
setcolor(white);
setFillStyle(1,brown);
FillPoly(SizeOf(Strecha_bouda) div SizeOf(Polypoint),Strecha_bouda);
setcolor(black);
line(180,400,230,400);
{konec strechy boudy}
setFillStyle(1,black);
bar(195,420,215,440);
line(185,405,225,405); line(185,415,225,415); line(185,405,185,415);
line(225,405,225,415);


{bouda}




readln; {program ceka na stisk enteru}
closegraph;
end.
Víte, jaké byly tři největší katastrofy v dějinách lidstva? Hirosima 45, Cernobyl 86 a Windows 95.
valecny
Junior
Uživatelský avatar

Odeslat příspěvekod fatman 2. 2. 2007 15:20

Dej si to readln; po každém vyplnění, ať víš, kde to dělá, někde ti chybí kousek čáry nebo jsou blbě souřadnice.
"Věřím v reinkarnaci, jakožto nutnou likvidaci materialisace lidské idealisace, bez vyloučení sensace!"
(J. Váchal, Krvavý román)
fatman
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 2. 2. 2007 16:43

fatman píše:Dej si to readln; po každém vyplnění, ať víš, kde to dělá, někde ti chybí kousek čáry nebo jsou blbě souřadnice.
Nargon
Moderátor

Odeslat příspěvekod valecny 2. 2. 2007 17:03

Nemůžu si pomoct, jsem si jist že tam nemám místo nikde a přesto se to vybarvuje celé....
Do const jsem přidal kmen=brown;
A pak readln;
line(500,420,550,420);
readln;
SetFillStyle(1,brown);
readln;
FloodFill(526,423,kmen);
Říkám jsem začátečník. Mám to vůbec dobře to FloodFill??? Měl by se vybarvit kmen stromu.
Víte, jaké byly tři největší katastrofy v dějinách lidstva? Hirosima 45, Cernobyl 86 a Windows 95.
valecny
Junior
Uživatelský avatar

Odeslat příspěvekod JM 2. 2. 2007 19:10

SetFillStyle(Pattern,Color);
FloodFill(x,y,BorderColor);

Začíná se vybarvovat v bodě x,y a vybarví vzorkem Pattern a barvou Color celou plochu ohraničenou barvou BorderColor. Takže BorderColor musí být ta barva, kterou je nakreslený stromek.

Chci bile ohraničený zelený stromek:

Kód: Vybrat vše
SetColor(white);
for i:= 1 to 19 do begin
  Line(stromek_x[i], stromek_y[i], stromek_x[i+1], stromek_y[i+1]);
end;
SetFillStyle(solidfill,green);
FloodFill(510,400,white);
{konec_stromku}


// to 510,400 je od oka, musí to prostě být nějaký bod uvnitř stromku.
// solidfill = celá plocha je vybarvená, podívej se do helpu na konstanty.

Jestli chceš hnědý kmen, musíš ho oddělit další čárou od zbytku stromu a vybarvit zvlášť.
JM
Junior
Uživatelský avatar

Odeslat příspěvekod valecny 2. 2. 2007 20:09

Mám to děkuji Vám:))
Víte, jaké byly tři největší katastrofy v dějinách lidstva? Hirosima 45, Cernobyl 86 a Windows 95.
valecny
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků