Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

"Математически" проблем
http://mcu-bg.com/mcu_site/viewtopic.php?f=6&t=18387
Страница 1 от 1

Автор:  Н'бабане Гт'муан'га [ Вто Май 31, 2022 10:38 pm ]
Заглавие:  "Математически" проблем

Блъскам си главата над следния проблем:

Прикачени файлове:
Screenshot 2022-05-31 203130.png
Screenshot 2022-05-31 203130.png [ 15.26 KiB | Прегледано 2006 пъти ]


В тая таблица полетата са номерирани спираловидно. Опитвам се да изкарам формула, която да ми дава корелацията между индексите в тая спирала и декартови координати. Предполагам, че индекс 0 отговаря на координати 0,0.
Някакви идеи? :|

Автор:  Ники [ Вто Май 31, 2022 11:29 pm ]
Заглавие:  Re: "Математически" проблем

Дали ще помогне?
https://math.stackexchange.com/questions/2388738/cartesian-coordinates-of-the-points-on-the-plane-in-the-same-order-as-the-ulam-s
https://oeis.org/A268038
https://oeis.org/A174344

Автор:  al_at [ Сря Юни 01, 2022 9:30 am ]
Заглавие:  Re: "Математически" проблем

С една формула не се сещам как ще стане, ще дам алгоритъм за намиране на координатите.
Забелязва се, че числата са разположени в концентрични зони с квадратна форма:
Зона 0: 0
Зона 1 : 1 до 8
Зона 2 : 9 до 24
Зона 3 : 25 до 48
Зона 4 : 49 до 80
Зоните определят границите на координатите - зона 0 x=0, y=0
зона 1: х,y от -1 до +1 т.н.
Може да се изведе следната формула за номера на зоната Nzone:
Nzone = round(sqrt(Index)/2)
Броят на числата по страната на квадрата е:
Size_Zone = Nzone+2
Първото число в ненулевата зона е:
First_in_Zone = (Size_Zone-2)*(Size_Zone-2)
Определяме позицията на числото в зоната:
Pos_in_Zone = Index - First_In_Zone
Всяка зона има 4 подзони - страните на квадрата от 0 до 3.
Определяме подзоната:
Sub_Zone = Trunc(Pos_in_Zone/(Size_Zone-1))
Определяме позицията в подзоната:
Pos_in_Sub_Zone = Index - Sub_Zone*(Size_Zone-1)
В зависимост от подзоната от 0 до 3, формулите са различни
- за подзона 0: X = ((Size_Zone-1)/2) - Pos_in_Sub_Zone; Y = Nzone;
- за подзона 1: Y = ((Size_Zone-1)/2) - Pos_in_Sub_Zone; X = Nzone;
- за подзона 2: X = - ((Size_Zone-1)/2) + Pos_in_Sub_Zone; Y = - Nzone;
- за подзона 3: Y = - ((Size_Zone-1)/2) + Pos_in_Sub_Zone; X = - Nzone;
Идеята мисля, че е вярна, ако съм сбъркал във формулите някъде, то е от бързане,
че имам и много работа.

Автор:  Ники [ Сря Юни 01, 2022 10:35 am ]
Заглавие:  Re: "Математически" проблем

На няколко теста мина, и да има грешка, идеята е ясна.
Копи-пейст:

Код:
#include <math.h>
typedef struct
{
    int16_t x;
    int16_t y;
}coord;

void coord_of_point(uint16_t point, coord* crd)
{
int16_t a,b,c,d;

if(!point)
    {
    crd->x=0;
    crd->y=0;
    }
else
    {
    a=sqrt(point);
    if(!(a&1))
        a-=1;
    b=(point-((a*a)-1));
    c=a/2+1;
    d=b%(a+1);
    switch(b/(a+1))
        {
        case 0:
            crd->x=d-c;
            crd->y=c;
            break;
        case 1:
            crd->x=c;
            crd->y=c-d;
            break;
        case 2:
            crd->x=c-d;
            crd->y=-c;
            break;
        case 3:
            crd->x=-c;
            crd->y=d-c;
            break;
        case 4:
            crd->x=-c;
            crd->y=c-d;
            break;
        };
    }
printf("\r\nPoint(%d)=(%d,%d)",point,crd->x,crd->y);
}

Автор:  Н'бабане Гт'муан'га [ Сря Юни 01, 2022 11:25 am ]
Заглавие:  Re: "Математически" проблем

Мерси, ама на мен проблемът ми е малко по-общ (оттук напъните за формула). Аз съм дал пример с таблица с 81 полета, обаче в действителност тя е доста по-голяма. Всъщност дори не знам точно колко е голяма, знам само броя полета в нея, и те отгоре на всичко може да се менят.
Затова търся решение което не зависи от предварително дефиниран размер

Автор:  al_at [ Сря Юни 01, 2022 11:38 am ]
Заглавие:  Re: "Математически" проблем

То ако се загледаш по-внимателно в алгоритъма, ще видиш, че той не зависи от размера.
Броят на зоните не е ограничен, а броят на подзоните е винаги 4.

Автор:  Н'бабане Гт'муан'га [ Сря Юни 01, 2022 11:51 am ]
Заглавие:  Re: "Математически" проблем



Доста интересни линкове. Ще ги прегледам по-подробно. Мерси!
Тоя проблем се оказа много по-сложен отколкото изглеждаше на пръв поглед... :cry:

Автор:  Н'бабане Гт'муан'га [ Сря Юни 01, 2022 11:53 am ]
Заглавие:  Re: "Математически" проблем

al_at написа:
То ако се загледаш по-внимателно в алгоритъма, ще видиш, че той не зависи от размера.
Броят на зоните не е ограничен, а броят на подзоните е винаги 4.


Да, ще го загледам по-подробно! Първоначално помислих че е само за специфичния пример който съм дал

Автор:  Ники [ Сря Юни 01, 2022 12:22 pm ]
Заглавие:  Re: "Математически" проблем

Не стана ясно, описание на алгоритъм търсиш, или код който да работи?

С al_at сме писали в един интервал, и е дал описание.

Примера, който дадох, няма ограничение за размерите на спиралата/куба.

Само сменяш 'u/int16_t' с размерност по желание, ако спиралата мине 65535.

Автор:  Н'бабане Гт'муан'га [ Сря Юни 01, 2022 12:44 pm ]
Заглавие:  Re: "Математически" проблем

Ники написа:
Не стана ясно, описание на алгоритъм търсиш, или код който да работи?

С al_at сме писали в един интервал, и е дал описание.

Примера, който дадох, няма ограничение за размерите на спиралата/куба.

Само сменяш 'u/int16_t' с размерност по желание, ако спиралата мине 65535.



Ще го пробвам по-късно днес наготово твоя код. Мерси!

Автор:  Ники [ Сря Юни 01, 2022 12:48 pm ]
Заглавие:  Re: "Математически" проблем

част от кода може да изглежда така, ако предпочиташ на четно.
Код:
    if(a&1)
        a+=1;
    b=point-((a-1)*(a-1)-1);
    c=a/2;
    d=b%a;
    switch(b/a)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/