Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly/kolmio

timok16 [02.12.2005 21:47:56]

#

moi,
Piirtelen tässä kolmiota. Kysyn, että kuinka saisin kolmion tulemaan erillaiseen kuvioon kuin tämä, joka minulla on koodissani?
nyt tulee vaakaviiva päälle.

                mov dx,100      ;rivi
                mov cx,25       ;pituus

alku2:          mov ah,12       ;piirrä piste
                mov al,2        ;väri
                push cx         ;pinoon talteen cx:ään
                add cx,125      ;sarake, lisää cx:ään arvon
                int 10h
                pop cx          ;pinosta
                dec dx          ;vähennä dx riviä yhdellä
                loop alku2

;*******************************************************************

                mov dx,75       ;rivi
                mov cx,25       ;pituus

alku3:          mov ah,12       ;piirrä piste
                mov al,2        ;väri
                push cx         ;pinoon talteen cx:ään
                add cx,150      ;sarake, lisää cx:ään arvon
                int 10h
                pop cx          ;pinosta
                inc dx          ;lisää dx yhdellä
                loop alku3
;************************************************************************

                mov dx,75       ;rivi
                mov cx,49       ;pituus

alku4:
                mov ah,12       ;piirrä piste
                mov dx,75       ;rivi
                push cx         ;talteen
                add cx,125      ;summaa vakio cx:ään
                mov al,2        ;väri (xxxxhRGBb)
                int 10h
                pop cx
                dec dx
                loop alku4      ;käyttää cx:ää (cx--, lopetus jos cx=0)

KemXy [03.12.2005 11:28:50]

#

Mitähän oikein tarkoitat? Jos haluat esimerkiksi kolmion, jonka kulmat ovat koordinaateissa (x1, y1), (x2, y2), (x3, y3), suosittelisin kehittämään ensin kunnollisen viivanpiirtorutiinin (esim. Bresenham's line algorithm), jolle annetaan alku- ja loppukoordinaatit, ja piirtämään sen avulla haluamiasi kolmioita.

Ks.
http://en.wikipedia.org/wiki/Bresenham­'s_line_algorithm

Kokeilin itse koodiasi, joka piirtää suorakulmaisen kolmion, jonka kateetti on tuo vaakasuora.
Sama koodi ehkä hieman selvennettynä:

.model tiny, stdcall
.386
.code
option casemap:none
org 100h

alku:

    mov ax, 0013h    ; asetetaan näyttötila
    int 10h

; PIIRRETÄÄN KOLMION VASEN SIVU ALHAALTA YLÖSPÄIN

    mov dx, 100      ; rivi = 100 (alku y-koordinaatti = 100)
    mov cx, 25       ; pituus = 25 (vaaka- ja pystysuunnassa)

alku2:
    mov ah, 0ch      ; nämä kannataa asettaa, sillä INT10, C saattaa
    mov al, 2        ; muuttaa AX, SI ja DI rekisterejä.

    push cx          ; tallennetaan cx:n arvo pinoon
    add cx, 125      ; lisätään cx:ään 125

    int 10h          ; piirrä piste kohtaan (cx, dx)
    pop cx	     ; palauta alkuperäinen cx:n arvo pinosta
    dec dx           ; vähennä riviä yhdellä
    loop alku2       ; hyppää kohtaan alku2, ja vähennä cx:n arvoa yhdellä


; PIIRRETÄÄN KOLMION OIKEA SIVU YLHÄÄLTÄ ALASPÄIN

    mov dx, 75       ; rivi = 75 (alku y-koordinaatti = 75)
    mov cx, 25       ; pituus = 25 (vaaka- ja pystysuunnassa)

alku3:
    mov ah, 0ch      ; INT10h, 0Ch
    mov al, 2        ; aseta väri (2 = vihreä)

    push cx          ; tallennetaan cx:n arvo pinoon
    add cx, 150      ; lisätään cx:ään 150

    int 10h          ; piirrä piste kohtaan (cx, dx)
    pop cx           ; palauta alkuperäinen cx:n arvo pinosta
    inc dx           ; lisää riviä yhdellä
    loop alku3       ; hyppää kohtaan alku3, ja vähennä cx:n arvoa yhdellä


; PIIRRETÄÄN KOLMION 3. SIVU (VAAKASUORA) OIKEALTA VASEMMALLE

    mov dx, 75       ; rivi = 75
    mov cx, 49       ; pituus = 49 (vaakasuunnassa)

alku4:
    mov ah, 0ch      ; INT10h, 0Ch
    mov al, 2        ; aseta väri (2 = vihreä)

    push cx          ; tallennetaan cx:n arvo pinoon
    add cx, 125      ; lisätään cx:ään 125

    int 10h	     ; piirrä piste kohtaan (cx, dx)
    pop cx	     ; palauta alkuperäinen cx:n arvo pinosta

    loop alku4       ; käyttää cx:ää (cx--, lopetus jos cx == 0)


    mov ah, 08h      ; odotetaan kunnes on painettu ENTER
    int 21h

    mov ax, 0003h    ; palautetaan näyttötila
    int 10h

    int 20h          ; lopetetaan ohjelma

end alku

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta