Gå til innhold

Fargelegging inne i trekanter


Anbefalte innlegg

Hei. Jeg holder på med en oppgave her som går ut på å tegne en tekanne og fargelegge den.

Den skal tegnes med kun trekanter og fargene i hver trekant er variabel. Kordinatene til trekantene og fargene til trekantene har vi fått opplyst i en array. (dette er forresten C og ikke C++).

 

Jeg får til å tegne tekanna uten problemer; men når jeg skal fargelegge den oppstår problemet.

 

koden finner du på:

http://pastebin.com/m4c32fd81

 

Håper noen av dere ser hva som er problemet her.

Kan komme med noen forklaringer som gjør det enklere for dere.

 

DrawLine er en funksjon som tegner et rett strek mellom to gitte kordinater.

triangle->sx(1,2,3) og triangle ->sy(1,2,3) er der vi henter kordinatene til trekantene som skal tegne tekanna.

 

Prinsippet mitt på dette programmet er følgende:

- Tegn først en trekant med "border-color"

- Lag en firkantet bounding-boks rundt trekanten

- Sjekk linje for linje (fra toppen og nedover) om det skal tegnes noe

---- Med dette mener jeg at det er 2 vegger med "border color"

---- Funksjonen: CheckLine

- Hvis det er 2 vegger med "border color" fargelegg i mellom disse veggene med fillcolor.

---- funksjonen FillCheckLine

- Tegn så trekanten på nytt med fillcolor

 

---- Gjenta overnevnte med neste trekant.

 

Hvis du ser på vedleggene fungerer dette for noen trekanter, men andre plasser blir fargeleggingen veldig merkelig. Det virker som det er noe feil med

CheckLine og FillCheckLine - prøver å se gjennom den; og for meg virker de lokgisk riktige. Men en plass er det jo noe feil som man ser på resulatet.

 

Jeg regenr med jeg har debugget meg selv blind for feil; noen friske øyne som ser noe galt med koden?

post-141424-1220961626_thumb.jpg

post-141424-1220961634_thumb.jpg

Lenke til kommentar
Videoannonse
Annonse
Er litt for seint til å lese koden nå desverre, men er den algoritmen noe du har fått utdelt som du må følge, eller har du kommet på den selv? Jeg ville uansett googlet "polygon fillers" "triangle fillers" osv for å se forskjellige software rendermetoder.

Algoritmen har jeg funnet på selv; etter å ha sett gjennom flere metoder. Jeg hadde en annen algoritme før som fungere veldig dårlig. Denne algoritmen jeg har tar for seg horisontale grupper, fra toppen og nedover og fargelegger de en etter en. Det var en metode jeg så anbefale flere plasser da denne metoden ikke var så tung for maskinen å kjøre.

 

Har prøvd meg med "4-ruter" metoden. Som gikk ut på at men tok etp unkt inne i trekanten og fargela dette. Så etterpå gjorde man det samme for de 4 punktene rundt; som igjen gjorde det samme med de 4 punktene rundt der igjen. Og stopper når den nådde veggen. Men denne metoden taklet ikke små trekanter; og det virker som det er her denne motden og feiler; når trekantene blir små.

Lenke til kommentar

Aha, da høres det ut som du har problemer med at flyttall ikke er helt nøyaktige.. Skrev akkurat litt om det i denne tråden: https://www.diskusjon.no/index.php?showtopi...;#entry11949978

 

Bruker du floats eller double? Kan nok lønne seg å bruke double, evt vurdere fixed point også.

Men hvordan definerer du trianglene dine? Altså, hvis du krever at trianglene alltid skal være sortert, at sx1 alltid skal være til venstre for sx2 og sx2 alltid skal være til venstre for sx3, altså sx1 <= sx2 <= sx3 så slipper du vel alle disse testene (if (sx1 <= sx2) og sånn) i boundingbox-funksjonen din, som lett kan bli feil når trekantene blir små og flyttallene ikke har nok nøyaktighet og som gjør at du ender opp med feil boundingboxer.

 

Men aner ikke om dette er problemet. Klarte ikke helt å sette meg inn i koden tror jeg. Skjønner ikke hvorfor du må tegne trekanten tre ganger og sånn (eller, ser sånn ut), men det var det eneste jeg kom på nå. Men igjen, jeg hadde googlet rundt på polygon/triangle fillers og lest meg litt opp på hvordan man skal håndtere små flyttall evt hvordan og hvor man skal bruke fixed point. For hvis det bare er små triangler den ikke takler ligger feilen antakeligvis i måten du håndterer flyttall på.

Endret av teflonpanne
Lenke til kommentar

jeg brukter nok heltall og henviser til kordinater og øker med en bortover. Så flyt-tall ser vi bort fra. Strekene er og tegnet med bresenham metoden. Funksjonen min går ut på å starte med kanten og se etter hvor veggen er, men virker som den aldre finner ut hvor den skal slutte. Fant ut det var en feil i logikken som gjorde at den tegnet den "neste" firkanten hele tiden i stede for den den var på; derfor oppstod det aldri noen "slutt-vegg".

 

Litt pirekete feil som ordnet seg etter litt søvn og ny titt på koden :) Men nå ser jeg har 4-5 av trekantene faktisk ikke blir tegnet. (de du ser på bildene), men de som er tegnet er tegnet riktig.

Endret av etse
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å
×
×
  • Opprett ny...