<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=19608&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-11-15T19:28:45+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19608&amp;mode</id>
<entry>
<author><name><![CDATA[Kentsel]]></name></author>
<updated>2017-11-15T19:28:45+01:00</updated>
<published>2017-11-15T19:28:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=199004#p199004</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=199004#p199004"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=199004#p199004"><![CDATA[
No teraz trochę zrozumiałem. Nie jestem programistą, kostka to moje hobby, przy okazji się uczę. Procedura przerwania napisana prze ze mnie wyświetla na bieżąco stan tablicy cube[8][8][8], na chwilę obecną mam 12 różnych animacji i wszystkie bazują na trójwymiarowej tablicy, chcę przy tym pozostać. Łącząc mój kod i Twój pomysł musiałbym mieć wygenerowane 8 tablic, i zamieniać tylko wiersze/kolumny żeby uzyskać wrażenie, że jest wypełniona inaczej. Wciąż nie wiem jak do tego wrzucić trzeci wymiar. Jestem świadom że mój kod nie jest optymalny, wystarczy mi że działa sprawnie, 20MHz, przerwania z Timera2, UART1 połączony z bluetooth i aplikacja służąca jako pilot zdalnego sterowania.<br /><br /><br />I nagle mnie oświeciło.<br />Czy po prostu w tym z=tablica[x][y] ?<br />właściwie to tak<br /><br />[syntax=c]uint8_t z;<br />for(uint8_t x=0; x&lt;=7; x++)<br />{<br />for(uint8_t y=0; y&lt;=7; y++)<br />{<br />z = tablica&#91;x&#93;&#91;y&#93;;<br />cube&#91;z&#93;&#91;y&#93;&#91;x&#93; = 1;<br />}<br />}[/syntax]<br />Zmieniłem zdanie, jesteś wielki, dziękuję bardzo <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br />edit:<br />[syntax=c]char help_cube_z&#91;8&#93;&#91;8&#93; = {{ 0, 1, 2, 3, 4, 5, 6, 7 },<br />{ 1, 2, 3, 4, 5, 6, 7, 0 },<br />{ 2, 3, 4, 5, 6, 7, 0, 1 },<br />{ 3, 4, 5, 6, 7, 0, 1, 2 },<br />{ 4, 5, 6, 7, 0, 1, 2, 3 },<br />{ 5, 6, 7, 0, 1, 2, 3, 4 },<br />{ 6, 7, 0, 1, 2, 3, 4, 5 },<br />{ 7, 0, 1, 2, 3, 4, 5, 6 }};[/syntax]<br />n razy (1-5) zamieniam 2 losowe wiersze i 2 losowe kolumny, efekt jest zadowalający, trudno powiedzieć czy kombinacje się powtarzają, ale zawsze są unikalne punkty <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Dziękuję raz jeszcze, temat się wyczerpał.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8166">Kentsel</a> — 15 lis 2017, o 19:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-11-15T11:15:18+01:00</updated>
<published>2017-11-15T11:15:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198979#p198979</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198979#p198979"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198979#p198979"><![CDATA[
<div class="quotetitle">Kentsel napisał(a):</div><div class="quotecontent"><br />Wygląda mi to na fragment kodu z innej led cube.<br /></div><br />Nie, to nie jest fragment gotowego kodu, to moja propozycja napisana według Twojego opisu.<br /><br /><div class="quotetitle">Kentsel napisał(a):</div><div class="quotecontent"><br />Nie zależy mi na oszczędności pamięci...<br />Kiedyś przeglądałem &quot;gotowce&quot;, ale nie korzystałem, bo raz że zmieniłem schemat troszkę, włożyłem inne kości do multipleksowania<br /></div><br />To nie tylko kwestia oszczędności pamięci. Większość operacji na tablicy 512 elementowej będzie trwała zdecydowanie dłużej.<br />Moja propozycja to tablica 8x8. Wymiary tablicy to osie x i y. Każdy bajt w tablicy reprezentuje 8 diod w osi z. Oczywiście nazewnictwo osi to kwestia umowna, można zmienić kolejność wedle uznania.<br />Nie wiem jak to multipleksujesz, myślę jednak, że organizacja tablicy nie ma na to większego wpływu. Podejrzewam nawet, że moja propozycja działałaby szybciej, ponieważ łatwiej odczytać 64 bajty (gotowe całe rzędy diod w jednym bajcie) niż odczytywać 512 bajtów i z każdego wydobywać 1 bit. Sama kalkulacja adresu tablicy trójwymiarowej będzie trwała dłużej, a trzeba to przemnożyć przez ilość odczytywanych bajtów.<br /><br /><div class="quotetitle">Kentsel napisał(a):</div><div class="quotecontent"><br />Musi być dokładnie 64 elementów (jedynek) rozstrzelonych na całą objętość kostki, ale nie powtarzających się elementów, coś na wzór sudoku(mi to się z tym kojarzy). Miliony godzin, pętli i warunków i albo generuje śmieci, albo pętla losująca się zatrzymuje i program staje...<br /><br />Gdyby zrobić listę dostępnych współrzędnych, każdy piksel wylosowany musiałby od razu blokować 7 innych, a ja już kompletnie nie wiem jak to ugryźć...<br /><br />Czasem przy problemach z losowanie dodawałem do pętli flagę, warunek o przepełnieniu do while i potem jakiś debug, ale tu debug i przypisywanie elementów na sztywno to nie to co chcę osiągnąć....<br /></div><br /><br />Właśnie problem w tym, że w taki sposób - jak sam zauważyłeś - trudno będzie Ci osiągnąć cel.<br /><br />Próbowałem podsunąć następujące rozwiązanie - nieco odmienne podejście. Wyobraźmy sobie ścianę kostki <strong>x-y</strong> jako 64 elementy (8x8). Każdy element zawiera liczbę, która jest numerem (identyfikatorem) diody która się świeci w osi <strong>z</strong>.<br />Jeśli teraz utworzymy takie Twoje sudoku:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">             x<br /><br />      0 1 2 3 4 5 6 7<br />      1 2 3 4 5 6 7 0<br />      2 3 4 5 6 7 0 1<br /> y    3 4 5 6 7 0 1 2<br />      4 5 6 7 0 1 2 3<br />      5 6 7 0 1 2 3 4<br />      6 7 0 1 2 3 4 5<br />      7 0 1 2 3 4 5 6</div><br />to mamy pewność, że patrząc na dowolną płaszczyznę będziemy widzieć 64 diody pokrywające całą płaszczyznę, po jednej pod każdą współrzędną danej płaszczyzny.<br /><br />Ten wzór jest jednak regularny, a nie o to chodzi. Przyjmijmy jednak to za pozycję wyjściową. Jeśli teraz spróbujemy zrobić tak:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">    zamieniamy 2 losowe wiersze<br />         pomiędzy sobą<br /><br />             x<br /><br />      0 1 2 3 4 5 6 7<br />      5 6 7 0 1 2 3 4<br />      2 3 4 5 6 7 0 1<br /> y    3 4 5 6 7 0 1 2<br />      4 5 6 7 0 1 2 3<br />      1 2 3 4 5 6 7 0<br />      6 7 0 1 2 3 4 5<br />      7 0 1 2 3 4 5 6<br /><br /><br />    a później 2 losowe kolumny<br /><br />                x<br /><br />      0 6 2 3 4 5 1 7<br />      5 3 7 0 1 2 6 4<br />      2 0 4 5 6 7 3 1<br /> y    3 1 5 6 7 0 4 2<br />      4 2 6 7 0 1 5 3<br />      1 7 3 4 5 6 2 0<br />      6 4 0 1 2 3 7 5<br />      7 5 1 2 3 4 0 6</div><br /><br />to już to wygląda trochę lepiej, a nadal zachowujemy odpowiednie relacje we wszystkich wierszach i kolumnach. Jeśli powtórzymy tę operację kilkadziesiąt razy stosując losowe numery wierszy i kolumn, uzyskamy przypadkową i niepowtarzalną kombinację cały czas zachowując założone reguły (jedna dioda w każdym rzędzie).<br /><br />Warunkiem jest oczywiście uzyskanie naprawdę losowych liczb, bo w AVR to nie jest proste.<br /><br />To co opisałem powyżej zrealizowałem w przedstawionym wcześniej kodzie na tablicy mojej konstrukcji. Na pewno da się to też zrealizować na Twojej tablicy, jednak będzie to trwało zdecydowanie dłużej. U mnie wygenerowanie tablicy przy 53 iteracjach pętli (być może wystarczy mniej, trzeba byłoby przetestować) trwało niecałe 12ms dla zegara 16MHz.<br /><br />Mam nadzieję, że było zrozumiale i że koncepcja się przyda.<br /><br />_________________<br /><a href="http://forum.atnel.pl/topic19149.html#p194736"  class="postlink">AVR-GCC - dane w pamięci FLASH</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 15 lis 2017, o 11:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kentsel]]></name></author>
<updated>2017-11-14T23:07:23+01:00</updated>
<published>2017-11-14T23:07:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198965#p198965</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198965#p198965"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198965#p198965"><![CDATA[
Niewiele rozumiem, więc pewnie działa. Tylko nie wiem jak z tego wyjść na tablice cube[8][8][8]. Nie zależy mi na oszczędności pamięci <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Wygląda mi to na fragment kodu z innej led cube. Kiedyś prrzeglądałem &quot;gotowce&quot;, ale nie korzystałem, bo raz że zmieniłem schemat troszkę, włożyłem inne kości do multipleksowania, a dwa że piszę kod od podstaw sam i trudno będzie mi wkomponować coś czego nie rozumiem :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8166">Kentsel</a> — 14 lis 2017, o 23:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-11-14T20:51:58+01:00</updated>
<published>2017-11-14T20:51:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198951#p198951</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198951#p198951"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198951#p198951"><![CDATA[
Nie jestem pewny, czy o to Ci chodzi, ale poniższy sposób spowoduje wygenerowanie tablicy, w której <strong>w dowolnym rzędzie w dowolnej osi będzie zapalona jedna i tylko jedna dioda</strong>. Nie chce mi się za bardzo opisywać szczegółowo kodu, więc mam nadzieję, że zrozumiesz ideę. To tylko wygenerowanie tablicy, animację musisz sobie wykombinować sam, ale to już chyba mniejszy problem.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />typedef struct {<br />    uint8_t b0: 1;<br />    uint8_t b1: 1;<br />    uint8_t b2: 1;<br />    uint8_t b3: 1;<br />    uint8_t b4: 1;<br />    uint8_t b5: 1;<br />    uint8_t b6: 1;<br />    uint8_t b7: 1;<br />} uchar_bits;<br /><br />typedef union {<br />    uint8_t byte;<br />    uchar_bits bits;<br />} led_cluster;<br /><br />// tablica zawierająca 8*8*8=512 bitów, czyli 1 bit na diodę<br />// dostęp do pojedynczej diody:<br />//     cube&#91;x&#93;&#91;y&#93;.bits.b5 = 1; // zapala diodę id=5 w rzędzie o współrzędnych x,y<br />// dostęp do rzędu diod<br />//     cube&#91;x&#93;&#91;y&#93;.byte = 0b00100000; //zapala diodę id=5 w rzędzie x,y<br />//     cube&#91;x&#93;&#91;y&#93;.byte = 0b00001010; //zapala diody id=3 i id=1 w rzędzie x,y<br />// powyższe alternatywnie<br />//     cube&#91;x&#93;&#91;y&#93;.byte = (1&lt;&lt;5);<br />//     cube&#91;x&#93;&#91;y&#93;.byte = (1&lt;&lt;3) | (1&lt;&lt;1);<br />// ogólnie<br />//     cube&#91;x&#93;&#91;y&#93;.byte = (1&lt;&lt;z); // zapala diodę o współrzędnych x,y,z<br />led_cluster cube&#91;8&#93;&#91;8&#93;; // zajmie tylko 64 bajty<br /><br /><br />// wartości unikalne w kolejności<br />//<br />// const __flash uint8_t initial&#91;8&#93;&#91;8&#93; =<br />// {<br />//     { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80},<br />//     { 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40},<br />//     { 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20},<br />//     { 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10},<br />//     { 0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08},<br />//     { 0x08, 0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04},<br />//     { 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x01, 0x02},<br />//     { 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x01}<br />// };<br /><br />// lub wstępnie pomieszane<br />//<br />const __flash uint8_t initial&#91;8&#93;&#91;8&#93; =<br />{<br />    { 0b00100000, 0x80, 0x01, 0x08, 0x02, 0x10, 0x40, 0x04 },<br />    { 0b10000000, 0x02, 0x04, 0x20, 0x08, 0x40, 0x01, 0x10 },<br />    { 0b00001000, 0x20, 0x40, 0x02, 0x80, 0x04, 0x10, 0x01 },<br />    { 0b00010000, 0x40, 0x80, 0x04, 0x01, 0x08, 0x20, 0x02 },<br />    { 0b00000001, 0x04, 0x08, 0x40, 0x10, 0x80, 0x02, 0x20 },<br />    { 0b00000010, 0x08, 0x10, 0x80, 0x20, 0x01, 0x04, 0x40 },<br />    { 0b00000100, 0x10, 0x20, 0x01, 0x40, 0x02, 0x08, 0x80 },<br />    { 0b01000000, 0x01, 0x02, 0x10, 0x04, 0x20, 0x80, 0x08 }<br />};<br /><br />void generate_random_cube(void);<br />void cube_init(void);<br />void swap_rows(uint8_t r1, uint8_t r2);<br />void swap_cols(uint8_t c1, uint8_t c2);<br /><br />int main(void)<br />{<br />    cube_init();<br />    <br />    while (1) <br />    {<br />        generate_random_cube();<br />        PORTA = cube&#91;3&#93;&#91;5&#93;.byte;<br />    }<br />}<br /><br />void generate_random_cube(void)<br />{<br />    uint8_t i, tmp1, tmp2;<br /><br />// użycie szumu z ADC do uzyskania losowej wartości<br />// do zainicjowania randomizera, na AVR niełatwo uzyskać pełną losowość   <br />    tmp1 = (uint8_t)ADC;<br />    srand(tmp1);<br />    // 53 to wartość taka na chybił trafił, można dobrać doświadczalnie inną<br />    // w miarę możliwości małą, jednak gwarantującą dobre mieszanie<br />    for (i=0; i&lt;53; i++)<br />    {<br />        tmp1 = rand() &amp; 0x07;<br />        tmp2 = rand() &amp; 0x07;<br />        if (tmp1 == tmp2)<br />        {<br />            tmp2 += 1;<br />            tmp2 &amp;= 0x07;<br />        }<br />        swap_cols(tmp1, tmp2);<br />        tmp1 = rand() &amp; 0x07;<br />        tmp2 = rand() &amp; 0x07;<br />        if (tmp1 == tmp2)<br />        {<br />            tmp2 += 1;<br />            tmp2 &amp;= 0x07;<br />        }<br />        swap_rows(tmp1, tmp2);<br />    }<br />}<br /><br /><br /><br />void swap_rows(uint8_t r1, uint8_t r2)<br />{<br />    uint8_t i, t;<br />    r1 &amp;= 0x07;<br />    r2 &amp;= 0x07;<br />    for (i=0; i&lt;8; i++)<br />    {<br />        t = cube&#91;i&#93;&#91;r1&#93;.byte;<br />        cube&#91;i&#93;&#91;r1&#93;.byte = cube&#91;i&#93;&#91;r2&#93;.byte;<br />        cube&#91;i&#93;&#91;r2&#93;.byte = t;<br />    }<br />}<br /><br />void swap_cols(uint8_t c1, uint8_t c2)<br />{<br />    uint8_t i, t;<br />    c1 &amp;= 0x07;<br />    c2 &amp;= 0x07;<br />    for (i=0; i&lt;8; i++)<br />    {<br />        t = cube&#91;c1&#93;&#91;i&#93;.byte;<br />        cube&#91;c1&#93;&#91;i&#93;.byte = cube&#91;c2&#93;&#91;i&#93;.byte;<br />        cube&#91;c2&#93;&#91;i&#93;.byte = t;<br />    }<br />}<br /><br />void cube_init(void)<br />{<br />    uint8_t x, y;<br />    <br />    for (x=0; x&lt;8; x++)<br />    {<br />        for (y=0; y&lt;8; y++)<br />        {<br />            cube&#91;x&#93;&#91;y&#93;.byte = initial&#91;x&#93;&#91;y&#93;;<br />        }<br />    }<br />}[/syntax]<br /><br />_________________<br /><a href="http://forum.atnel.pl/topic19149.html#p194736"  class="postlink">AVR-GCC - dane w pamięci FLASH</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 14 lis 2017, o 20:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kentsel]]></name></author>
<updated>2017-11-14T17:28:59+01:00</updated>
<published>2017-11-14T17:28:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198929#p198929</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198929#p198929"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198929#p198929"><![CDATA[
Losuje całą kostkę, 64/512. Unikalne? Owszem właśnie po to ten temat <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> losuje od razu 64 punkty w zmiennej pomocniczej. Problem w tym, że nie wiem jak wygenerować idealnie unikalne piksele. <br /><br />[syntax=c]void generuj_kostke(void)<br />{<br />short x;  //x bedzie losowana<br />short zakres=7; //zmienna okreslajaca zakres losowania<br />for(short i=0;i&lt;=7;i++)<br />{<br />sudoku&#91;i&#93;=i; //tablica 8-elementowa, przechowujaca wspolrzedne do losowania<br />}<br />short debug_flaga=0; //flaga do wyjscia z petli po bezowocnych losowaniach<br />for(short i=0;i&lt;=7;i++)<br />{<br />for(short j=0;j&lt;=7;j++)<br />{<br />help_cube_z&#91;i&#93;&#91;j&#93;=1;//kostki pomocnicze, pozniej wylosowane beda kasowane, zeby  losowac z pozostalych<br />help_cube_y&#91;i&#93;&#91;j&#93;=1;<br />help_cube_x&#91;i&#93;&#91;j&#93;=1;<br />}<br />}<br />for(short z=0;z&lt;=7;z++)<br />{<br />for(short y=0;y&lt;=7;y++)<br />{<br />for(short x=0;x&lt;=7;x++)<br />{<br />help_cube3d&#91;z&#93;&#91;y&#93;&#91;x&#93;=0; //wyczyszczenie kostki<br />}<br />}<br />}<br />for(short z=0;z&lt;=7;z++)<br />{<br />for(short y=0;y&lt;=7;y++)<br />{<br />if((z==0)&amp;&amp;(y==0))<br />x=losuj(0, zakres); //losuj(min, max)<br />else<br />do<br />{<br />x=losuj(0, zakres); //losuj(min, max)<br />debug_flaga++;<br />}while(((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))&amp;&amp;(debug_flaga&lt;100));<br /><br />if(debug_flaga&gt;=100)<br />{<br />x=0;<br />if((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))<br />{<br />x=1;<br />if((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))<br />{<br />x=2;<br />if((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))<br />{<br />x=3;<br />if((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))<br />{<br />x=4;<br />if((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))<br />{<br />x=5;<br />if((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))<br />{<br />x=6;<br />if((help_cube_y&#91;z&#93;&#91;x&#93;==0)||(help_cube_z&#91;y&#93;&#91;x&#93;==0)||(help_cube_x&#91;z&#93;&#91;y&#93;==0))<br />{<br />x=7;<br />}<br />}<br />}<br />}<br />}<br />}<br />}<br />}<br />if(x&lt;zakres)<br />sudoku&#91;x&#93;=sudoku&#91;zakres&#93;;<br />help_cube3d&#91;z&#93;&#91;y&#93;&#91;x&#93;=1; //wylosowany jest zapisany do kostki<br />help_cube_y&#91;z&#93;&#91;x&#93;=0;//po wylosowaniu kasowanie z listy mozliwych<br />help_cube_z&#91;y&#93;&#91;x&#93;=0;<br />help_cube_x&#91;z&#93;&#91;y&#93;=0;<br />zakres--;<br />debug_flaga=0;<br />}<br />zakres=7;<br />for(short i=0;i&lt;=7;i++)<br />{<br />sudoku&#91;i&#93;=i;<br />}<br />}<br />}[/syntax]<br />to generuje kostkę, 64 piksele, ale zawsze znajdzie się kilka błędów, zawsze wzdłóż jednej z osi powtarzają się wpółrzędne. Np pierwszy etap animacji czyli wypisanie, było w osi X, to 2 etap czyli zebranie pikseli z powrotem na jedną ścianę, to uda się w osi X i Y, ale w Z już nie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8166">Kentsel</a> — 14 lis 2017, o 17:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2017-11-14T17:16:47+01:00</updated>
<published>2017-11-14T17:16:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198928#p198928</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198928#p198928"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198928#p198928"><![CDATA[
<div class="quotetitle">Kentsel napisał(a):</div><div class="quotecontent"><br />1 generowanie losowej kostki, 64 piksele<br /></div>Co znaczy dowolnej kostki? Czy to są dowolne 64 pixele ze wszystkich 512? Jak one wpływają na kolejne punkty?<br />Czy te znikające pixele w drugim punkcie to te wylosowane w pierwszym kroku? Jak tak to w pierwszym nie mogą być dowolnie losowe pixele , tylko po 8 na każdą warstwę, w dodatku unikalne.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 14 lis 2017, o 17:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kentsel]]></name></author>
<updated>2017-11-14T11:42:33+01:00</updated>
<published>2017-11-14T11:42:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198913#p198913</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198913#p198913"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198913#p198913"><![CDATA[
Kostka ma 3 osi, pionowo z, w poziomie x i y. Animacja dla osi z, odbywa się w pionie, góra ma wartość 0, dół 7, animacja w przód dla osi z znaczy od 0 do 7 a więc z góry na dół, w tył od 7 do 0 czyli w górę.<br /><br />3 etapy działania:<br />1 generowanie losowej kostki, 64 piksele<br />2 wypisanie na pierwszej ścianie animacji wszystkich 64p, ściana przesuwa się o 1, zostaje 8p na ścianie 1 wg wcześniej wylosowanych, te 8p jest odejmowane od tamtych 64, więc zostaje 56 na ścianie 2. Przesunięcie o 1, pozostawienie 8p, 48 jedzie dalej. Aż do 8 ściany gdzie pozostaje 8p, założenia projektu, na każdej ścianie 8p o indywidualnych współrzędnych.<br />3 animacja odwrotna, od dowolnej brzegowej ściany, 8p, przesuwa się na kolejną ścianę i dodaje, w efekcie ściana 1 ma 0p ściana 2 16p, itd aż do ostatniej ściany na którą zbiera wszystkie 64p.<br />Ja to widzę, wydaje mi się to łatwe, a zarazem trudne do wytłumaczenia. Może mam w telefonie nagraną animacje. <br /><br />Wysłane z mojego E5603 przy użyciu Tapatalka<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 25 minutach ]</span></strong><br /><br /><a href="https://drive.google.com/file/d/1CI4UmDDcXPCizUcMaII3lDkHTEVxSgIl/view?usp=drivesdk"  class="postlink">https://drive.google.com/file/d/1CI4UmDDcXPCizUcMaII3lDkHTEVxSgIl/view?usp=drivesdk</a> (180 MB) <br />Stare nagranie ale pokazuje zasadę działania.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 29 minutach ]</span></strong><br /><br />Opisana animacja zaczyna się od 1:32<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8166">Kentsel</a> — 14 lis 2017, o 11:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2017-11-14T11:07:02+01:00</updated>
<published>2017-11-14T11:07:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198912#p198912</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198912#p198912"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198912#p198912"><![CDATA[
<div class="quotetitle">Kentsel napisał(a):</div><div class="quotecontent"><br />Tu następuje druga, powrotna cześć funkcji, znowu losowa oś i kierunek (w przód lub w tył)<br /></div><br />Napisz dokładniej co tutaj robisz, bo przynajmniej ja, nie rozumiem z tak lakonicznego opisu <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 14 lis 2017, o 11:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kentsel]]></name></author>
<updated>2017-11-14T10:53:27+01:00</updated>
<published>2017-11-14T10:53:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198910#p198910</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198910#p198910"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198910#p198910"><![CDATA[
Zrobiłem wczoraj jeszcze próbę z losowaniem jednej zmiennej;<br />for z 0-7, for y 0-7<br />x=losuj(0, zakres) <br /><br />(losuje 8 razy w do while i zmniejszam zakres) <br /><br />gdzie zrobiłem tablice dla iksów, o wartościach 0 do 7, wybrany x jest zastępowany ostatnim, tak żeby wykorzystać wszystkie 8 współrzędnych, sprawdzanie we wszystkich płaszczyznach i mały debug. <br />Rozwinę jeszcze założenia. Funkcja na początku losuje oś wzdłuż której będzie rysowana animacja, losuje kierunek. Pierwsza ściana się wypełnia, przesuwa się o 1, usuwa 8 pikseli które zostały na pierwszej ścianie  i reszta przesuwa się wzdłuż osi animacji, tak 8 razy aż na ostatnią ścianę dociera 8 pikseli. Tu następuje druga, powrotna cześć funkcji, znowu losowa oś i kierunek (w przód lub w tył) i następuje zbieranie ścian aż do ostatniej na której powinny znaleźć się wszystkie 64 elementy. Niestety nie we wszystkich osiach to działa, jeśli działa w osi x i y, to w osi z już będzie brakowało kilku pikseli ponieważ współrzędne się dubluja a innych nie ma wcale.<br /><br />Cała moja kostka opiera się o tablicę cube|8][8][8] dla Z Y i X, jeśli będzie to cube[5][1][0]=1, to zapali się dioda dokładnie o tych współrzędnych. Gdyby zrobić listę dostępnych współrzędnych, każdy piksel wylosowany musiałby od razu blokować 7 innych, a ja już kompletnie nie wiem jak to ugryźć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8166">Kentsel</a> — 14 lis 2017, o 10:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2017-11-14T10:16:03+01:00</updated>
<published>2017-11-14T10:16:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198908#p198908</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198908#p198908"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198908#p198908"><![CDATA[
Problemem Twoim jest, że losujesz cały czas z całej tablicy. Więc jak masz więcej zaświeconych diod, to zanim trafisz na nie zaświeconą to trwa to coraz dłużej. A przy ostatnich możesz bardzo długo czekać aż na nie trafisz.<br />Rozwiązaniem w PC byłoby zrobienie listy na początek ze wszystkimi elementami i po wylosowaniu usuwanie wylosowanego z niej. Czyli zmniejszanie długości listy o 1 i kolejne losowanie już ze zmniejszonej liczby elementów.<br />W AVR masz niestety mniej pamięci i coś takiego jest trudno zrobić, ale najlepiej byłoby tak pokombinować.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Prosty rozwiązaniem jest zrobić tak, że jak wylosujesz już zapalony element to zapalasz następny &quot;wolny&quot; (nie zapalony), tak jakby to tamten był wylosowany. Przez co masz zawsze trafienie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br />A innym rozwiązaniem jest, gdy każda dioda to u Ciebie jeden bajt (choć to bardzo rozrzutne <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />), to zrobienie tak:<br />Na początku dla każdej diody losujesz wartość losową i zapisujesz w jej komórce. Czyli każda dioda ma jakąś nieunikalną (ale nam to nie przeszkadza) wartość ale różniącą od większości innych wartość. Robisz to przed przystąpieniem do zapalania.<br />Potem przelatujesz tablicę i zapalasz kolejno diody mające wartości w tablicy od najmniejszej do największej - znajdujesz najmniejszą wartość i zapalasz jej diodę. Potem szukasz czy nie ma innej takiej samej i jak jest to ją zapalasz w kolejnym kroku. Jak już nie ma to zwiększasz i szukasz o 1 większej. I tak do zapalanie wszystkich.<br />Aby nie zapalać diod o tej samej wartości zawsze od dołu do góry (lekko możesz zaburzyć losowość), to możesz przy każdej przeszukiwanej wartości zmieniać kierunki przeszukiwania tablicy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 14 lis 2017, o 10:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2017-11-14T06:43:55+01:00</updated>
<published>2017-11-14T06:43:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198897#p198897</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198897#p198897"/>
<title type="html"><![CDATA[Re: Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198897#p198897"><![CDATA[
Witaj.<br />Robisz teraz pętlę która losuje 64 razy współrzędne x,y,z.<br /><br />A gdyby tak wewnątrz pętli zawrzeć warunek że <br />jeśli dioda o współrzędnych x,y,z została już wylosowana to zmniejszmy wartość licznika o 1 [syntax=c]i--;[/syntax]<br />Wtedy program tak długo będzie losował aż zapali 64 diody.<br />(wypełni Twoją tablicę 64 losowo wybranymi jedynkami)<br /><br />P/S<br />Jechałem sobie do pracy i cały czas mnie ten Twój temat szturchał <br />Wziąłem kartkę i namalowałem sobie tablicę 4y * 4x <br />Zacząłem &quot;zapalać&quot; kolejne diody i zonk. <br /><br /><a href="https://obrazkiforum.atnel.pl/18188/222ad8eba296b78898f8b55bebb85642.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/18188/222ad8eba296b78898f8b55bebb85642.jpg" alt="Obrazek" /></a><br />Po tych malunkach wyszło że aby zapamiętać wylosowane współrzędne 64 diod należało by wygenerować tablicę <br />[syntax=c]uint8_t polozenia &#91;64&#93; &#91;3&#93;;  // nr diody i 3 bajty położenia x,y.z[/syntax]<br />Wtedy wypełniając tę tablicę losowo wybranymi wartościami miałbyś współrzędne którymi mógłbyś &quot;dokarmiać&quot; diody<br />Może się mylę<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 14 lis 2017, o 06:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Kentsel]]></name></author>
<updated>2017-11-14T00:15:38+01:00</updated>
<published>2017-11-14T00:15:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198894#p198894</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198894#p198894"/>
<title type="html"><![CDATA[Generowanie losowej tablicy 3d]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19608&amp;p=198894#p198894"><![CDATA[
Pierwszy post na forum, wypada się przywitać, a więc<br />Dobry wieczór <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Kombinuje nad generowaniem losowej zawartości dla tablicy trójwymiarowej niech to będzie char tablica[8][8][8];<br />Chcę to wykorzystać do mojej led cube, tablica jest wizualizacją całej kostki, 1 oświeca diodę. Chcę żeby w każdej płaszczyźnie było dokładnie 8 elementów; w osi z (pionowo) będzie 8 płaszczyzn x na y. Trudno jest mi to nawet jakoś sensownie wytłumaczyć. Musi być dokładnie 64 elementów (jedynek) rozstrzelonych na całą objętość kostki, ale nie powtarzających się elementów, coś na wzór sudoku(mi to się z tym kojarzy). Miliony godzin, pętli i warunków i albo generuje śmieci, albo pętla losująca się zatrzymuje i program staje.<br />Piszę w C, dla AVR, dokłądniej atmega1284p. Proszę o podsunięcie idei. Czasem przy problemach z losowanie dodawałem do pętli flagę, warunek o przepełnieniu do while i potem jakiś debug, ale tu debug i przypisywanie elementów na sztywno to nie to co chcę osiągnąć.<br /><br />Myślałem nad czymś takim, ale generuje 2 elementy i się wysypuje, avr staje.<br />[syntax=c]short x,y,z;<br />for(short i=0; i&lt;=64; i++)<br />{<br />do<br />{<br />z=losuj(0, 7);<br />y=losuj(0, 7);<br />x=losuj(0, 7);<br />}while((help_cube_x&#91;z&#93;&#91;y&#93;==1)||(help_cube_y&#91;z&#93;&#91;x&#93;==1)||(help_cube_z&#91;y&#93;&#91;x&#93;==1));<br />help_cube_x&#91;z&#93;&#91;y&#93;=1;<br />help_cube_y&#91;z&#93;&#91;x&#93;=1;<br />help_cube_z&#91;y&#93;&#91;x&#93;=1;<br />cube&#91;z&#93;&#91;y&#93;&#91;x&#93;=1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8166">Kentsel</a> — 14 lis 2017, o 00:15</p><hr />
]]></content>
</entry>
</feed>