Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Фильтр для Dictionary по накопительному значению

06.12.2020, 09:46. Показов 1174. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть
C#
1
Dictionary<uint, uint>[] FreqArray = new Dictionary<uint, uint>[tb];
и после его заполнения я просто сортирую его
C#
1
2
for (int t = 0; t < tb; t++)
    FreqArray[t] = FreqArray[t].OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
сейчас я хочу убрать все значения которые не входят в 20% частот (они распределены экспоненциально). Мне нужна зона A.
То есть предварительно я могу посчитать суммы частот, умножить на 0.2, потом пройти по всем значением и как получу это значение - то буду знать какую часть словаря убрать.
Собственно как это можно интегрировать в один LINQ?
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:
:
:
:
:
 :
 :
 :
  :
  :
    .
       .
            ..................
|-------|--------------------|
    A             B
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2020, 09:46
Ответы с готовыми решениями:

Как ускорить фильтр, используя Dictionary? Для массива в десятки миллионов строк
Есть большой массив строк типа &quot;строкаID&quot;, десятки миллионов. Из него нужно отобрать по критерию: кол-во вхождений строк в массив было &gt;...

Фильтр для печати по значению в выпадающем списке
Пожалуйста, помогите новичку! Суть задания в том, что нужно создать выпадающий список, в котором необходимо выбрать продолжительность,...

Dictionary - Поиск ключа по значению
По ключу значения ключа найти - это понятно, а как найти ключ по значению? что бы к примеру в слове &quot;Два&quot; найти какая цифра...

18
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.12.2020, 12:57
Такое себе решение через Linq все делать, например:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
 
Dictionary<uint, uint> freq = new()
{
    [1] = 10,
    [2] = 50,
    [3] = 2,
    [4] = 25,
    [5] = 12,
    [6] = 100
};
 
freq = freq
    .Aggregate(
        new[] { new { Sum = 0u, Dictionary = new Dictionary<uint, uint>(freq.Count) } },
        (accumulator, pair) => {
            accumulator[0].Dictionary[pair.Key] = pair.Value;
            accumulator[0] = new { Sum = accumulator[0].Sum + pair.Value, accumulator[0].Dictionary };
            return accumulator;
        })
    .Select(x => new { Criteria = 0.2 * x.Sum, x.Dictionary })
    .Select(x => x.Dictionary.Where(y => y.Value >= x.Criteria))
    .SelectMany(x => x)
    .OrderByDescending(x => x.Value)
    .ToDictionary(x => x.Key, x => x.Value);
 
foreach (KeyValuePair<uint, uint> pair in freq)
{
    Console.WriteLine(pair);
}
Но есть огромное НО. Поскольку Dictionary работает на хеш таблицах, нет никакой гарантии, что ключи будут в отсортированном виде.

В сравнении с:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.Linq;
 
SortedDictionary<uint, uint> freq = new(ReverseComparer<uint>.Default)
{
    [1] = 10,
    [2] = 50,
    [3] = 2,
    [4] = 25,
    [5] = 12,
    [6] = 100
};
 
var sum = freq.Sum(x => x.Value);
foreach (var key in freq.Keys.Reverse())
{
    if (freq[key] < 0.2 * sum)
    {
        freq.Remove(key);
    }
}
 
foreach (KeyValuePair<uint, uint> pair in freq)
{
    Console.WriteLine(pair);
}
 
public sealed class ReverseComparer<T> : IComparer<T>
{
    public static readonly ReverseComparer<T> Default = new(Comparer<T>.Default);
 
    private readonly IComparer<T> comparer = Default;
 
    public static ReverseComparer<T> Reverse(IComparer<T> comparer)
        => new ReverseComparer<T>(comparer);
 
    private ReverseComparer(IComparer<T> comparer)
        => this.comparer = comparer;
 
    public int Compare(T x, T y)
        => comparer.Compare(y, x);
}
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.12.2020, 16:04  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Такое себе решение через Linq все делать
в соотношении скорость написания/компактность/производительность все равно быстрее чем мои поделки.

Цитата Сообщение от I2um1 Посмотреть сообщение
например:
логика работы не соответствует условию, на выходе
[6, 100]
[2, 50]
хотя 20% от 199 это 39. Максимум 100 можно еще взять, но 50 туда точно не попадёт никак.

Цитата Сообщение от I2um1 Посмотреть сообщение
if (freq[key] < 0.2 * sum)
не, условие совсем не такое.
нужно взять 20% значений от суммы, а не значения, которые меньше 20% от суммы.

Цитата Сообщение от I2um1 Посмотреть сообщение
public sealed class ReverseComparer<T> : IComparer<T>
непонятная мне конструкция.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.12.2020, 16:16
Цитата Сообщение от belalugoci Посмотреть сообщение
не, условие совсем не такое.
Поменять как надо.

Цитата Сообщение от belalugoci Посмотреть сообщение
непонятная мне конструкция.
Часть классов .NET требуют реализацию IComparer для сортировки. Так как надо сортировать по убыванию, я создал вспомогательный класс, который переворачивает результат IComparer по умолчанию.

Цитата Сообщение от belalugoci Посмотреть сообщение
написания/компактность/производительность
Почему же тогда у меня Linq получился такой нагромождённый и медленный в сравнении с обычным foreach? Во втором примере сразу видно как я сравнивал.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.12.2020, 16:27  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Поменять как надо.
не 0.2 заменить на 0.3 например, там логика совсем другая, как её вставить в ваш код я не представляю.

Цитата Сообщение от I2um1 Посмотреть сообщение
Часть классов .NET требуют реализацию IComparer для сортировки
я понимаю зачем оно нужно, я о том, что для меня такая конструкция будет неудобной в работе если потребуется что-то изменять.

Цитата Сообщение от I2um1 Посмотреть сообщение
Почему же тогда у меня Linq получился такой нагромождённый и медленный в сравнении с обычным foreach? Во втором примере сразу видно как я сравнивал.
LINQ = 1 строка
второй вариант = 19 строк (убрав 4 скобки будет 15 строк)
и скорость в данном случае между чем и чем? 0.02 сек против 0.018? Ну или даже против 0.00001 - для человека нет разницы.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.12.2020, 16:37
Цитата Сообщение от belalugoci Посмотреть сообщение
не 0.2 заменить на 0.3 например
Так Linq же компактный, однострочный:
C#
1
.Select(x => new { Criteria = 0.2 * x.Sum, x.Dictionary })
Цитата Сообщение от belalugoci Посмотреть сообщение
я о том, что для меня такая конструкция будет неудобной в работе если потребуется что-то изменять.
Так IComparer<T> - это обычный интерфейс, который можно менять как угодно и подставлять что угодно во время выполнения программы, инъекция зависимости. Не важно какая конкретная реализация у интерфейса.

Цитата Сообщение от belalugoci Посмотреть сообщение
LINQ = 1 строка
У меня 13 строк:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
freq = freq
    .Aggregate(
        new[] { new { Sum = 0u, Dictionary = new Dictionary<uint, uint>(freq.Count) } },
        (accumulator, pair) => {
            accumulator[0].Dictionary[pair.Key] = pair.Value;
            accumulator[0] = new { Sum = accumulator[0].Sum + pair.Value, accumulator[0].Dictionary };
            return accumulator;
        })
    .Select(x => new { Criteria = 0.2 * x.Sum, x.Dictionary })
    .Select(x => x.Dictionary.Where(y => y.Value >= x.Criteria))
    .SelectMany(x => x)
    .OrderByDescending(x => x.Value)
    .ToDictionary(x => x.Key, x => x.Value);
Цитата Сообщение от belalugoci Посмотреть сообщение
0.02 сек против 0.018? Ну или даже против 0.00001 - для человека нет разницы.
Зависит от количества значений. Вот только Linq проиграл и в производительности, и в читабельности, и в корректности. Я напомню, что Dictionary работает на хеш таблицах и порядок ключей в словаре не гарантируется, хоть как сортируй.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.12.2020, 17:03  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Так Linq же компактный, однострочный:
не понимаю вас.

Цитата Сообщение от I2um1 Посмотреть сообщение
Так IComparer<T> - это обычный интерфейс, который можно менять как угодно и подставлять что угодно во время выполнения программы, инъекция зависимости. Не важно какая конкретная реализация у интерфейса.
Был как-то у меня препод по сопромату, он и про свой предмет примерно так и рассказывал, а студенты рядками вешались.

Цитата Сообщение от I2um1 Посмотреть сообщение
У меня 13 строк:
это одна строка, то что вы её так отформатировали это особенности восприятия текста.

Цитата Сообщение от I2um1 Посмотреть сообщение
Зависит от количества значений
у меня ~8000000 пар, операции LINQ занимают 0.1-0.4 секунды, на 800 строк кода таких операций штук 5-7, основной код выполняется 4-6 часов - будет ли разница в 7*0.4 сек или в 7*0.00000001 сек?

Цитата Сообщение от I2um1 Посмотреть сообщение
Вот только Linq проиграл и в производительности
Несущественно.

Цитата Сообщение от I2um1 Посмотреть сообщение
и в читабельности
Для меня оба варианта - абракадабра.

Цитата Сообщение от I2um1 Посмотреть сообщение
и в корректности
Никто не мешает забрать данные из Dictionary, а LINQ применять к этим данным (что я сейчас и пишу).
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.12.2020, 17:38
belalugoci, только я не препод. Оба варианта не пройдут код ревью. Так лучше для восприятия?
C#
1
freq = freq.Aggregate(new[] { new { Sum = 0u, Dictionary = new Dictionary<uint, uint>(freq.Count) } }, (accumulator, pair) => { accumulator[0].Dictionary[pair.Key] = pair.Value; accumulator[0] = new { Sum = accumulator[0].Sum + pair.Value, accumulator[0].Dictionary }; return accumulator; }).Select(x => new { Criteria = 0.2 * x.Sum, x.Dictionary }).Select(x => x.Dictionary.Where(y => y.Value >= x.Criteria)).SelectMany(x => x).OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);
В принципе, можно и всю программу в одну строку записать.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
06.12.2020, 17:52  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
не пройдут код ревью
?

Цитата Сообщение от I2um1 Посмотреть сообщение
Так лучше для восприятия?
это присвоение и логично что оно в одну строку, все команды разделены точками, вот примеры:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Compare(int b)
{
    if (b > 0)
        return true;
    else
        return false;
}
bool Compare(int b)
{
    return b > 0 ? true : false;
}
bool Compare(int b)
{
    return b > 0;
}
Все три варианта работают одинаково, но читать проще первый (ну мне во всяком случае), но к определенному моменту я его все равно переделаю в третий вариант, он проще и компактнее.
Вариант с LINQ - это одна строка, четко видно что будет одно присваивание и ничего кроме. Что там внутри происходит уже не будет важно и когда будет мелькать эта строка я буду визуально останавливаться только на имени переменной и знаке присваивания.
Код с компараторами разносится по тексту и неудобен.

В любом случае этот разговор не имеет отношения к теме и абсолютно бессмысленный ибо это вкусовщина.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
07.12.2020, 05:55  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Поменять как надо.
Мой вариант.
Для 54065 пар время работы ~0.06 с
JSON
1
2
[00:00:06.7399766] между этими таймкодами
[00:00:06.7983831] выполнялся этот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            long[] sum20 = new long[tb]; // массив сумм
            List<uKeyPair>[] uFreq = new List<uKeyPair>[tb]; // новый список, заменяющий Dictionary
            for (int t = 0; t < tb; t++) // цикл по 8 массивам
            {
                uFreq[t] = new List<uKeyPair>();
                sum20[t] = (long)(FreqArray[t].Sum(summ => summ.Value) * 0.2); // заполнение сумм в 20% от общей
                uint sumFreq = 0; // накопительное значение суммы
                foreach (var kp in FreqArray[t]) // перебор всех пар
                {
                    sumFreq += kp.Value; // накопление сумм
                    uFreq[t].Add(new uKeyPair(kp.Key, kp.Value)); // перенос из Dictionary в List
                    if (sumFreq >= sum20[t]) break; // условие выхода из цикла по достижению порога суммы частот
                }
                uFreq[t] = uFreq[t].OrderByDescending(x => x.Value).ToList(); // сортировка списка
            }
Напишите вариант на LINQ, измерим скорости.

PS: еще переделать всё равно нужно будет, так как FreqArray является Dictionary и его сортировать, как мне уже несколько раз сказали, не всегда разумно по результату.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
07.12.2020, 12:06
Цитата Сообщение от belalugoci Посмотреть сообщение
Напишите вариант на LINQ, измерим скорости.
Я не скорость мерял, а память. При сумме Linq выделил 416 Мб без переполнения uint (8 миллионов частот не отобразить как экспонента в этом крошечном типе), при среднем - 700 с копейками.

Цитата Сообщение от belalugoci Посмотреть сообщение
Напишите вариант на LINQ, измерим скорости.
Чтобы написать, надо знать про uKeyPair и чем заполнять массив списков.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
07.12.2020, 12:36  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Я не скорость мерял, а память
вы сказали про LINQ:
"нагромождённый и медленный"
"Linq проиграл и в производительности"

Цитата Сообщение от I2um1 Посмотреть сообщение
При сумме Linq выделил 416 Мб без переполнения uint
А есть операции в коде с переполнением?

Цитата Сообщение от I2um1 Посмотреть сообщение
8 миллионов частот не отобразить как экспонента в этом крошечном типе
Вы сейчас о чем?

Цитата Сообщение от I2um1 Посмотреть сообщение
Чтобы написать, надо знать про uKeyPair и чем заполнять массив списков.
C#
1
2
3
4
5
6
7
8
9
10
        public class uKeyPair
        {
            public uint Key { get; set; }
            public uint Value { get; set; }
            public uKeyPair(uint key, uint val)
            {
                Key = key;
                Value = val;
            }
        }
остальное скину чуть позже когда буду дома
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
07.12.2020, 12:58
Цитата Сообщение от belalugoci Посмотреть сообщение
вы сказали про LINQ
Производительность = скорость + память.

Цитата Сообщение от belalugoci Посмотреть сообщение
нагромождённый и медленный
Я код написал через обычный foreach, после просто конвертанул его в Linq.

Цитата Сообщение от belalugoci Посмотреть сообщение
А есть операции в коде с переполнением?
Не я пытаюсь засунуть экспоненциальный рост 8 миллионов чисел в 4 байта.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
07.12.2020, 16:06  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Не я пытаюсь засунуть экспоненциальный рост 8 миллионов чисел в 4 байта.
пока это делаете только вы, я лишь обозначил само распределение, подчиняющееся определенным правилам.

Цитата Сообщение от I2um1 Посмотреть сообщение
Производительность = скорость + память.
производительность=скорость работы, причем тут память?
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
07.12.2020, 18:58
Цитата Сообщение от belalugoci Посмотреть сообщение
обозначил само распределение
Задача о зернах на шахматной доске.

Цитата Сообщение от belalugoci Посмотреть сообщение
причем тут память?
Любая книга по алгоритмам и структурам данных. Оценка сложности алгоритма.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
08.12.2020, 05:02  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Задача о зернах на шахматной доске.
нет, эта задача к данной теме не имеет никакого отношения

Цитата Сообщение от I2um1 Посмотреть сообщение
Любая книга по алгоритмам и структурам данных. Оценка сложности алгоритма.
И где связь? Вы разговор завели о скорости работы LINQ. Как например при механической обработке изделий есть понятие допуска. Так и про скорость работы алгоритма. Если у вас есть 40 мс на формирование например кадра в игре, а определенный алгоритм всё делает за 7 мс, то условие выполнено (абсолютно не важно можно ли сделать еще быстрее). Если вы задали условием 40 мс и не более 500 Мб памяти - это другое условие. Я для своей задачи нигде не ставил условий по памяти и совсем не ясно почему вас это озаботило.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
08.12.2020, 15:19
Цитата Сообщение от belalugoci Посмотреть сообщение
нет, эта задача к данной теме не имеет никакого отношения
Задача показывает скорость экспоненциального роста.

Цитата Сообщение от belalugoci Посмотреть сообщение
Как например при механической обработке изделий есть понятие допуска
Я не разбираюсь в механической обработке.

Цитата Сообщение от belalugoci Посмотреть сообщение
совсем не ясно почему вас это озаботило
Дыра в фундаментальных знаниях. Потом появляются бесконечные споры аля "Ботлнек String/StringBuilder".
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
08.12.2020, 15:43  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
Задача показывает скорость экспоненциального роста.
я рад за задачу и за вас, но к теме она не имеет отношения.

Цитата Сообщение от I2um1 Посмотреть сообщение
Я не разбираюсь в механической обработке.
вы, как я погляжу, много в чем не разбираетесь.

Цитата Сообщение от I2um1 Посмотреть сообщение
Дыра в фундаментальных знаниях. Потом появляются бесконечные споры аля "Ботлнек String/StringBuilder".
неумение читать написанное, а потом наезды, что вокруг одни дураки.

я тоже умею писать чушь и наезжать, продолжим?
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
08.12.2020, 19:14
Цитата Сообщение от belalugoci Посмотреть сообщение
много в чем не разбираетесь
Так и есть. Меньше знаешь, крепче спишь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2020, 19:14
Помогаю со студенческими работами здесь

Dictionary узнать соответствует ли индекс значению
Всем привет! Помогите, пожалуйста, в словаре узнать соответствует ли индекс значению? Я получил значение login в словаре, но как его...

Dictionary(TKey, TValue).ContainsKey сравнение по значению
есть некоторые полиморфные объекты от одного базового класса Item, потому использую именно класс, а не структуру. Далее необходимо...

Фильтр по значению Combobox
Всем привет. Есть Dbgrid (в нем два столбца: курс и группа), курсов всего пять и по каждому курсу есть несколько групп и на форме...

Сделать фильтр по значению
пожалуйста, кому не трудно, объясните что должно быть внутри кавычек, adoquery.filter:='' есть таблица .mdb в которой есть колонка...

Фильтр по значению из XML
Имеется документ в формате XML, примерно такого вида: &lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt; &lt;DataSetStudents&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru