Я вот хз, я не настолько силен в познаниях во внутриврачебной кухне.
Но реально рано подпускать врачей к больному опасно: сначала долго и упорно смотреть и запоминать что делают старшие коллеги, изучать все истории болезни подряд, потом ассистировать, набивать руку на простых больных и только потом уже подпускать к врачебной практике. Цена ошибки просто очень высока.
P.S. Из районной поликлиники ушла на пенсию дама-окулист. Завтра иду к её молодой сменщице. Мне заранее страшно.
А че страшного в районном окулисте? Вряд ли там сидит офтальмолог-хирург, а единственная неприятная процедура разве что только проверка внутриглазного давления (кстати вот да, бесконтактная тонометрия глаза тоже вот интересная тема)
Ну вот да, так все и получается. Она, медицина, вещь сложная, нужно много всего знать, часть знаний еще и фигово формализовано, т.е. нужен иметь большой опыт, умение на ходу быстро соображать и обладать зверской интуицией. Тем более хирургия — она вообще все затрагивает и руки должны быт максимально выпрямлены. А уж нейрохирургия — так вообще страшное занятие…
Так что да, на врача готовится сложно и долго, только лет через 15+ сможешь стать самодостаточным врачом. Но вот Штаты я в качестве примера привел, потому что у них этот процесс более жестко регламентирован — у нас могут пустить, а могут и не пустить на операцию — у них нужно столько пахать до лицензирования/получения сертификата, поэтому если хорошенко загуглиться, то можно найти мериканские стандарты на подготовку врачей со сроками (у меня где-то даже были). У нас я думаю так же по времени все это занимает, просто не формально.
Ну т.е. на врача реально надо учиться долго, очень долго. А еще все время читать журналы и новую медицинскую литературу.
Айтишникам в этом плане куда проще: компилируется — значит зашибись. Нашли ошибку — пару строчек поправили, скомпилировали и снова в продакшен. Так и набивают опыт. А фундамент современного программирования полностью сформировался еще 30+ лет назад, так что можно не парится чего-то пропустить (если, конечно ты не в Computer science) В медицине такое не проканает…
Не практикующих врачей — нет. Единицы кмн, дмн которые никого не лечат, но это обычно люди пришедшие не из медицины (например, биологии, физики, химии), но все равно занимающиеся медициной непосредственно (например, генетические анализы), но повторюсь, таких реально единицы (я вот знаю только 2).
Когда, например, у нас в университете занимались вопросами выращивания кожи, ядро всей научной группы составляли именно врачи-комбустиологи, а рулил этим вообще рукроводитель ожоговго центра и дмн, который собственно больных и лечил. Когда занимались Холтер-ЭКГ, мониторингом по пулсовой волне и т.п. — была аналогичная ситуация: без кардиологов ничего не сделаешь.
В общем эксперт крайне необходим, т.к. медицина вещь в себе. Даже не крайне, а жизненно необходим
В условиях переизбытка кадров, к молодым специалистам отношение как к рабам.
Между тем толкового хирурга фиг найдешь
Дело в том, что в России для хирурга просто мало мест, где он мог бы оперировать.
В каком плане? Хирургических отделений мало, ставок нет или операционные зажимают?
Просто хирург наверное один из самых важных врачей на любом уровне медецинского приема и лечения.
Гнойный хирург, хирург-травматолог и зубной хирург так вообще наверное самые жизненно-необходимые врачи, иначе без них люди начнут просто пачками мереть (кстати буквально недавно натыкался на официальную статистику, что в РФ, например, увеличилась смертность от фурункулов и абсцессов 0_0 неужели все стало так плохо?)
Вы несколько ограниченно все же рассмотрели вопрос «медицинский софт».
Вот несколькими постами ниже пример программы для анализы томограммы мозга. А в области ультразвуковой диагностики так вообще непаханное поле для задач обработки информации и идентификации. Или обработка данных анализов крови. Или оценка состояния сердечно-сосудистой системы по пульсовой волне, ну и т.д. В общем куча задач связанных с непосредственной диагностикой.
А есть еще проблемы с обработкой метаданных. Всякие экспертные системы и т.д.
Плюс модели и симуляции.
Недавно вон читал статью в Nature по себорейному дерматиту: выводы такие, что его вызывают не грибы вида Malassezia как принято считать (и как написано в вики), а стрептококи. Ну вот там судя по статье для обработки данных пришлось не одну программу написать, чтобы выявить все зависимости и выявить из всего зоопарка флоры кожи человека главного виновника.
В общем тут ограничивается не только встраиваемым ПО для медаппаратуры и ERP системами.
К слову сказать игрушки развивают интеллект, да и вообще на когнитивных функциях хорошо сказываются… даже кликеры. Для нейрончиков это заметно полезнее чем пялится в в стену. Да и вообще на играх основаны механизмы обучения всех животных, даже глупых бегемотов.
Да и игры — это наверное самая сложная категория программных продуктов, сложнее наверное будут только совсем брутальные вещи, типа SCADA, научных вычислений и т.п.даже не смотри на обилие всяких говнофреймворков. Но я бы не стал так самобичеваться — игроделы далеко не в зарплатном топе по РФ, даже среди Айтишников.
Фигасе у вас ставочки, в США где одна из самых больших налоговых нагрузок, что бы суммарная (штат+федеральное правительство+FICA и т.д.) эффективна ставка налога превысила 40%, надо миллионами долларов ворочать и жить в одну харю, а чтоб эффективная ставка федерального налога к 30% добралась, это надо в месяц тыщ по 60 баксов получать и соответственно облагаться по всей налоговой шкале (она от 0% и до 39.6%)
Кстати налоговое бремя в РФ и США примерно одинаковое (еще раз напомню, что в страха Северной Америке одни из самых высоких налогов в мире), а вот расходы на медицину у нас 6.4% от ВВП, а в США 15.7% от ВВП, а уж в абсолютных показателях у нас траты больше чем в 10 раз меньше. Так что тут не только в налогах дело, хотя прогрессивную шкалу бы и стоило ввести
Вообще если не выеживаться с мптрицами-шматрицами, то для кубчиской кривой Безье, если учесть что t1=1/3 и t2=2/3, то подставив все это в параметрическое уравнение получим систему из 2-х линейных уравнений:
b=(8/27)a + (4/9)x1 + (2/9) x2 + (1/27) d
c = (1/27)a + (2/9)x1 + (4/9)x2 + (8/27)d
a = x0
d = x3
Это систему можно решить в лоб как в школе учили: Берем выражаем x1 через первое уравнение:
X1=(-2/3)a+(9/4)b+(1/12)d-(1/2)x2
Подставляем x1 во второе выражение, ну а дальше мне лень т.к. с телефона (в общем во втором останется только x2 и a,b,c,d, т.е. Сможем выразить x2 через точки a,b,c,d, ну а дальше возвращаемся в первое), только это нудно и можно накосячить (много рутинных преобразований), но после всех вычислений, приведеней и сокращений на листочке, получится совсем простая функция с двумя формулами:
X1 = (-5a+18b-9c+2d)/6
X2 = (2a-9b+18c-5d)/6
Для квадратичного сплайна аналогично. А это 2 самых используемых, врядли на практике будут использоваться полиномы 4 и выше порядков. Но вот как раз для них (т.е. В общем виде) лучше сводить задачу к системе линейных уравнений в матричном виде. Еще с помощью перемножения матриц и векторов можно представить всю кривую сразу (а не по сегментам как я выше писал) и сразу скопом все решить. Вот для этого лучше уже использовать библиотеку, причем решение по всей кривой в матричном виде будет быстрее, чем считать по сегментам как я выше описал (просто векторизация матричных вычислений поддерживается процессором через SIMD инструкции, а ГПУ сами по себе являются векторными процессорами изначально). Главное задачу правильно в матричном виде представить, собственно для этого и нужны математики с их Matlab/Octave. Но! Тут еще надо смотреть для чего это вам нужно, например, если вы хотите найти контрольные точки что бы переместить сплайн из одной сетке в другую, то тут как раз такие функции включены в любые библиотеки в которых есть иниерполяторы сплайнами, например, в том же ALGLIB который я упоминал.
Вообще сплайнов много, есть еще всякие сплайны Эрмита, сплайны Катмулла-Рома и еще куча других. Они по-факту почти тоже самое что и Безье, только параметризованы по другому, что бывает иногда удобно.
Вообще мне по работе раньше часто приходилось со сплайнами встречаться и ВНЕЗАПНО это никак не связано с графикой.
И вот именно по вычислительной геометрии, самые нормальные книги это:
1) Ф.Препарата. Вычислительная геометри
2) Роджерс, Адамс.
Математические основы машинной графики
3) Роджера
Алгоритмические основы машинной графики
Вот собственно и все. Причем эти книги еще и фиг найдешь. Какие-то учебники издавал БХВ и ДМК(Вычислительная геометрия: Алгоритмы и приложения), но я хз чего там.
Гы. Вот буквально несколько лет назад такую задачу решал. Да и сейчас маячит.
Я так предполагаю шо сплайн кубический (с квадратичным вроде как достаточно просто должен быть), т.е.
p(t)= (1-t)*(1-t)*(1-t)*x0
+3*t*(1-t)*(1-t)*x1
+3*t*t*(1-t)*x2
+t*t*t*x3;
т.к. контрольные точки x0 и x3 у нас вообще-то известные — они же a и d, а вот x1 и x2 уже будут хз. t = t0, t1, t2, t3, 0<t<1. Зато нам будут известны 2 другие точки, пусть b и c.
b = (1-t1) * (1-t1) * (1-t1) * x0 + 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 + t1 * t1 * t1 * x3
c = (1-t2) * (1-t2) * (1-t2) * x0 + 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2 + t2 * t2 * t2 * x3
Ну (1-t1) * (1-t1) * (1-t1) * x0 + t1 * t1 * t1 * x3 и (1-t2) * (1-t2) * (1-t2) * x0 + t2 * t2 * t2 * x3 нам известны, так что можно это представить вот так
3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3
Обзовем правую часть как вектор-столбец Y = [y1,y2], т.е.
y1 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3
y2 = c — (1-t2) * (1-t2) * (1-t2) * x0 — t2 * t2 * t2 * x3
мы её можем однозначно вычислить.
Это с одной стороны, а вот с другой стороны
y1 = 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2
y2 = 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2
Назовем (для компактности) неизвестные переменные как вектор-столбец X = [x1, x2], мы их не знаем. Получится:
A*X=Y
Где A — это матрица
[ 3 * (1-t1) * (1-t1) * t1, 3 * (1-t1) * t1 * t1;
3 * (1-t2) * (1-t2) * t2, 3 * (1-t2) * t2 * t2]
Она тоже одназночно вычислима, соответственно получается, решая эту СЛАУ в матричном виде:
X = inv(A) * Y
inv — это инверсия матрицы.
Почему такие сложности? Та хрен его знает — формально так положено, красиво и компактно выглядит… ну еще потому что получается, что в матрице А торчат полиномы Берштейна и задача по поиску контрольных точек в итоге сводится к решению системы линейных уравнений. Собственно каждая точка сплайна Безье это и есть линейная комбинация контрольных точек и полиномов Брештейна и есть надежда, что так можно окучивать любые сплайны (надо попробовать).
А так для кубического сплайна получиться что-то типа такого (и без всякого обращения сплайнов)
Можно еще учесть, что t1 = 1/3, а t=2/3, и обозвать A11… как-нибудь по-другому, тогда говнокод станет более читабельным. Можно даже еще проще поступить, сразу вставить t1=1/3 и t2=2/3 в параметрическое уравнение и там получиться без таких сложностей просто решить систему из двух уровнений.
Вроде сходу так получается, хотя могут быть ошибки, но мне уже лень проверять. Но в любом случае с этими сплайнами все можно свести с решению систем линейных уравнений. Такие солверы встречаются вроде как везде. Собственно тут и солвер не нужен Ax=y => x = pinv(A)*y — только матрицу обратить умножить на вектор и все, главное задачку к этому свести, но это будет иметь смысл если количество уравнений больше 3-4 ИМХО
Лучший способ отсеять удаленно — попросить написать програмку или попросить дать ссылку на свой код (и то и то хорошо, но не все могут выложить свой код).
Это вот как раз может отсеять 90% кандидатов, если требования на позицию высокие (если нет, то можно брать всех подряд).
Конкретно в моем случае, еще 90% отсеивалось после моего увлекательного рассказа что здесь надо делать и через какой мир боли придется пройти. Но тут правда действительно задача для супер-героев.
Но это все если позиция действительно сложная. Если что-то простое, то можно всех подряд брать, а про boxing и unboxing человек может потом и в MSDN прочитать для общего образования. Потом все равно по какой-то магической причине у человека который рассказывал на собеседовании про boxing/unboxing но все равно пишет:
Point pt = new Point();
Console.WriteLine(pt);
Что в принципе нифига не смертельно.
Или
int i = 10;
ArrayList arrlst = new ArrayList();
arrlst.Add(i);
int j = (int)arrlst[0];
Хотя ArrayList наверное никто не использует уже… на самом деле .NET в этом плане несколько более дружелюбный. Это вот в Жабе можно испытать батхерт от Long и long например.
Ну да: придется ходить туда-сюда зажигая/отключая свет, увеличивая дальность.
Но это вообще олимпиадная задачка: олимпиадники обычно знают решение, прочие — как повезет, но сходу догадается не каждый, тем более за ограниченное время собеседования, можно еще и яркой лампой в лицо в упор светить и проводить собеседование в комнате без окон для создания более дружелюбной атмосферы…
Но с другой стороны эта задачка не из воздуха — есть такая штука как «кольцевой(циклический) список» — вот и ходи по нему бесконечно, т.к. хрен его знает где начало, а где конец :-)
С монетками — делим по полам, и один носок вставляем в другой…
У меня походу одна из коллег (девушка, как и автор) походу тайно фанатеет от этой книги. Где-то к 10-ой минуте собеседования с ней мне стало грустно и уныло, захотелось пойти домой и попить кофе с зефирками.
Если что, то собеседовали человека ко мне и под мою задачу, а она за компанию пошла…
Ну вообще там были вопросы про LINQ, что чисто C#-фича. Абстрактные классы и интерфейсы на уровне синтаксиса — тоже фича C# и Java, а в том же C++ нету интерфейсов и это уже вопрос, что называть платоновским человеком — вроде две ноги, нет перьев, а [ощипанная] курица.
MVVM — это тоже MVC--костыль к WPF и Силверлайт (или WPF это костыль к MVVM — это дискуссионный вопрос).
Event и delegate — опять таки чисто .NET мозгокрутка. В Жабе делгатов нет, а в С/C++ вместо этого дотнетовского зоопарка хватает обычного теплого и лампового указателя. Да и вообще вопрос холиварный ИМХО
Вы точно проходили собеседование на .NET Junior?
Когда меня заставляли собеседовать народ, то на джуниора я обычно спрашивал в какие игры играет, какой сорт виски предпочитает, ну можно было спросить опционально про какие-нибудь общие понятие ООП, чтоб совсем несерьезно не выглядеть.
А вот решение тестовых задачи и/или ссылки на свой какой-нибудь код — по-моему единственная эффективная по которой можно хоть как-то оценить человека.
Так же хочется отметить тот факт, что в своем резюме я указал, что занимаюсь олимпиадным программированием и это очень положительно повлияло на ход многих собеседований. Меня просили рассказать, что это такое. Меня удивило, что большинство интервьюверов не знали про такое движение в программировании.
Угу и задают вопросы:
Вы находитесь в пустом поезде...
Внезапно это как раз олимпиадная задачка…
Чойт меня не покидает ощущение, что люди совсем не знают кого хотят набрать, может я постарел и засиделся?
Ну на то и расчет. Обычно все упирается в производительность и набор функций, чтоб самим время-деньги сэкономить, иначе может выйти дороже (если вообще выйдет).
Для академических целей прайсы кстати очень демократичные, а можно и вообще бесплатно получит. Обычно различают: академические цели, коммерческое использование малыми компаниями, коммерческое использование большими компаниями (вот тут ценник становится просто конским.
Но тут правда еще одна проблема может вылезти — купить-то можно, а потом окажется, что там чего-то нет.
Ну а если говорить о совсем-совсем ПО для математиков, то это: Matlab, Mathematica, Mapple. Стоят тоже конских денег. Например, бесплатная альтернатива Matlab — это Octave, которая таки несколько медленнее и не имеет (пока еще) всего функционала. Они на самом деле крайне удобны для математического программирования — прежде всего за счет синтаксиса и богатых библиотек для всяких рисовалок, вот только коммерческий продукт на них фиг напишешь — все равно потом придется брать какой-нибудь язык общего назначения и переписывать на нем и вот тут выясняется, что Mathwork требует конских бабок за свои продукты не просто так…
Мне иногда кажется, что развитие языков свернуло куда-то не туда…
Хотя вот сейчас появилась Julia, которая, если будет развиваться дальше наверное переломит существующую практику.
Могу и еще накидать. Все на самом деле зависит от целей и задач. Вот где-то рядом чувак отписывался, что ему хватает BLAS/uBLAS, соответственно — это MKL или C++ boost они бесплатные и достаточно быстрые (MKL ИМХО быстрее, но он на самом деле условно бесплатный). Есть еще ROOT, но я им никогда не пользовался.
А вот иногда бывают другие ситуации:
1) Разработчик/заказчик хочет чего-то странного. Обычно это всякие высокоуровневые вещи и хитрые солверы. Ну т.е. одно дело просто матрицы перемножить, другое дело нужно что-то посложнее (ну я хз, например какое-нибудь квадратичное программирование) и что бы не изобретать велосипед и не тратить время проще купить.
2) Нужна супер-пупер производительность. Люди наигрались с Python/NumPy и внезапно узнают, что на других ЯП и с другими библиотеками эти же задачи решаются в 20 раз быстрее (таки реальный замер).
3) Нужны всякие свистелки и перделки. Ну банально без графиков никуда.
4) Внезапно выясняется, что кругом одни Жаба и ДотНет кодеры и никто не хочет писать на С/С++, а уж про Fortran так вообще в РФ забыли (за бугром таки нет, практически вся запрограммированная математика идет от Фортрана). Можно найти халявную библиотеку, но платнаябиблиотека будет лучше. А так был случай когда наткнулись на C#-враппер над C/C++ библиотекой, которая в итоге сама оказалась враппером над библиотекой, написанной на Фортране. При этом исходная фортрановская библиотека была под MIT (таки общенародной достояние), а С-враппер уже под GPL 0_0
5) Людям нужна среда разработки а еще лучше — быстрый компилятор, а еще лучше что бы было все и сразу
Но вообще все же лучше по возможности писать самому: во-первых, слишком много тонкостей по применению и использованию, во-вторых, иногда бывают такие ситуацию, когда единственный доступный гугл — это книжка за много денег
Но реально рано подпускать врачей к больному опасно: сначала долго и упорно смотреть и запоминать что делают старшие коллеги, изучать все истории болезни подряд, потом ассистировать, набивать руку на простых больных и только потом уже подпускать к врачебной практике. Цена ошибки просто очень высока.
А че страшного в районном окулисте? Вряд ли там сидит офтальмолог-хирург, а единственная неприятная процедура разве что только проверка внутриглазного давления (кстати вот да, бесконтактная тонометрия глаза тоже вот интересная тема)
Так что да, на врача готовится сложно и долго, только лет через 15+ сможешь стать самодостаточным врачом. Но вот Штаты я в качестве примера привел, потому что у них этот процесс более жестко регламентирован — у нас могут пустить, а могут и не пустить на операцию — у них нужно столько пахать до лицензирования/получения сертификата, поэтому если хорошенко загуглиться, то можно найти мериканские стандарты на подготовку врачей со сроками (у меня где-то даже были). У нас я думаю так же по времени все это занимает, просто не формально.
Ну т.е. на врача реально надо учиться долго, очень долго. А еще все время читать журналы и новую медицинскую литературу.
Айтишникам в этом плане куда проще: компилируется — значит зашибись. Нашли ошибку — пару строчек поправили, скомпилировали и снова в продакшен. Так и набивают опыт. А фундамент современного программирования полностью сформировался еще 30+ лет назад, так что можно не парится чего-то пропустить (если, конечно ты не в Computer science) В медицине такое не проканает…
Когда, например, у нас в университете занимались вопросами выращивания кожи, ядро всей научной группы составляли именно врачи-комбустиологи, а рулил этим вообще рукроводитель ожоговго центра и дмн, который собственно больных и лечил. Когда занимались Холтер-ЭКГ, мониторингом по пулсовой волне и т.п. — была аналогичная ситуация: без кардиологов ничего не сделаешь.
В общем эксперт крайне необходим, т.к. медицина вещь в себе. Даже не крайне, а жизненно необходим
Между тем толкового хирурга фиг найдешь
В каком плане? Хирургических отделений мало, ставок нет или операционные зажимают?
Просто хирург наверное один из самых важных врачей на любом уровне медецинского приема и лечения.
Гнойный хирург, хирург-травматолог и зубной хирург так вообще наверное самые жизненно-необходимые врачи, иначе без них люди начнут просто пачками мереть (кстати буквально недавно натыкался на официальную статистику, что в РФ, например, увеличилась смертность от фурункулов и абсцессов 0_0 неужели все стало так плохо?)
Хз. Наверное обпиться воды, вызвать рвоту или промыть желудок толстым желудочным зондом…
Вот несколькими постами ниже пример программы для анализы томограммы мозга. А в области ультразвуковой диагностики так вообще непаханное поле для задач обработки информации и идентификации. Или обработка данных анализов крови. Или оценка состояния сердечно-сосудистой системы по пульсовой волне, ну и т.д. В общем куча задач связанных с непосредственной диагностикой.
А есть еще проблемы с обработкой метаданных. Всякие экспертные системы и т.д.
Плюс модели и симуляции.
Недавно вон читал статью в Nature по себорейному дерматиту: выводы такие, что его вызывают не грибы вида Malassezia как принято считать (и как написано в вики), а стрептококи. Ну вот там судя по статье для обработки данных пришлось не одну программу написать, чтобы выявить все зависимости и выявить из всего зоопарка флоры кожи человека главного виновника.
В общем тут ограничивается не только встраиваемым ПО для медаппаратуры и ERP системами.
Да и игры — это наверное самая сложная категория программных продуктов, сложнее наверное будут только совсем брутальные вещи, типа SCADA, научных вычислений и т.п.даже не смотри на обилие всяких говнофреймворков. Но я бы не стал так самобичеваться — игроделы далеко не в зарплатном топе по РФ, даже среди Айтишников.
Кстати налоговое бремя в РФ и США примерно одинаковое (еще раз напомню, что в страха Северной Америке одни из самых высоких налогов в мире), а вот расходы на медицину у нас 6.4% от ВВП, а в США 15.7% от ВВП, а уж в абсолютных показателях у нас траты больше чем в 10 раз меньше. Так что тут не только в налогах дело, хотя прогрессивную шкалу бы и стоило ввести
Вообще если не выеживаться с мптрицами-шматрицами, то для кубчиской кривой Безье, если учесть что t1=1/3 и t2=2/3, то подставив все это в параметрическое уравнение получим систему из 2-х линейных уравнений:
b=(8/27)a + (4/9)x1 + (2/9) x2 + (1/27) d
c = (1/27)a + (2/9)x1 + (4/9)x2 + (8/27)d
a = x0
d = x3
Это систему можно решить в лоб как в школе учили: Берем выражаем x1 через первое уравнение:
X1=(-2/3)a+(9/4)b+(1/12)d-(1/2)x2
Подставляем x1 во второе выражение, ну а дальше мне лень т.к. с телефона (в общем во втором останется только x2 и a,b,c,d, т.е. Сможем выразить x2 через точки a,b,c,d, ну а дальше возвращаемся в первое), только это нудно и можно накосячить (много рутинных преобразований), но после всех вычислений, приведеней и сокращений на листочке, получится совсем простая функция с двумя формулами:
X1 = (-5a+18b-9c+2d)/6
X2 = (2a-9b+18c-5d)/6
Для квадратичного сплайна аналогично. А это 2 самых используемых, врядли на практике будут использоваться полиномы 4 и выше порядков. Но вот как раз для них (т.е. В общем виде) лучше сводить задачу к системе линейных уравнений в матричном виде. Еще с помощью перемножения матриц и векторов можно представить всю кривую сразу (а не по сегментам как я выше писал) и сразу скопом все решить. Вот для этого лучше уже использовать библиотеку, причем решение по всей кривой в матричном виде будет быстрее, чем считать по сегментам как я выше описал (просто векторизация матричных вычислений поддерживается процессором через SIMD инструкции, а ГПУ сами по себе являются векторными процессорами изначально). Главное задачу правильно в матричном виде представить, собственно для этого и нужны математики с их Matlab/Octave. Но! Тут еще надо смотреть для чего это вам нужно, например, если вы хотите найти контрольные точки что бы переместить сплайн из одной сетке в другую, то тут как раз такие функции включены в любые библиотеки в которых есть иниерполяторы сплайнами, например, в том же ALGLIB который я упоминал.
Вообще сплайнов много, есть еще всякие сплайны Эрмита, сплайны Катмулла-Рома и еще куча других. Они по-факту почти тоже самое что и Безье, только параметризованы по другому, что бывает иногда удобно.
Вообще мне по работе раньше часто приходилось со сплайнами встречаться и ВНЕЗАПНО это никак не связано с графикой.
И вот именно по вычислительной геометрии, самые нормальные книги это:
1) Ф.Препарата. Вычислительная геометри
2) Роджерс, Адамс.
Математические основы машинной графики
3) Роджера
Алгоритмические основы машинной графики
Вот собственно и все. Причем эти книги еще и фиг найдешь. Какие-то учебники издавал БХВ и ДМК(Вычислительная геометрия: Алгоритмы и приложения), но я хз чего там.
Я так предполагаю шо сплайн кубический (с квадратичным вроде как достаточно просто должен быть), т.е.
p(t)= (1-t)*(1-t)*(1-t)*x0
+3*t*(1-t)*(1-t)*x1
+3*t*t*(1-t)*x2
+t*t*t*x3;
т.к. контрольные точки x0 и x3 у нас вообще-то известные — они же a и d, а вот x1 и x2 уже будут хз. t = t0, t1, t2, t3, 0<t<1. Зато нам будут известны 2 другие точки, пусть b и c.
b = (1-t1) * (1-t1) * (1-t1) * x0 + 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 + t1 * t1 * t1 * x3
c = (1-t2) * (1-t2) * (1-t2) * x0 + 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2 + t2 * t2 * t2 * x3
Ну (1-t1) * (1-t1) * (1-t1) * x0 + t1 * t1 * t1 * x3 и (1-t2) * (1-t2) * (1-t2) * x0 + t2 * t2 * t2 * x3 нам известны, так что можно это представить вот так
3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3
3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2 = c —
(1-t2) * (1-t2) * (1-t2) * x0 — t2 * t2 * t2 * x3
Получаем систему линейных уравнений.
Обзовем правую часть как вектор-столбец Y = [y1,y2], т.е.
y1 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3
y2 = c — (1-t2) * (1-t2) * (1-t2) * x0 — t2 * t2 * t2 * x3
мы её можем однозначно вычислить.
Это с одной стороны, а вот с другой стороны
y1 = 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2
y2 = 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2
Назовем (для компактности) неизвестные переменные как вектор-столбец X = [x1, x2], мы их не знаем. Получится:
A*X=Y
Где A — это матрица
[ 3 * (1-t1) * (1-t1) * t1, 3 * (1-t1) * t1 * t1;
3 * (1-t2) * (1-t2) * t2, 3 * (1-t2) * t2 * t2]
Она тоже одназночно вычислима, соответственно получается, решая эту СЛАУ в матричном виде:
X = inv(A) * Y
inv — это инверсия матрицы.
Почему такие сложности? Та хрен его знает — формально так положено, красиво и компактно выглядит… ну еще потому что получается, что в матрице А торчат полиномы Берштейна и задача по поиску контрольных точек в итоге сводится к решению системы линейных уравнений. Собственно каждая точка сплайна Безье это и есть линейная комбинация контрольных точек и полиномов Брештейна и есть надежда, что так можно окучивать любые сплайны (надо попробовать).
А так для кубического сплайна получиться что-то типа такого (и без всякого обращения сплайнов)
Можно еще учесть, что t1 = 1/3, а t=2/3, и обозвать A11… как-нибудь по-другому, тогда говнокод станет более читабельным. Можно даже еще проще поступить, сразу вставить t1=1/3 и t2=2/3 в параметрическое уравнение и там получиться без таких сложностей просто решить систему из двух уровнений.
Вроде сходу так получается, хотя могут быть ошибки, но мне уже лень проверять. Но в любом случае с этими сплайнами все можно свести с решению систем линейных уравнений. Такие солверы встречаются вроде как везде. Собственно тут и солвер не нужен Ax=y => x = pinv(A)*y — только матрицу обратить умножить на вектор и все, главное задачку к этому свести, но это будет иметь смысл если количество уравнений больше 3-4 ИМХО
Это вот как раз может отсеять 90% кандидатов, если требования на позицию высокие (если нет, то можно брать всех подряд).
Конкретно в моем случае, еще 90% отсеивалось после моего увлекательного рассказа что здесь надо делать и через какой мир боли придется пройти. Но тут правда действительно задача для супер-героев.
Но это все если позиция действительно сложная. Если что-то простое, то можно всех подряд брать, а про boxing и unboxing человек может потом и в MSDN прочитать для общего образования. Потом все равно по какой-то магической причине у человека который рассказывал на собеседовании про boxing/unboxing но все равно пишет:
Что в принципе нифига не смертельно.
Или
Хотя ArrayList наверное никто не использует уже… на самом деле .NET в этом плане несколько более дружелюбный. Это вот в Жабе можно испытать батхерт от Long и long например.
Но это вообще олимпиадная задачка: олимпиадники обычно знают решение, прочие — как повезет, но сходу догадается не каждый, тем более за ограниченное время собеседования, можно еще и яркой лампой в лицо в упор светить и проводить собеседование в комнате без окон для создания более дружелюбной атмосферы…
Но с другой стороны эта задачка не из воздуха — есть такая штука как «кольцевой(циклический) список» — вот и ходи по нему бесконечно, т.к. хрен его знает где начало, а где конец :-)
С монетками — делим по полам, и один носок вставляем в другой…
Если что, то собеседовали человека ко мне и под мою задачу, а она за компанию пошла…
С другой стороны может и правильный подход
MVVM — это тоже MVC--костыль к WPF и Силверлайт (или WPF это костыль к MVVM — это дискуссионный вопрос).
Event и delegate — опять таки чисто .NET мозгокрутка. В Жабе делгатов нет, а в С/C++ вместо этого дотнетовского зоопарка хватает обычного теплого и лампового указателя. Да и вообще вопрос холиварный ИМХО
Когда меня заставляли собеседовать народ, то на джуниора я обычно спрашивал в какие игры играет, какой сорт виски предпочитает, ну можно было спросить опционально про какие-нибудь общие понятие ООП, чтоб совсем несерьезно не выглядеть.
А вот решение тестовых задачи и/или ссылки на свой какой-нибудь код — по-моему единственная эффективная по которой можно хоть как-то оценить человека.
Угу и задают вопросы:
Внезапно это как раз олимпиадная задачка…
Чойт меня не покидает ощущение, что люди совсем не знают кого хотят набрать, может я постарел и засиделся?
Для академических целей прайсы кстати очень демократичные, а можно и вообще бесплатно получит. Обычно различают: академические цели, коммерческое использование малыми компаниями, коммерческое использование большими компаниями (вот тут ценник становится просто конским.
Но тут правда еще одна проблема может вылезти — купить-то можно, а потом окажется, что там чего-то нет.
Ну а если говорить о совсем-совсем ПО для математиков, то это: Matlab, Mathematica, Mapple. Стоят тоже конских денег. Например, бесплатная альтернатива Matlab — это Octave, которая таки несколько медленнее и не имеет (пока еще) всего функционала. Они на самом деле крайне удобны для математического программирования — прежде всего за счет синтаксиса и богатых библиотек для всяких рисовалок, вот только коммерческий продукт на них фиг напишешь — все равно потом придется брать какой-нибудь язык общего назначения и переписывать на нем и вот тут выясняется, что Mathwork требует конских бабок за свои продукты не просто так…
Мне иногда кажется, что развитие языков свернуло куда-то не туда…
Хотя вот сейчас появилась Julia, которая, если будет развиваться дальше наверное переломит существующую практику.
Все упирается в специлаизацию. Если человек никогда не слышал про компьютерную геометрию — первое что ему придет в голову, считать через скалярное произведение, работать правда будет только если многоугольник выпуклый (convex), то и фиг с этим, да и вообще лучше стараться сводить все задачи к выпуклым если можно — с ними жить проще :-)
Если погуглить дальше то можно будет найти метод трассировки лучей/метод пересечений, вот как раз у Вас из этой серии пример кода, а есть еще другой подход — на количество оборотов причем потенциально эта идея может работать вообще с фигурами, которые описаны гладкими кривыми.
Могу и еще накидать. Все на самом деле зависит от целей и задач. Вот где-то рядом чувак отписывался, что ему хватает BLAS/uBLAS, соответственно — это MKL или C++ boost они бесплатные и достаточно быстрые (MKL ИМХО быстрее, но он на самом деле условно бесплатный). Есть еще ROOT, но я им никогда не пользовался.
А вот иногда бывают другие ситуации:
1) Разработчик/заказчик хочет чего-то странного. Обычно это всякие высокоуровневые вещи и хитрые солверы. Ну т.е. одно дело просто матрицы перемножить, другое дело нужно что-то посложнее (ну я хз, например какое-нибудь квадратичное программирование) и что бы не изобретать велосипед и не тратить время проще купить.
2) Нужна супер-пупер производительность. Люди наигрались с Python/NumPy и внезапно узнают, что на других ЯП и с другими библиотеками эти же задачи решаются в 20 раз быстрее (таки реальный замер).
3) Нужны всякие свистелки и перделки. Ну банально без графиков никуда.
4) Внезапно выясняется, что кругом одни Жаба и ДотНет кодеры и никто не хочет писать на С/С++, а уж про Fortran так вообще в РФ забыли (за бугром таки нет, практически вся запрограммированная математика идет от Фортрана). Можно найти халявную библиотеку, но платная библиотека будет лучше. А так был случай когда наткнулись на C#-враппер над C/C++ библиотекой, которая в итоге сама оказалась враппером над библиотекой, написанной на Фортране. При этом исходная фортрановская библиотека была под MIT (таки общенародной достояние), а С-враппер уже под GPL 0_0
5) Людям нужна среда разработки а еще лучше — быстрый компилятор, а еще лучше что бы было все и сразу
Но вообще все же лучше по возможности писать самому: во-первых, слишком много тонкостей по применению и использованию, во-вторых, иногда бывают такие ситуацию, когда единственный доступный гугл — это книжка за много денег