Gå til innhold

matematisk tabell problem i delphi - slå sammen figurer til en


Anbefalte innlegg

Jeg har et matematisk problem i delphi som jeg søker en løsning på

 

det er plasseringer av noen verdier etter noen bestemte regler

 

hvordan får jeg det til

 

rutenetter kan være fra 2 x2 til uendelig antall ruter , men det er samme antall i begge retninger.

 

Det er ikke same antall ruter hele tiden , men varierer hver gang jeg har bruk for denne utregningen

 

Eksempel :

 

B : bredde = 5

 

h: høyde = 5

 

resultatet skal være som her :

0 0 0 0 17

0 0 0 17 1

0 0 17 1 1

0 17 1 1 1

17 1 1 1 1

 

feltene med verdien 0 trenger ikke å beregnes ut

 

jeg har bare brukt to tellere for horisontal (t1) og vertikal retning (t2)

 

problemet er å beregne rett posisjon( felt ) til hver av verdiene

 

 

husk at antall "kolonner" og "linjer" variere for hver gang denne "tabellen " skal beregnes

 

som dere ser så er det digonalen som skal ha verdien 17 og det til høyre og ned verdien 1

 

tilgjengelige variabler blir da :

bredde , høyde og de to tellerne t1 (b) og t2 (h)

Endret av elg-elg123
Lenke til kommentar
Videoannonse
Annonse

Nå er jeg neimen ikke sikker på at jeg forstår hva du egentlig forsøker å gjøre, men for meg ser det ut som det enkleste må være å lage en funksjon som returnerer verdien i en gitt celle:

 

function ValueInCell(X, Y: integer): integer;
begin
 if x = y then
   result := 17
 else if x > y then
   result := 1
 else
   result := 0;
end;

 

Når du har denne funksjonen kan du bruke denne til å fylle opp tabellen din, eller vurdere om du i det hele tatt trenger noen tabell..

 

-Vegar

Endret av Format71
Lenke til kommentar

Jeg har tenkt litt feil når det gjaldt problemet . Med andre ord så virker som om jeg egentlig har løst problemet før det har oppstått.

 

Poenget med programmet jeg forsøker å lage er å kunne lage sine egne knapper når man programmer . Egentlig så er det bare bilder som blir laget .

 

Jeg synes det er enklere på denne måten en bruke et vanlig tegne progrm til det .

 

prinsippet at hver knapp består av et rutenett.

 

I dette rutenett plaserer man noen grafiske figurer.

 

Jeg har gjort det slik at men kan velge mellom 173 forskjelige ( 0-172).

egentlig så er de noen få grunnfigurer og resten er kombinasjoner av disse .

 

Får å plassere disse figurene så bruker jeg en sekvens med disse variablene :

 

x,y,k,b,h,v,fx,tx-fy-ty

 

eks :

 

6,0,18,1,1,1,0-1,0-1

 

x og y er plassering horisontalt og vertikalt

 

k er koden – altså nummeret på den grafiske figuren

 

b og h er bredde og høyde – altså hvor mange ruter den grafiske figuren dekker

 

v virsuelt forteller om fx,tx,fy,ty område med skal skules eller vises

 

fx fra område

 

tx til område

 

fy fray

 

ty til y

 

for å lagge et « knappe bilde» så trenge men mange av disse grafiske figuren plaser på flere steder i rutenett

 

listen med alle disse sekvensen kan bli ganske lang

 

så nå jobber jeg med å redusert den ved å la programmet behandle listen

 

det første blir å splitte noen av figurene til det bare er grunnfigurer

 

joda listen blir lit lengre

 

men så kommer jeg til det punktet der jeg kan redusere

 

jeg går gjennom hver grunnfigur og sammenligner de som er plaser nær hverandre.

 

Hvis to like figurer er plaser ved siden av hverandre så kam man slå dem sammen

 

da fjernes den ene figuren fra listen og den andre kan bli større ( bredere eller høyere )

 

tilslutt kan man slå sammen to grunnfigurer til en figur

 

når disse figuren tegnes på en bilde image og så lagres som en fil så har man et bilde .

 

I stedet for å bruke en time på å tegne dette bilde så tar det kansje 5 minutter på denne måten

 

 

figurene kan f.eks se slik ut :

 

 

 

 

 

 

 

luften mellom er bare for å marker at den består av flere mindre figurer

det svarte feltet er egentlig gjennomsiktig

 

edit ----------------------------------

 

 

 

det er nå problemene dukker opp

som der ser så består de forskjelige "trekantene " av andre figurer

jeg har marker de med den figur numret/koden jeg har definert dem etter

 

problemet er å kun sitteigjen med en trekant av hver type og alle koden nr 1 fjernet.

 

først måtte jeg bestemme meg hvilken av figuren jeg skulle fjerne først . det er greit å begynne med nr 17

det var også greit å slå sammen disse figuren etter den metoden som jeg har benyttet tidligere

men da ble det litt overlapping av figur nr 1. den måtte nå fjernes

 

da brukte jeg en stringgridd som jeg satte like antal lkolonner og injer som bredde og høyde på den figuren som ble behandlet.

 

da måtte jeg lage en utregning som satte diagoalen i rutenettet rett etter figuren.

det neste var å fulle ut de rette rutene

ruten er fylt ut i forhold til figuren . da henter man ut posisjone fra kolonne og lije i stringrid-en

 

med litt bearbeiding så kan jeg fjerne alle disse nr1 figurne som over lapper

 

nå gjenstår det å se om det virker fult ut

 

 	 	 // simulering  kode 17

STRINGGRID1.ColCount:=5;

STRINGGRID1.RowCount:=5;

for t:=0 to 4 do begin

for r:=0 to 4 do begin

if r = t then begin

px:=r;

py:=5-t-1;

STRINGGRID1.Cells[px,py]:='17';




  end;

  end;

  end;




for t:=0 to 4 do begin

endringer2:=false;

for r:=0 to 4 do begin

px:=r;

py:=5-t-1;

if STRINGGRID1.Cells[r,t]='17' then  endringer2:=true;

if STRINGGRID1.Cells[r,t]<> '17' then begin

if  endringer2 then STRINGGRID1.Cells[r,t]:='*';

end;

end;

end;




// simulering  kode 25

STRINGGRID1.ColCount:=5;

STRINGGRID1.RowCount:=5;

for t:=0 to 4 do begin

for r:=0 to 4 do begin

if r = t then begin

px:=r;

py:=t;

STRINGGRID1.Cells[px,py]:='25';




  end;

  end;

  end;




for t:=0 to 4 do begin

endringer2:=true;

for r:=0 to 4 do begin

px:=r;

py:=5-t-1;

if STRINGGRID1.Cells[r,t]='25' then  endringer2:=false;

if STRINGGRID1.Cells[r,t]<> '25' then begin

if  endringer2 then STRINGGRID1.Cells[r,t]:='*';

end;

end;

end;







// simulering  kode 33

STRINGGRID1.ColCount:=5;

STRINGGRID1.RowCount:=5;

for t:=0 to 4 do begin

for r:=0 to 4 do begin

if r = t then begin

px:=r;

py:=t;

STRINGGRID1.Cells[px,py]:='33';




  end;

  end;

  end;




for t:=0 to 4 do begin

endringer2:=false;

for r:=0 to 4 do begin

px:=r;

py:=5-t-1;

if STRINGGRID1.Cells[r,t]='33' then  endringer2:=true;

if STRINGGRID1.Cells[r,t]<> '33' then begin

if  endringer2 then STRINGGRID1.Cells[r,t]:='*';

end;

end;

end;







// simulering  kode 41

STRINGGRID1.ColCount:=5;

STRINGGRID1.RowCount:=5;

for t:=0 to 4 do begin

for r:=0 to 4 do begin

if r = t then begin

px:=r;

py:=5-t-1;

STRINGGRID1.Cells[px,py]:='41';




  end;

  end;

  end;




for t:=0 to 4 do begin

endringer2:=true;

for r:=0 to 4 do begin

px:=r;

py:=5-t-1;

if STRINGGRID1.Cells[r,t]='41' then  endringer2:=false;

if STRINGGRID1.Cells[r,t]<> '41' then begin

if  endringer2 then STRINGGRID1.Cells[r,t]:='*';

end;

end;

end;

Endret av elg-elg123
Lenke til kommentar
  • 2 uker senere...
Du bør lære deg å bruke TAB, begin bør også vere på en ny linje for å markere en ny blokk :/

 

jeg skal tenke på det .

kanskje en vanesak, men for meg så virker det pirkete.

 

uansett med for mange blokker inne i hverandre så mister jeg oversikten uansett.

 

da er det bedre å dele det opp i subrutiner ( funksjoner eller prosedyrer )

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...