Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
 Аватар для hinst
23 / 9 / 2
Регистрация: 06.01.2013
Сообщений: 113

Есть ли в стандартной библиотеке модуль (пакет?) для работы с матрицами?

30.05.2013, 12:50. Показов 3381. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь найти в стандартной библиотеке модуль (пакет?) для работы с матрицами. Нарыл какой-то Data.Matrix, вписал строку "import Data.Matrix" в свою программу. После этого у меня из всего функционала матриц работает только функция для создания матрицы
Haskell
1
matrix :: BLAS3 e => (Int, Int) -> [((Int, Int), e)] -> Matrix (n, p) e
и всё.
Искал документацию по этой библиотеке, нашёл вот что: функция для создания матрицы описана на этой странице http://hackage.haskell.org/pac... Dense.html , библиотека описана на этой странице http://hackage.haskell.org/package/blas-0.7.6 (ну это мне так кажется, а как на самом деле - не знаю). Мне не очень понятно¸ тот ли пакет я взял, который следовало, и правильно ли я понимаю, что у меня в программе используются те модули, документацию к которым я смотрю. Как установить между пакетом и документацией соответствие, у меня нет ни малейшего понятия. Когда я впервые вписал в программу "import Data.Matrix", не скомпилировалось, я стал устанавливать пакет тем способом, который мне показался вероятным: командой "cabal install matrix". Он что-то установил, после этого программы с import Data.Matrix начали компилироваться.
Что мне нужно чтобы ещё работало по матрицам: функции чтобы взять отдельную строку или отдельный столбец как экземпляр vector или хотя бы как стандартный список, функции чтобы перечислять элементы и обращаться к элементам матрицы по индексу, ну и вообще всякие другие функции, хотелось бы узнать, где увидеть их описание. Вот например, нужна функция, чтобы получить количество строк в матрице. На этой http://hackage.haskell.org/pac... Class.html странице вижу:
Haskell
1
numRows :: MatrixShaped a => a mn e -> Int
Но когда в GHCi ввожу
:m + Data.Matrix
:i numRows
то получаю
Not in scope: `numRows'
Чтобы получить строку матрицы как вектор, хотел использовать функцию vectorFromMatrix, но с ней всё ещё хуже, она не только не видна у меня, но мне ещё и не понятно, как ей пользоваться, и то ли она делает, что я думаю она делает, из описания я не понял
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2013, 12:50
Ответы с готовыми решениями:

Есть ли критическая секция в стандартной библиотеке?
Здравствуйте! Собственно, сам вопрос. Как использовать критическую секцию в C++? Нашёл информацию о подобном для windows и linux. Есть...

Написать модуль для работы с матрицами
Здравствуйте, срочно нужна помощь. Нужно создать проект в Lazarus. Суть такая: задаются A - двумерный динамический массив размерности NxN,...

Модули. Создать модуль для работы с матрицами 3 на 3
Создать модуль для работы с матрицами 3 на 3 Он должен содержать 3 подпрограммы: Нахождение определителя, Суммы элементов главной...

16
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 14
30.05.2013, 15:03
Можно на коленке соорудить что-либо вроде:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- Матрицы, как списки списков:
 
-- Элемент по индексу
 
getByIndex :: Num a => [[a]] -> Int -> Int -> a
getByIndex m i j = if (i > (length m)) then error "!" else if (j > (length row)) then error "!" else row !! j where row = m !! i
 
-- дать строку
 
getRow :: Num a => [[a]] -> Int -> [a]
getRow m i = if (i > (length m)) then error "!" else m !! i
 
-- Дать столбец
 
getCol :: Num a => [[a]] -> Int -> [a]
getCol m j = map (\ x -> x !! j) m
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
31.05.2013, 05:31
Лучший ответ Сообщение было отмечено как решение

Решение

Поставь пакет hmatrix (cabal update && cabal install cabal-install && cabal install hmatrix).

Репозиторий на GitHub:Страница на Hackage:Tutorial:
Связанные пакеты:
  • hmatrix-static — обертка над hmatrix, которая предоставляет проверку размеров матрицы на стадии компиляции
  • hmatrix-syntax — удобный синтаксис (в стиле Matlab/Octave) определения матриц
Ни один из связанных пакетов с помощью cabal-install мне установить не получилось, cabal ругается на пропущенные/неразрешенные зависимости, но можно попробовать подредактировать файл сборки и установить вручную.

Вот пример всех операций, которые ты хотел:
Haskell
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
import Numeric.LinearAlgebra
 
testMatrix :: Matrix Double
testMatrix = (3 >< 4) [1..]
 
test :: Show a => String -> a -> IO ()
test str val = do
  putStr $ str ++ ": "
  print val
 
getRow :: Element a => Int -> Matrix a -> Vector a
getRow rowNum = flatten . extractRows [rowNum]
 
getColumn :: Element a => Int -> Matrix a -> Vector a
getColumn colNum mat = flatten $ subMatrix (0, colNum) (rows mat, 1) mat
 
main :: IO ()
main = do
  test "Initial matrix" $ testMatrix
  test "Element at index (2, 1)" $ atIndex testMatrix (2, 1)
  test "Element at index (2, 1) (different syntax)" $ testMatrix @@> (2, 1)
  test "Number of rows" $ rows testMatrix
  test "Number of columns" $ cols testMatrix
  test "Submatrix at index (1, 1) of size (2, 3)" $
    subMatrix (1, 1) (2, 3) testMatrix
  test "Extract row 1 as vector" $ getRow 1 testMatrix
  test "Extract column 2 as vector" $ getColumn 2 testMatrix
Вывод:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Initial matrix: (3><4)
 [ 1.0,  2.0,  3.0,  4.0
 , 5.0,  6.0,  7.0,  8.0
 , 9.0, 10.0, 11.0, 12.0 ]
Element at index (2, 1): 10.0
Element at index (2, 1) (different syntax): 10.0
Number of rows: 3
Number of columns: 4
Submatrix at index (1, 1) of size (2, 3): (2><3)
 [  6.0,  7.0,  8.0
 , 10.0, 11.0, 12.0 ]
Extract row 1 as vector: fromList [5.0,6.0,7.0,8.0]
Extract column 2 as vector: fromList [3.0,7.0,11.0]
Но скорее всего тебе этими операциями и не придется использовать, в пакете hmatrix определены более высокоуровневые манипуляции с матрицами.
3
 Аватар для hinst
23 / 9 / 2
Регистрация: 06.01.2013
Сообщений: 113
01.06.2013, 18:17  [ТС]
СПС¸ пакет поставился, это всё мне очень пригодится
0
25 / 25 / 2
Регистрация: 17.03.2013
Сообщений: 48
20.06.2013, 17:28
Кстати, кто-нибудь пробовал hmatrix поставить на Шindows (у меня ХР)? А то я поставил GSL в составе Cygwinа, проделал то, что написано в гитхабе в разделе про шиндоус. В итоге, в GHCi получаю:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GHCi, version 7.6.3: [url]http://www.haskell.org/ghc/[/url]  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :m + Data.Packed.Matrix
Prelude Data.Packed.Matrix> (2><3)[1..6]
Loading package array-0.4.0.1 ... linking ... done.
Loading package deepseq-1.3.0.1 ... linking ... done.
Loading package primitive-0.5.0.1 ... linking ... done.
Loading package vector-0.10.0.1 ... linking ... done.
Loading package containers-0.5.0.0 ... linking ... done.
Loading package bytestring-0.10.0.2 ... linking ... done.
Loading package binary-0.5.1.1 ... linking ... done.
Loading package Win32-2.3.0.0 ... linking ... done.
Loading package filepath-1.3.0.1 ... linking ... done.
Loading package old-locale-1.0.0.5 ... linking ... done.
Loading package time-1.4.0.1 ... linking ... done.
Loading package directory-1.2.0.1 ... linking ... done.
Loading package process-1.1.0.2 ... linking ... done.
Loading package storable-complex-0.2.1 ... linking ... done.
Loading package hmatrix-0.13.1.0 ... can't load .so/.DLL for: gsl-0.dll (addDLL: could not load DLL)
Посмотрел, в Cygwinе всякие libgsl.dll.a и др. файлы...

Конкретизирую вопрос, где взять подходящий GSL под windows?

Может я очень туплю?

Ещё, я до того как узнал про шматрикс, сделал свои операции для матриц, которые сделаны в виде списка списков. Они не очень оптимизированы. Вектора как бонус. Делюсь, если кому интересно :

Haskell
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
{-# LANGUAGE NoMonomorphismRestriction #-}
import Data.List
import Data.Complex
import System.IO
import System.Directory
import Data.Ratio
 
--Операция с матрицами, с исп-ем соотв. элементов из обеих матриц и запись их в соотв. элементы 3-й.
mMOp :: (a -> b -> c) -> [[a]] -> [[b]] -> [[c]]
mMOp op = zipWith (zipWith op)
 
mPlus :: Num a => [[a]] -> [[a]] -> [[a]]
mPlus = mMOp (+)
 
mMinus :: Num a => [[a]] -> [[a]] -> [[a]]
mMinus = mMOp (-)
 
--vector scalar multiplication 
vSMul :: Num a => [a] -> [a] -> a
vSMul x y= sum$zipWith (*) x y
 
vNMul number vector = map (*number) vector
 
vPlus = zipWith (+)
 
vMinus = zipWith (-)
 
mMul :: Num t => [[t]] -> [[t]] -> [[t]]
mMul xm ym = [[vSMul xml yml| yml<-(transpose ym)]|xml<-xm]
 
 
vAbs :: Floating a=> [a]->a
vAbs a =  (sqrt . sum . map (^2)) a
 
--Убрать нный элемент из списка
dropNE n list = take (n-1) list ++ drop n list 
 
--drop a cross from matrix
dropXM a b matrix = map (dropNE b) (dropNE a matrix)
 
--Убрать и получить нный элемент списка
dropGetNE n l = (l!!(n-1),take (n-1) l ++ drop n l)
 
dropGetXM a b m = let (x,y) = (dropGetNE a m) in (x!!(b-1), map (dropNE b) y )
 
-- determenant of matrix
detM2 [[m]] = m
--detM m = sum [let (x,y) = dropGetXM a a m in (-x*detM y) | a<-[1..(length m)]]
detM2 m = sum [let (x,y) = dropGetXM a 1 m in ((-1)^a*x*detM2 y) | a<-[1..(length m)]]
 
--Наибыстрейший из общих реализован по определению:
detM3 [[m]] = m
detM3 m = sum [let (x,y) = dropGetN1XM a m in ((-1)^a*x*detM3 y) | a<-[1..(length m)]]
 
dropGetN1XM n m = let (x,y) = (dropGetNE n m) in (head x, map tail y )
 
--Наибыстрейший из здешних, использует операцию деления, приводит матрицы к треуг. виду:
detM [[m]] = m
detM m = 
    let
        (x,(y:ys)) =  let z = map (getdivBy1stWOut1) m in (\(x,y)->(x,reverse y)) (foldl' (\(w,x) (y,z) -> (w*y,(z:x))) (1,[]) z)
    in
    x*detM (map (\x -> zipWith (-) x y) ys) --map (\a -> zipWith (-) a x ) y
 
getdivBy1stWOut1 (l:ls) = (l,map (/l) ls)
0
25 / 25 / 2
Регистрация: 17.03.2013
Сообщений: 48
25.06.2013, 10:49
ААА!! Мои алгоритмы для определителя --- говно! Не берите их.

Не по теме:

Я думал, оно добавится в конец того сообщения.



Добавлено через 17 часов 22 минуты
Вот, вроде корректная версия, реализованная по методу Гаусса:
Haskell
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
detM1 [[m]] =  m
detM1 m = 
    let 
        k = findIndex (\x->head x /= 0) m
        f (mh:mt) = 
            let (prodm,listm) = getDivBy1stWOut1 mh
            in (\(x,y)->x*detM1 (reverse y)) 
                    (foldl'
                        (\(w1,w2) x->
                            (\(y1,y2)->(y1*w1,(y2:w2)))
                                (if 
                                    head x /= 0 
                                then 
                                    (\(x1,x2)->
                                        (x1,zipWith (-) x2 listm)
                                    ) (getDivBy1stWOut1 x)
                                else (1,tail x)
                                )
                        ) (prodm,[]) mt
                    )
    in
        (case k of 
        Nothing-> 0
        Just 0 -> f m
        Just x -> negate$f (replaceGet1Index (x-1) (head m) (tail m)))
Добавлено через 6 минут
Но Лапаковская всё-равно быстрее.
1
25 / 25 / 2
Регистрация: 17.03.2013
Сообщений: 48
03.07.2013, 08:15
Кстати, я вот поставил необходимые для hmatrix библиотеки под winXP, но не написал, как я это сделал (времени не было). Метод довольно корявый, но работает, же =) По причинам выше, он был оптимальным для меня.

Я ставил по простому алгоритму:

1. Поставил cygwin с необходимыми библиотеками (cblas, gsl, lapack, и т. д.)
Там в C:\cygwin\bin и C:\cygwin\lib\lapack есть нужные .dll-файлы.

2. Если в каком-либо процессе требуется библиотека, типа gsl-0.dll, например, берётся файл, соответствующий по шаблону (например cyggsl-0.dll), копировал, переименовывал в требуемую gsl-0.dll, и кидал в C:\WINDOWS\system32. Так делается до тех пор, пока не перестанут запрашивать .dll-файлы. Могут потребоваться и другие, сходные по названию библиотеки, типа libgsl, их кидаем туда также, переименовывая cygwin-ские. Если не работает то можно поставить GSL отдельно, и брать библиотеки оттуда. Но что-то, по-моему они не работали...

3. Думаю суть алгоритма вам ясна.

Замечу, что провести тестирование описанное в Гитхабе не удалось (может я не терпеливый), но я проверял так, в Хаскелле. Всё нормально работало.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
13.01.2014, 02:11
Цитата Сообщение от IEAIAIO Посмотреть сообщение
Метод довольно корявый, но работает, же
Некрофилия, но все же. Именно поэтому немецкие пенсионеры на свою пенсию ездят в туры по миру, а наши взвешивают одну картошку в магазине по причине нехватки средств.
0
25 / 25 / 2
Регистрация: 17.03.2013
Сообщений: 48
13.01.2014, 08:31
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от alkagolik Посмотреть сообщение
Некрофилия, но все же. Именно поэтому немецкие пенсионеры на свою пенсию ездят в туры по миру, а наши взвешивают одну картошку в магазине по причине нехватки средств.
Да, нубский и дурной способ. Позорный.

Однако и Ваше сообщение бесполезно и не в тему.
3
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
14.01.2014, 00:56
Цитата Сообщение от IEAIAIO Посмотреть сообщение
Да, нубский и дурной способ. Позорный.

Однако и Ваше сообщение бесполезно и не в тему.
Однако... Вы отреагировали на это сообщение. Считаю что это результат! Лично Ваше внимание было мной привлечено, я РАД! что есть на постсовдепе люди, а то по большей мере -- нелюди.

Добавлено через 3 минуты
может моё сообщение "бесполезно" и не в тему... Меня возмутила до глубины души сама формулировка! Считаю что низость невозможно прикрыть никакими убеждениями или аргументами. Гораздо позорней быть "в теме" и молчать в эпоху плутократии.
0
14.01.2014, 01:06

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
может моё сообщение "бесполезно" и не в тему... Меня возмутила до глубины души сама формулировка! Считаю что низость невозможно прикрыть никакими убеждениями или аргументами. Гораздо позорней быть "в теме" и молчать в эпоху плутократии.
- и какое это имеет отношение к языку Haskell?

0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
14.01.2014, 02:40
Catstail, никакого! хэцкель считаю совершенством лингвистики.

Добавлено через 1 час 20 минут
хотя присутствует спорное опровержение.Пиететного утверждения нет. А тем более доказательства!Аллилуййа!
0
25 / 25 / 2
Регистрация: 17.03.2013
Сообщений: 48
14.01.2014, 08:16
Цитата Сообщение от alkagolik Посмотреть сообщение
Однако... Вы отреагировали на это сообщение. Считаю что это результат! Лично Ваше внимание было мной привлечено, я РАД! что есть на постсовдепе люди, а то по большей мере -- нелюди.

Добавлено через 3 минуты
может моё сообщение "бесполезно" и не в тему... Меня возмутила до глубины души сама формулировка! Считаю что низость невозможно прикрыть никакими убеждениями или аргументами. Гораздо позорней быть "в теме" и молчать в эпоху плутократии.

Не по теме:

Это и ежу понятно, что правильно -- изменить переменную окружения PATH. А мне тогда было непонятно. Я усиленно писал программу и страшно тупил...

Однако, по-моему это раздувание из мухи слона (этоя про людей-нелюдей)

0
165 / 164 / 23
Регистрация: 23.02.2011
Сообщений: 347
17.01.2014, 14:06
Цитата Сообщение от alkagolik Посмотреть сообщение
Catstail, никакого! хэцкель считаю совершенством лингвистики.

Добавлено через 1 час 20 минут
хотя присутствует спорное опровержение.Пиететного утверждения нет. А тем более доказательства!Аллилуййа!
Совершенством он будет, когда компилятор/интерпретатор не будет съедать подобные выражения
Haskell
1
(>>=)([(.),(.)]>>=(\(?)->((?)id id)"."))((.)(.)(++)[](\(.) -> ['(',(.),')']))
0
25 / 25 / 2
Регистрация: 17.03.2013
Сообщений: 48
17.01.2014, 18:04
Цитата Сообщение от Algiz Посмотреть сообщение
Совершенством он будет, когда компилятор/интерпретатор не будет съедать подобные выражения
Haskell
1
(>>=)([(.),(.)]>>=(\(?)->((?)id id)"."))((.)(.)(++)[](\(.) -> ['(',(.),')']))
Что ты имеешь в виду под съедением, и что ты ожидаешь увидеть результате работы этого выражения?

Добавлено через 6 минут
Или оно соответствует ожиданиям?
0
165 / 164 / 23
Регистрация: 23.02.2011
Сообщений: 347
17.01.2014, 22:05
Цитата Сообщение от IEAIAIO Посмотреть сообщение
Что ты имеешь в виду под съедением, и что ты ожидаешь увидеть результате работы этого выражения?

Добавлено через 6 минут
Или оно соответствует ожиданиям?
Я имею ввиду то, что компилятор позволяет писать в таком стиле. Да, это работает адекватно, но читать это невозможно.
1
25 / 25 / 2
Регистрация: 17.03.2013
Сообщений: 48
18.01.2014, 07:20
Цитата Сообщение от Algiz Посмотреть сообщение
Я имею ввиду то, что компилятор позволяет писать в таком стиле. Да, это работает адекватно, но читать это невозможно.
Анализ "нечитаемости", я полагаю -- довольно сложная задача. И, честно говоря, считаю, что пусть лучше это будет на совести программиста. Ведь:
1) Анализатор может ошибаться.
2) У программиста может не быть времени делать выражение "достаточно читаемым".

Можно использовать компромиссное решение, сделать это специальной опцией: считать за ошибку, просто предупреждать, или забить.

Хотя, качестве прототипа анализатора "нечитаемости" можно использовать счётчик вложенности выражений.

Ну а если Вы про определения произвольных вещей множеством названий, зарезервированных под функции от двух переменных (операторы), то я не читаю это неправильным. Подход "определяй что хочешь, а если хочешь вписать между двумя переменными, то будь добр обеспечить, чтобы их было 2" считаю вполне логичным.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2014, 07:20
Помогаю со студенческими работами здесь

Создать пользовательский модуль для работы с матрицами
Создать модуль, содержащий процедуры и/или функции: − объединение двух матриц вертикально («одна под другой»); − наибольший...

Есть ли какой-нибудь модуль для работы с XLSX файлами?
Спасибо большое, за развернутый ответ, теперь буду более детально учить Python. Подскажите пожалуйста, а есть ли какая нибудь библиотека,...

Написать пакет классов для работы с деловой графикой, предназначенный для работы в среде Windows
Написать пакет классовдля работы с деловой графикой, предназначенный для работы в среде Windows. Предусмотреть наличие в пакете классы для...

Разработать модуль работы с одномерными матрицами - нахождение минимального и максимального значения
Пожалуйсто помогите. Я где-то писала уже этот вопрос наверно случайно потом сама его удалила не дождавшись ответа, если я повторяюсь то...

Ошибка в стандартной библиотеке шланга?
Обнаружил интересную вещь: std::sort из стандартной библиотеки компилятора clang сортирует неправильно. Код, на котором это происходит,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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 На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru