Отговори на тема  [ 11 мнения ] 
"Математически" проблем 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение "Математически" проблем
Блъскам си главата над следния проблем:

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


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

_________________
'просто' е технически синоним на 'красиво'


Вто Май 31, 2022 10:38 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 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


Вто Май 31, 2022 11:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Апр 13, 2018 4:00 pm
Мнения: 1622
Местоположение: София
Мнение 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 9:30 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 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 10:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: "Математически" проблем
Мерси, ама на мен проблемът ми е малко по-общ (оттук напъните за формула). Аз съм дал пример с таблица с 81 полета, обаче в действителност тя е доста по-голяма. Всъщност дори не знам точно колко е голяма, знам само броя полета в нея, и те отгоре на всичко може да се менят.
Затова търся решение което не зависи от предварително дефиниран размер

_________________
'просто' е технически синоним на 'красиво'


Сря Юни 01, 2022 11:25 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Апр 13, 2018 4:00 pm
Мнения: 1622
Местоположение: София
Мнение Re: "Математически" проблем
То ако се загледаш по-внимателно в алгоритъма, ще видиш, че той не зависи от размера.
Броят на зоните не е ограничен, а броят на подзоните е винаги 4.


Сря Юни 01, 2022 11:38 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: "Математически" проблем


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

_________________
'просто' е технически синоним на 'красиво'


Сря Юни 01, 2022 11:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: "Математически" проблем
al_at написа:
То ако се загледаш по-внимателно в алгоритъма, ще видиш, че той не зависи от размера.
Броят на зоните не е ограничен, а броят на подзоните е винаги 4.


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

_________________
'просто' е технически синоним на 'красиво'


Сря Юни 01, 2022 11:53 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: "Математически" проблем
Не стана ясно, описание на алгоритъм търсиш, или код който да работи?

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

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

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


Сря Юни 01, 2022 12:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: "Математически" проблем
Ники написа:
Не стана ясно, описание на алгоритъм търсиш, или код който да работи?

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

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

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



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

_________________
'просто' е технически синоним на 'красиво'


Сря Юни 01, 2022 12:44 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: "Математически" проблем
част от кода може да изглежда така, ако предпочиташ на четно.
Код:
    if(a&1)
        a+=1;
    b=point-((a-1)*(a-1)-1);
    c=a/2;
    d=b%a;
    switch(b/a)


Сря Юни 01, 2022 12:48 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 9 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни