• Как правильно обробатовать деталь фрезерным станком на программном уровне ?

    SHVV
    @SHVV
    Ещё немного про тулпасы, вообще весь сайт посвещён самодельным фрезерам и разработки программного обоспечения к ним.
    Может ещё что найдёте на этом форуме.
    > Фрезеру нельзя резать то, что не прорезано уровнем выше.Значит это надо учитывать.
    Это лишь означало, что вы не сможете вырезать деталь с навесающими элементами на 3-х осевом фрезере. Значит, если идти сверху-вниз, надо накапливать в отдельном 2-х мерном буфере прорезанные выше области и на следующихх уровнях ограничивать перемещение этими областями.
    Ответ написан
    Комментировать
  • Как можно в изображении опредилить 2-3 самых используемых цвета?

    SHVV
    @SHVV
    Первое, что приходит в голову - алгоритм кластеризации K-means. На сколько я знаю, он часто используется для построения палитр при конвертации изображения в индексные цвета. То есть, даже если на изображении нет 2 чётких доминирующих цветов, но есть близкие оттенки (небольшие градиенты, затенения или осветления), то он найдёт их средние значения.
    Ответ написан
    Комментировать
  • Словил шифратор key.btc@gmail.com, что делать с шифрованным диском?

    SHVV
    @SHVV
    Думаю, надёжнее всего загрузиться с чего-нибудь не Windows-ового и отформатировать нафиг.

    А так, можно отключить автозагрузку внешних дисков в реестре (Гугл в помощь, как это сделать), подключить винт, открыть каким-нибудь FAR-ом, TotalCommander-ом, главное не Explorer-ом (это ещё одна потенциальная дыра) и поискать в корне подозрительные файлы типа inf и ini и прочее. Почистить их и то, на что они ссылались.
    Ответ написан
  • Как быстро найти группу объектов в массиве, попадающих в выбранную зону по координатам Лево-Верх-Право-Низ?

    SHVV
    @SHVV
    Я для оптимизации поиска обычно сеточку использую. Просто и эффективно.

    То есть, строите двумерный массив, в каждом элементе которого список всех объектов, попавших в эту ячейку.
    При перемещении объекта необходимо обновлять и его положение в сетке.
    Соответственно, для поиска достаточно проверить все ячейки, в которые попадает объект, собрать список потенциальных кандидатов на пересечение и проверить каждого из них.

    Если пространство сильно не онородное (то есть есть много разбитых далеко кучек объектов), то регулярная сетка становится сильно не эффективной с точки зрения потребления памяти, тогда лучше строить дерево сортировки (k-d, Quad, Binary).
    Ответ написан
    1 комментарий
  • Перевод 3D модели в код или как правильно перевести?

    SHVV
    @SHVV
    Тут есть список различных open-source g-code и toolpath генераторов для 2D и 3D фрезерования (milling) и печати.
    В целом, для 3-х осевого фрезера всё сводится к серии 2D картинок. То есть, модель режется на слои по оси Z и строится путь для фрезера по пустым областям, а для печати по полным. Но для фрезера нельзя резать то, что не прорезано уровнем выше. Так что надо это учитывать.

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

    А вообще стратегий миллинга довольно много разных - растровые, контурные, vortex. Плюс если у вас есть вращающиеся оси, то свободы становится значительно больше и обычный слайсинг уже не совсем подойдёт. Подобные комплексы весьма сложны и развиваются десятки лет (PowerMILL, например), оптимизируя все процессы для ускорения производства.
    Ответ написан
    1 комментарий
  • Какую настольную лампу выбрать?

    SHVV
    @SHVV
    Ещё пара ссылок:
    3dnews
    habrahabr.
    Попробую написать небольшое резюме.
    Основные характеристики, на мой взгляд: цветовая температура, индекс цветопередачи и глубина мерцания.
    Для расслабления цвет лучше тёплый (2700-3000К), для работы более холодный (4000-5000К). Но тут всё индивидуально.
    Индекс цветопередачи - чем выше, тем лучше (но китайцы сильно обманывают с ним).
    Глубина мерцания - в идеале - 0.

    Лампы накаливания (лучше галогенки): "цвет" тёплый, индекс цветопередачи близок к 100%, мерцают процентов на 20-25.
    С остальными всё гораздо хуже, так как сильно зависит от производителя и даже конкретных ламп.
    Компактные люминесцентные лампы бывают любой температуры, а вот индекс цветопередачи выше 80% не встречал. Мерцание зависит от балласта. Электронный балласт даже у китайских ламп обычно даёт мерцание меньше, чем у лампы накаливания, а вот электромагнитный, как у многих U-образных настольных ламп - 50%.
    Светодиоды тоже формально бывают разных температур, но на деле это синий светодиод с жёлтым люминофором. Как следствие - низкий коэффициент цветопередачи. Мерцание зависит от конкретного экземпляра. Даже у одного производителя могут быть абсолютно разные модели от тех что совсем не мерцают до тех что выпрямляют переменный ток на самих осветительных светодиодах и пол-периода светят, а пол-периода - нет.

    Лично я предпочитаю линейные люминесцентные лампы 4000К с индексом цветопередачи >90% и качественным ЭПРА с глубиной мерцания < 3%.
    Ответ написан
    Комментировать
  • Где взять медную пластину для увеличения площади радиатора на ЦП и Чипсет в неттопе?

    SHVV
    @SHVV
    Может стоит посмотреть на пунктах приёма цвет-мета? Теоретически там могут быть обрезки медной шины.
    Ответ написан
    2 комментария
  • Как тестировать приватные методы у классов со сложным поведением?

    SHVV
    @SHVV
    Мы по этому поводу не паримся - тестовые классы у нас просто в друзьях у тестируемого. Так что для них все внутренности доступны.
    Ответ написан
    3 комментария
  • Как проверить скорость выполнения кода на C++?

    SHVV
    @SHVV
    В институте использовали ассемблерную команду "rdtsc", она возвращает количество тактов с момента включения комьютера. Под win достаточно использовать QueryPerformanceCounter, как уже посоветовали, она внутри тоже испульзует "rdtsc".
    Ответ написан
    Комментировать
  • Каким образом в современных играх реализована настройка модели персонажа?

    SHVV
    @SHVV
    Я голосую за морфинг между несколькими заранее заготовленными модельками. UV координаты при этом должны быть у всех одинаковыми.
    Ответ написан
  • Бывает ли в продаже дешевая 3d камера?

    SHVV
    @SHVV
    Самый простой вариант - обычная веб-камера + ИК подсветка к ней. Уровень освещения будет примерно обратно пропорционален квадрату расстояния.
    Ответ написан
    3 комментария
  • Откуда взять 3D модели планет?

    SHVV
    @SHVV
    В Space Engine есть возможность экспортировать планеты.
    Ещё планеты поддерживат последняя версия Terragen-а, но насчёт экспорта я не уверен.
    Ответ написан
    Комментировать
  • Почему стоит заниматься 3D графикой?

    SHVV
    @SHVV
    Сам одно время подрабатывал 3Д графикой в рекламе и дизайне интерьеров. Брат до сих пор фрилансит в дизайне интерьеров. На жизнь хватит, но золотых гор не будет, разве что открыть свой бизнес в этой сфере. Есть ещё перспективы в гейм-деве и кинопроизводстве, но там спрос меньше, а требуемый уровень выше.
    Ответ написан
    Комментировать
  • Как эмулировать нажатие мышью по координатам?

    SHVV
    @SHVV
    Если пользоваться WinAPI, то для этого есть mouse_event, или более новая SendInput.
    Ответ написан
    2 комментария
  • Как расшифровать 3D фигуры в xml?

    SHVV
    @SHVV
    Это похоже на экструзию.
    То есть, рисуется 2Д фигура и выдавливается до нужной толщины.
    В вашем случае нарисован квадрат перечислением 2Д координат его вершин (x, y):
    <segments>
            <line>0.000, 0.000</line>
            <line>0.000, 0.001</line>
            <line>0.001, 0.001</line>
            <line>0.001, 0.000</line>
    </segments>

    И этому квадрату задана толщина (высота в 3Д):
    <shape thickness="0.018">
    И в конечном итоге всё это оттрансформированно матрицей преобразования:
    <matrix>
            0.000000000000003, 0.000000000000005, -0.055555555555555, -1.999500000000000, 
            0.000000000000000, -1.000000000000000, 0.000000000000000, -1.498750000000000, 
            -1.000000000000000, 0.000000000000000, 0.000000000000000, -1.998750000000000, 
            0.000000000000000, 0.000000000000000, 0.000000000000000, 1.000000000000000
    </matrix>

    Тут, если посмотреть внимательнее, правая колонка - сдвиг, а по диагонали - масштаб каждой из осей. Но в общем случае там ещё может быть и поворот.
    Ответ написан
    Комментировать
  • На чем написать 3D проектировщик?

    SHVV
    @SHVV
    Может всё-таки стоит посмотреть в сторону флеша? Он пока вроде более распространён, чем WebGL.
    Ответ написан
  • Как найти все точки проникновения/контакта двух боксов (прямоугольных параллелепипедов), зная координаты их вершин?

    SHVV
    @SHVV
    Думаю, вам стоит взять готовый опенсорсный движок и посмотреть, как опытные люди это делают.

    За основу всех более-менее сложных алгоритмов поиска пересечения выпуклых многогранников берётся "Теорема о разделяющей оси". Суть проста: если проекции многогранников на какую-нибудь прямую не пересекаются, то они не пересекаются в пространстве. Если такой оси нет, то пересекаются. Как таковых конечных точек пересечения у них при этом не будет, будет целый многогранник этих пересечений. Но для физического движка нужно выделить некоторое количество характерных точек и этот выбор будет зависеть от той оси, которую вы сами выберете. В большинстве случаев такой осью выбирают прямую, на которой пересечение проекций минимально.

    Какие оси надо проверять? Ведь их бесконечное количество.
    Это зависит от топологии. В общем случае достаточно проверять оси коллениарные нормалям всех граней многогранников (в этом случае мы ищем пересечение с гранью), и оси полученные векторным произведением каждого ребра одного многогранника с каждым ребром другого (пересечение ребро - ребро). Но, так как у Бокса очень много параллельниых граней и рёбер, то все их проверять нет смысла. Так как получится куча одинаковых осей.
    Итого получается, что нужно проверить 3 + 3 (грани) + 3 * 3 (пары рёбер) = 15 потенциальных разделяющих осей. В первом случае, необходимо потом будет найти пересечение грани с вершинами, и из тех вершин, что пересекают плоскость построить многоугольник и пересечь его уже в 2Д, получив от 1-й до 6-ти точек пересечения. Во втором случае ещё проще - ищем точку пересечения двух векторов.

    ПС: Лучше начинать собственный движок с более простых фигур - сфер и касюлей. У них функция пересечения на пару порядков проще.
    Ответ написан
    Комментировать
  • Xeon e3 1230v3 на asus h87 plus будет работать?

    SHVV
    @SHVV
    Список совместимых процессоров для вашей платы.
    Как видите, Xeon E3-1230 V3 там указан. Но поскольку материнка не серверная, то часть функций процессора будет недоступна.
    Сам присматриваюсь к этому процессору для апгрейда десктопа, на форумах и отзывах пишут, что для некоторых материнских плат требуется обновление БИОС-а, чтобы Xeon на них завёлся. Так что может понадобится какая-нибудь "затычка для сокета" для этого.
    Ответ написан
    Комментировать
  • Как используя функцию EnumWindows найти требуемое окно, после нажать в этом окне кнопку "ОК"?

    SHVV
    @SHVV
    Если окно появляется всегда в одном и том же положении, то можно просто тыкать мышкой в нужных координатах. Как-то так:
    #include "windows.h"
    void set_event(int a_x, int a_y, int a_btn)
    {
      // Перемещаем мышку в абсолютных координатах
      DWORD flags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
    
      // Устанавливаем флаги для нажатия/отпускания кнопки мыши
      switch (a_btn) {
        case 1: {
          flags |= MOUSEEVENTF_LEFTDOWN;
          break;
        }
    
        case 2: {
          flags |= MOUSEEVENTF_LEFTUP;
          break;
        }
      }
    
      // Получаем размер рабочего стола, чтобы получить нормализованные координаты
      RECT full_rect;
      GetWindowRect(GetDesktopWindow(), &full_rect);
    
      // Нормализуем координаты
      LONG x = (LONG)(a_x*(65535.0f/(full_rect.right - full_rect.left - 1)));
      LONG y = (LONG)(a_y*(65535.0f/(full_rect.bottom - full_rect.top - 1)));
    
      INPUT input;
      memset(&input, 0, sizeof(INPUT));
      input.type = INPUT_MOUSE;
      input.mi.dwFlags = flags;
      input.mi.dx = x;
      input.mi.dy = y;
    
      // Посылаем событие мыши
      SendInput(1, &input, sizeof(INPUT));
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      // Координаты, по которым тыкаем
      int x = 1160;
      int y = 640;
      // Сначала перемещаем мышку
      set_event(x, y, 0);
      // Потом нажимаем левую кнопку
      set_event(x, y, 1);
      // И, наконец, отпускаем
      set_event(x, y, 2);
    
      return 0;
    }

    У меня этот вариант работает.

    Если нужен более стабильный подход, то можно использовать EnumWindows, так как FindWindow вроде как не будет работать с окнами другого процесса. Используется он просто:
    BOOL CALLBACK enum_wnd_proc(HWND hwnd, LPARAM lParam)
    // hwnd - окно, которое надо проверить
    // lParam пользовательский параметр, передаваемый в функцию. Я через него свойства искомого окна передаю
    {
      WindowInfo* window_info = (WindowInfo*)lParam;
    
      // Тут идут проверки нужных свойств, если они не проходят, надо вернуть TRUE
    
      // Если все проверки прошли, сохраняем текущий хэндл окна в передаваемой структуре и возвращаем FALSE
      window_info->m_hwnd = hwnd;
      return FALSE;
    }
    
    // Это для окон верхнего уровня
    if (EnumWindows(enum_wnd_proc, (LPARAM)(&window_info)) == TRUE) {
      // Окно найдено
      // window_info->m_hwnd;  <-- это родительское окно
      // Дальше ищем дочернее окно аналогично, но с помощью 
      WindowInfo window_info_2;
      EnumChildWindows(window_info->m_hwnd, enum_wnd_proc, (LPARAM)(&window_info_2));
      // window_info_2.m_hwnd <-- это дочернее окно
    }

    Что можно проверять?
    Для окна верхнего уровня - название процесса (GetWindowThreadProcessId, OpenProcess, EnumProcessModules, GetModuleBaseName).
    Для всех окон - заголовок (GetWindowText), класс (GetClassName), конкретные значения можно найти в Spy++. Для вашей задачи должно быть достаточно.
    Нажимать кнопку уже можно либо как выше написал, либо:
    l_param = x | (y << 16);
    ::PostMessage(hwnd, WM_MOUSEMOVE, 0, l_param);
    ::PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, l_param);
    ::PostMessage(hwnd, WM_LBUTTONUP, 0, l_param);
    Ответ написан
    2 комментария
  • Динамические текстуры в Three.JS

    SHVV
    @SHVV
    Самый простой вариант - накладывать несколько текстур по маске. То есть, нужен шейдер, который будет микшировать несколько текстур в зависимости от одной управляющей. В этом случае управляющая текстура с масками должна быть уникальной для всей карты, а остальные текстуры могут повторяться произвольное количество раз.
    Тут неплохая статья по микшированию текстур ландшафта в Юнити. Основы шейдеров должны быть одинаковыми и для ThreeJS.
    Ответ написан
    Комментировать