• Определение центра окружности или эллипса по его точкам

    @megalol
    Отстойные, но довольно быстрые, способы — через решение систем уравнений влоб. Типа, окружность по трем точкам, эллипс по восьми (?) точкам, перебираем комбинации все/случайным образом и усредняем результат. То, что предлагает mayorovp вторым пунктом. Почему отстойные — устойчивость плохая. Именно так мы делаем у себя — способы действительно отстойные и требуют костылей, но действительно быстрые. Разница между реальным центром и найденным таким способом намного меньше пикселя, но костылей действительно много. Например, отбирая треугольник при поиске окружности по 3-м точкам, нужно, чтобы все три точки были из разных четвертей окружности.
    Я не рекомендую — кода много, а экономия оправдывает себя только на железе 20 летней давности, когда нужен околорилтайм. Для эллипса по-моему малореально вообще что-либо нормальное получить.

    Универсальный способ — метод наименьших квадратов. То есть заставить компьютер подобрать такие параметры эллипса чтобы разница между эллипсом и нашими точками была минимальной. Лучше критерий сложно придумать — хотя иногда получается не то, что ожидаешь, но это скорее говорит о том, что исходные данные неправильные.

    Алгоритм такой:
    1. Выбираем подходящее уравнение эллипса.
    2. Пишeм целевую функцию (сумма квадратов уравнения для каждой точки исходных данных). По необходимости добавляем к целевой функции дополнительные условия, типа невырождаемости эллипса в гиперболу. Типа, если условие нарушается, устремляем ее в бесконечность.
    3. Выбираем минимизатор (градиентный спуск, нормальное уравнение т. д.)
    4. Если результаты не устраивают по скорости или качеству, возвращаемся к п. 3 или к п. 1.

    По поводу третьего пункта. В России почему-то считается, что МНК — это когда решение идет с помощью нормального уравнения (составляем матрицы и решаем (AtA)^-1*At*x=b без итераций в один присест). Это не так. Минимизировать можно каким угодно способом. Хоть генетическими алгоритмами. Нормальное уравнение хорошо тогда, когда член (AtA)^-1 получается маленькой квадратной матрицей. То есть когда параметров мало, а точек очень много. Систему уравнений для эллипса вообще к виду A*x-b=0 привести служно. Искать соответствующие статьи как это делается мне влом, поэтому я пойду влоб, в качестве минимизатора взяв стандартный матлабовский.

    Используя формулы mayorovp.

    
    %точки
    xs = [1 2 3 4 5 6 7 8 9 10];
    ys = [11 10 9 7 5 4 3 2 1 1];
    
    %сначала приблизим окружностью - чтобы не вырождалось в гиперболу
    %уравнение окружности
    circ = @(xs, ys, x0, y0, Rsq) (xs - x0).^2 + (ys - y0).^2 - Rsq;
    %целевая функция МНК
    fitfunc1 = @(X) sum( ( circ(xs, ys, X(1), X(2), X(3)) ) .^2 );
    
    %начальное приближение
    x0 = mean(xs);
    y0 = mean(ys);
    R = 1;
    result1 = fminsearch(fitfunc1, [x0 y0 R], optimset('display', 'iter'));
    
    
    %уравнение эллипса
    ellipse = @(xs, ys, x0, y0, A, B, C, F) A*(xs-x0).^2 + B*(xs-x0).*(ys-y0) + C*(ys-y0).^2 - F;
    %целевая функция МНК
    fitfunc2 = @(X) sum( ( ellipse(xs, ys, X(1), X(2), X(3), X(4), X(5), X(6))) .^2 );
    
    %начальное приближение - найденная окружность
    x0 = result1(1);
    y0 = result1(2);
    A = 1;
    B = 0;
    C = 1;
    F = result1(3);
     
    %сумма квадратов целевой функции для каждой точки
    result = fminsearch(fitfunc2, [x0 y0 A B C F], optimset('display', 'iter'));
     
    figure
    hold on;
    %изначальные точки
    scatter(xs, ys,'b');
    %эллипс
    xs1 = -2:0.005:20;
    ys1 = -2:0.005:20;
    [xss yss] = meshgrid(xs1, ys1);
    ell = abs(ellipse(xss(:), yss(:), result(1), result(2), result(3), result(4), result(5), result(6)) ) < 0.0001;
    scatter(xss(ell), yss(ell),'r');
    
    
    
    Ответ написан
    6 комментариев
  • Использование C++ в Keil?

    @megalol
    1. Сишные библиотеки, как правило, констистентны. Взяв библиотеку на С++, не понятно, что там внутри будет — шаблонная магия или С++ образца 98 года. В проекте может не быть поддержки исключений, а библиотека их будет активно использовать. И так далее. То есть даже выбрав С++, намного проще использовать сишные библиотеки. А там и до чистой сишки недалеко.
    2. Выше требования к скиллу программистов. Например, пресловутые виртуальные методы дают оверхед, а шаблоны — нет, но это же всем нужно объяснять, как писать на С++ с меньшим оверхедом, чем на С.

    В целом, для железа я больше люблю С++ без фанатизма, с библиотеками, имеющими чисто сишный интерфейс.
    Ответ написан
    Комментировать
  • Многомерная аппроксимация полиномами?

    @megalol
    Никакой особой разницы между одномерным и многомерным линейным МНК нет, если в одномерном МНК матрица A

    1 x1 x1^2 x1^3…
    1 x2 x2^2 x2^3…
    1 x3 x3^2 x3^3…


    то в многомерном матрица та, какая нужна:

    1 x1*y1 x1*y1^2…
    1 x2*y2 x2*y2^2…
    1 x3*y3 x3*y3^2…
    1 x4*y4 x4*y4^2…


    А дальше стандартное coefs = inv(A^T * A) * A^T * вектор_z.
    Ответ написан
    1 комментарий
  • Сайты, тупо возвращающие ответ?

    @megalol
    Почему не посылать HEAD запрос?
    Ответ написан
    4 комментария
  • Как правильно сделать deploy с помощью git?

    @megalol
    Нельзя для assets завести свою репу?
    Ответ написан
    Комментировать
  • Система плагинов?

    @megalol
    Если C++-way (и C++-only), то через pimpl. Так делают в Qt, например.
    То есть бинарно-совместимый класс, лежащий в хедере, устроенный так:
    class Foo{ private: unique_ptr<FooImp> impl; public: void DoSomethig(); }; //И .cpp файл, в котором лежит struct FooImpl{ void ReallyDoSomethig(){doSomething;} }; void Foo::DoSomething(){ impl->ReallyDoSomethig(); } Foo::Foo() : impl(make_unique<FooImpl>()){ }
    Чуть менее C++-way — интерфейс в .h файл,
    Конкретный вопрос: как получить список сабклассов, от базового класса плагина.

    С++ беден об информации о типах во время выполнения. Или руками (завести функцию getPluginSubclassesList() с вручную возвращаемым списком фабрик, ну или просто завести фабрику), или взять то, что эту информацию добавит. Возможно MOC из Qt умеет это.
    Ответ написан
    3 комментария
  • Half-precision floating-point ли это?

    @megalol
    FD93 — число в дополнительном коде, означает -621 в десятичной.
    Алгоритм конвертации:
    #include int main()
    {
    short x = 0xFD93;
    std::cout << float(x)/10;
    }
    Ответ написан
    2 комментария
  • Почему хоткеи работат не так, как надо в LibreOffice?

    @megalol
    У меня такое было во всей системе, когда в KDE default language (первым в списке) поставил russian.
    Ответ написан
    Комментировать
  • Могут ли умереть аккумуляторы, если пролежали год без работы?

    @megalol
    habrahabr.ru/company/beeline/blog/140117/, см. фразу «малым током»
    Ответ написан
    Комментировать
  • Почему GLSL очень редко используют для GPGPU?

    @megalol
    Никому не нужен константный прирост скорости, его можно добиться посидев ничего не делая.
    Есть более важные вещи — инструментарий, сообщество, библиотеки и реюзабельность кода. CUDA бьет всех по всем фронтам, и дело не в пиаре
    Ответ написан
    Комментировать
  • Перевод абстракта доклада - все ли понятно?

    @megalol
    Мой надмозг. Не нашел оригинал. Убрал заменители артиклей типа «этот» и «ваш», признаки устной речи «который», ну и по мелочам. Еще я бы избавился от тавтологий и вернул бы слово продакшен, но плохо могу в предметную область.
    Вообще я хочу сказать, что калькирование терминов не такое большое зло, как калькирование грамматики, от которой любой перевод пахнет Магазином на диване.

    — Частая развертка в разнообразные производственные среды увеличивает нагрузку на DevOps. Становится все сложнее гарантировать, что приложение развернуто правильно.

    В докладе будут рассмотрены некоторые распространенные ошибки в традиционной непрерывной интеграции, увеличивающие риск и объем ручной работы. Эти ошибки приводят к проявлению человеческого фактора, заставляя DevOps нервничать перед нажатием кнопки «Deploy».

    Далее мы продемонстрируем способы автоматизации, позволяющие преодолеть эти проблемы с помощью уже используемых популярных инструментов: системы сборки (Maven, Gradle или Ant+Ivy), сервера непрерывной интеграции (Jenkins, Bamboo или TeamCity) и бинарного репозитория.

    Вне зависимости от того, создаете ли вы программное обеспечение для облачных платформ или для собственной инфраструктуры, мы продемонстрируем, как получить полностью автоматизированную «производственную» сборку, собирающую полностью прослеживаемые, управляемые и готовые к внедрению продукты.
    Ответ написан
    2 комментария
  • Переводить ли калькизмы, и если да, то как?

    @megalol
    Фраза типа «Частый deployment в production», на мой взгляд, звучит вполне нормально (если слушатель, конечно, в теме)

    Ужасно звучит. Нормально звучит и приживается в языке то, что склоняется.
    Если говорить об устном докладе, то «частый деплоймент в продакшене» звучит нормально, в отличие от «частый деплоймент в продакшен», который сразу напоминает об андроидных слоганах типа «Пей кока-кола».
    Слова типа traceable и in-house влоб калькировать нельзя, будет инвалидбл рунглиш, но можно использовать переклад понативнее типа «трассируемый».
    К письменной речи это мало относится.
    Ответ написан
    1 комментарий
  • С++. Зависимость возвращаемого функцией типа от значения ее параметра?

    @megalol
    #include "boost/variant.hpp"

    boost::variant<int, std::string > f(int i)
    {
    if (i == 0)
    {
    return 1;
    }
    else
    {
    return std::string("str");
    }
    }

    int main()
    {
    std::cout << f(0) << " " << f(1) << std::endl;
    }
    Ответ написан
    4 комментария
  • Библиотека получения данных из аудиофайлов (Python)

    @megalol
    Если разово, в audacity, да и любом другом аудиоредакторе есть функция проект-импортировать raw файл. Достаточно сохранить этот поток байт и все.
    В питоне — docs.python.org/library/wave.html
    В матлабе/octave (рекомендую) wavread.
    mp3 я бы сделал уже из wav с помощью lame.
    Ответ написан
    2 комментария
  • Почему не умирает Opera?

    @megalol
    Есть такое
    Ответ написан
    Комментировать
  • А что вы делаете ночью на Хабре?

    @megalol
    Днем прочитал главную, делать нечего — читаю /new/, делать совсем нечего — зашел в q&a
    Ответ написан
  • Где в Москве купить медицинский спирт? Очень надо клавиатуру почистить?

    @megalol
    Изопропанол не хуже, продается в том числе и там где компьютеры
    Ответ написан
    2 комментария
  • Алгоритмы для обработки и анализа звука

    @megalol
    musicdsp.org и евонный форум, и e-mail рассылка.
    На русском — любая книжка по цифровой обработке сигналов даст нормальную базу.

    По вашей ситуации алгоритм такой:
    микрофон(звук)=>АЦП(цифровой массив)=>оконное FFT(массив комплексных чисел)=>массив амплитуд(массив действительных чисел)=>относительная частота максимума=>частота максимума=>нота

    Для вашей ситуации нужно знать api снятия звука с микрофона. Api будет выдавать порции звука кусками, допустим, по 1024 float'а. (При частоте дискретизации 44100 это будет 44100/1024 = 43 миллисекунды).
    К этому куску нужно применить оконное быстрое преобразование Фурье (FFT), поищите где-нибудь нормальную статью, в котором оно объясняется (пригодится книжка по цифровой обработке сигналов). В интернете есть куча библиотечных функций.
    Чтобы знать, что преобразование вообще делает, советую поставить Adobe^W Audition^W бесплатный аудиоредактор со спектроанализатором и посмотреть, что делается со звуком разных нот, на что влияет размер окна и т. п. Мозг сам по себе тоже работает со спектром, а не с самим сигналом, поэтому интуитивно все понимается на ура.

    У FFT, чем больше данных, тем большее спектральное разрешение. Для нужного разрешения, может быть нужно FFT'ить 8192 байта, или около того. FFT выдаст массив из 8192 комплексных чисел, модуль каждого из этих чисел даст амплитуду спектра. При этом значения 4096-8191 будут зеркальной копией 0-4095, такова особенность алгоритма. У комплексных чисел можно получить амплитуду, фаза в данном случае не нужна, а амплитуда — sqrt(re^2+im^2). Ну а дальше поиском максимума в массиве.

    Максимум будет относительной частотой (массив-то 0-4095, а частоты 0-44100/2). Чтобы перевести абсолютную в относительную, нужно по пропорции умножить на 44100/8192. Т.е. на частоту дискретизации деленную на размер окна FFT. И теперь перевести частоту в ноту. Там экспоненциальная зависимость (частота следующей ноты выше частоты предыдущей в корень двенадцатой степени из двух), с помощью таблички вида (A4 440; A#4 465.96] найти ближайшую не сложно.
    Ответ написан
    Комментировать