Millainen Taulukko? "Tilen reunan Valinta"

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Millainen Taulukko? "Tilen reunan Valinta"

Post by JATothrim »

Eli Miten tallennan taulukkoon tilen valitun "Reunan" ?
Kun tilaa pitää varata yhdestä tilestä 4, kahdesta 7 ja neljästä 12 ?
ja miten voisin katsoa valinnan järkevästi ? :| (Koetan selventää asiaa tarvittaessa)

(Edit: hups. piti postata Tyhmiin Kysymyksiin, no iha sama :D )
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Millainen Taulukko? "Tilen reunan Valinta"

Post by koodaaja »

Dark Code wrote:Eli Miten tallennan taulukkoon tilen valitun "Reunan" ?
Kun tilaa pitää varata yhdestä tilestä 4, kahdesta 7 ja neljästä 12 ?
ja miten voisin katsoa valinnan järkevästi ? :| (Koetan selventää asiaa tarvittaessa)

(Edit: hups. piti postata Tyhmiin Kysymyksiin, no iha sama :D )
Minkä reunan? Aiotko tehdä karttasysteemiä? Eivätkö neliöt riitä?
Guest

Re: Millainen Taulukko? "Tilen reunan Valinta"

Post by Guest »

En vaan "Lauta peliä", Tässä koodi joka vähän selvittää asiaa:

Code: Select all

//COPYRIGHT BY DARK CODE
// ELI MINULTA ON KYSYTTÄVÄ LUPA TÄMÄN SORSAN KÄYTTÖÖN (saa testata, ei muokata)
SCREEN 610,610
Dim i,x,y
Dim Cx,Cy,Mx,My
Dim MixPros,MixWay
MixWay=1
Repeat
    
    Color 128,128,128
    For i=1 To 18
        Box 32,i*32,545,1
    Next i
    For i=1 To 18
        Box i*32,32,1,545
    Next i
    
    If MixPros>100 Then MixWay=-1
    If MixPros<0 Then MixWay=1
    MixPros=MixPros+MixWay
    
    Mx=MouseX()
    My=MouseY()
    Cx=RoundDown(Mx/32)
    Cy=RoundDown(My/32)
    Dim centerx,centery,xLeft,yUp,xRight,yDown
        centerx=Cx*32+16
        centery=Cy*32+16
        xLeft=Cx*32
        yUp=Cy*32
        xRight=Cx*32+32
        yDown=Cy*32+32
        
        MixColor(MixPros,128,200,4,255,0,0)
        If PointInTri(Mx,My,centerx,centery+1,xLeft-1,yUp-1,xRight+1,yUp-1)
            Line xLeft,yUp-1,xRight,yUp-1
            Line xLeft,yUp+1,xRight,yUp+1
            MixColor(MixPros,0,255,0,255,0,0)
            Line xLeft,yUp,xRight,yUp
        ElseIf PointInTri(Mx,My,centerx-1,centery,xRight+1,yUp-1,xRight+1,yDown+1)
            Line xRight+1,yUp,xRight+1,yDown
            Line xRight-1,yUp,xRight-1,yDown
            MixColor(MixPros,0,255,0,255,0,0)
            Line xRight,yUp,xRight,yDown
        ElseIf PointInTri(Mx,My,centerx,centery-1,xLeft-1,yDown+1,xRight+1,yDown+1)
            Line xLeft,yDown+1,xRight,yDown+1
            Line xLeft,yDown-1,xRight,yDown-1
            MixColor(MixPros,0,255,0,255,0,0)
            Line xLeft,yDown,xRight,yDown
        ElseIf PointInTri(Mx,My,centerx+1,centery,xLeft-1,yUp-1,xLeft-1,yDown+1)
            Line xLeft-1,yUp,xLeft-1,yDown
            Line xLeft+1,yUp,xLeft+1,yDown
            MixColor(MixPros,0,255,0,255,0,0)
            Line xLeft,yUp,xLeft,yDown
        EndIf
   DrawScreen     
Forever

Function PointInTri(x#, y#, x1#, y1#, x2#, y2#, x3#, y3#)
   ab# = ((y - y1) * (x2 - x1) - (x - x1) * (y2 - y1)) / 1000.0
   bc# = ((y - y2) * (x3 - x2) - (x - x2) * (y3 - y2)) / 1000.0
   ca# = ((y - y3) * (x1 - x3) - (x - x3) * (y1 - y3)) / 1000.0
   If (ab * bc) > 0 And (bc * ca) > 0 Then Return True
   Return False
EndFunction

Function MixColor(fact#,r,g,b,r2,g2,b2)
fact=Max(Min(fact,100),0)*0.01
Color fact*r+(1.0-fact)*r2,fact*g+(1.0-fact)*g2,fact*b+(1.0-fact)*b2
EndFunction
Eli pitäisi merkitä taulukkoon missä kohtaa tuo "Kursori" on ollut ruudukossa.
En keksinyt (Tunnin) pohdiskelun jälkeenkään järkevää ratkaisua, eli saa olla vaikka purka koodia...
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Millainen Taulukko? "Tilen reunan Valinta"

Post by koodaaja »

Guest wrote:En vaan "Lauta peliä", Tässä koodi joka vähän selvittää asiaa:

Code: Select all

//COPYRIGHT BY DARK CODE
// ELI MINULTA ON KYSYTTÄVÄ LUPA TÄMÄN SORSAN KÄYTTÖÖN (saa testata, ei muokata)
SCREEN 610,610
Dim i,x,y
Dim Cx,Cy,Mx,My
Dim MixPros,MixWay
MixWay=1
Repeat
    
    Color 128,128,128
    For i=1 To 18
        Box 32,i*32,545,1
    Next i
    For i=1 To 18
        Box i*32,32,1,545
    Next i
    
    If MixPros>100 Then MixWay=-1
    If MixPros<0 Then MixWay=1
    MixPros=MixPros+MixWay
    
    Mx=MouseX()
    My=MouseY()
    Cx=RoundDown(Mx/32)
    Cy=RoundDown(My/32)
    Dim centerx,centery,xLeft,yUp,xRight,yDown
        centerx=Cx*32+16
        centery=Cy*32+16
        xLeft=Cx*32
        yUp=Cy*32
        xRight=Cx*32+32
        yDown=Cy*32+32
        
        MixColor(MixPros,128,200,4,255,0,0)
        If PointInTri(Mx,My,centerx,centery+1,xLeft-1,yUp-1,xRight+1,yUp-1)
            Line xLeft,yUp-1,xRight,yUp-1
            Line xLeft,yUp+1,xRight,yUp+1
            MixColor(MixPros,0,255,0,255,0,0)
            Line xLeft,yUp,xRight,yUp
        ElseIf PointInTri(Mx,My,centerx-1,centery,xRight+1,yUp-1,xRight+1,yDown+1)
            Line xRight+1,yUp,xRight+1,yDown
            Line xRight-1,yUp,xRight-1,yDown
            MixColor(MixPros,0,255,0,255,0,0)
            Line xRight,yUp,xRight,yDown
        ElseIf PointInTri(Mx,My,centerx,centery-1,xLeft-1,yDown+1,xRight+1,yDown+1)
            Line xLeft,yDown+1,xRight,yDown+1
            Line xLeft,yDown-1,xRight,yDown-1
            MixColor(MixPros,0,255,0,255,0,0)
            Line xLeft,yDown,xRight,yDown
        ElseIf PointInTri(Mx,My,centerx+1,centery,xLeft-1,yUp-1,xLeft-1,yDown+1)
            Line xLeft-1,yUp,xLeft-1,yDown
            Line xLeft+1,yUp,xLeft+1,yDown
            MixColor(MixPros,0,255,0,255,0,0)
            Line xLeft,yUp,xLeft,yDown
        EndIf
   DrawScreen     
Forever

Function PointInTri(x#, y#, x1#, y1#, x2#, y2#, x3#, y3#)
   ab# = ((y - y1) * (x2 - x1) - (x - x1) * (y2 - y1)) / 1000.0
   bc# = ((y - y2) * (x3 - x2) - (x - x2) * (y3 - y2)) / 1000.0
   ca# = ((y - y3) * (x1 - x3) - (x - x3) * (y1 - y3)) / 1000.0
   If (ab * bc) > 0 And (bc * ca) > 0 Then Return True
   Return False
EndFunction

Function MixColor(fact#,r,g,b,r2,g2,b2)
fact=Max(Min(fact,100),0)*0.01
Color fact*r+(1.0-fact)*r2,fact*g+(1.0-fact)*g2,fact*b+(1.0-fact)*b2
EndFunction
Eli pitäisi merkitä taulukkoon missä kohtaa tuo "Kursori" on ollut ruudukossa.
En keksinyt (Tunnin) pohdiskelun jälkeenkään järkevää ratkaisua, eli saa olla vaikka purka koodia...
Siis haluat tallentaa, mikä viiva on ollut valittuna? Sehän on melko simppeliä: teet muuttujan "sivu", joka saa arvon sen mukaan, mikä on valittuna. Esim. 0 = yläsivu, 1 = oikea sivu, 2 = alasivu, 3 = vasen sivu. Ja sitten tallennat, mikä loota on valittuna. (Ovela tapa tarkistaa pistekolmiosisäkkäisyys, tuohon pitää perehtyä)
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Millainen Taulukko? "Tilen reunan Valinta"

Post by JATothrim »

Ei toimi tuolla tavalla, koska ruutujen reunat ovat yhteisiä (joka viiva erikseen).
Ja ne pitääisi saada tallennettua 2D-Taulukkoon, että voisin tarkistaa että onko viiva "varattu" lisäämisen yhteydessä.
Itse noilla ruuduilla ei ole mitään merkitystä, vain viivoilla.

Ehdottamallasi tavalla saisin vain yhden reunan käyttöön ja tarkistaminen olisi vähän "???" hommaa.
Ja tuo kolmiotarkastus on CBSDK:tä. ;)
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Millainen Taulukko? "Tilen reunan Valinta"

Post by koodaaja »

Dark Code wrote:Ei toimi tuolla tavalla, koska ruutujen reunat ovat yhteisiä (joka viiva erikseen).
Ja ne pitääisi saada tallennettua 2D-Taulukkoon, että voisin tarkistaa että onko viiva "varattu" lisäämisen yhteydessä.
Itse noilla ruuduilla ei ole mitään merkitystä, vain viivoilla.

Ehdottamallasi tavalla saisin vain yhden reunan käyttöön ja tarkistaminen olisi vähän "???" hommaa.
Ja tuo kolmiotarkastus on CBSDK:tä. ;)
Miksi kaksiulotteiseen? Tee systeemi, joka numeroi nuo viivat automaagisesti, tallenna sitten luvut yksiulotteiseen taulukkoon. Enkä käsitä, miksi ja miten haluat valita noita viivoja, jos ruuduilla ei ole mitään merkitystä.
Post Reply