Задать вопрос
  • Как сделать плавный переход высот в шуме перлина?

    wataru
    @wataru Куратор тега Алгоритмы
    Yatagarashy, Раз ваш второй вопрос (про структуры) сюда сдублировали, отвечу тут:
    Чтобы генерировать структуры, надо сначала сгенерировать ландшафт. Возможно несколько соседних чанков тоже (по размеру структуры). Потом среди них посмотреть, в каких точках структура может теоретически быть (перепад высот, биом и т.д). Потом надо какой-то другой шум взять в качестве случайной величины и с заданной вероятностью решить, в каких точках структуры генерируются. Потом остается только аккуратно их впендюрить.

    В качестве случайной величины можно, например, взять какой-то шум. С резкими перепадами высот, чтобы структуры рядом не спавнились. Надо считать, что стурктура ставится там, где этот шум имеет достаточно большое значение (если все условия для возможности спавна выполняются).

    Трюк генерации в следующем: научитесь генерировать какбы всю карту целиком, без разбития на чанки. Эта генерация будет в несколько проходов. Сгенерили высоту, биом, разлили воду, растительность, структуры. И вот когда вам надо разбить генерацию на чанки, чтобы сгенерировать вот этот вот чанк на этапе N, вам надо его и все соседние сгенерировать до этапа N-1. Причем эти соседние чанки могут быть за границей видимости и не требовать генерации по всем этапам. Тут надо все лениво генерировать и кешировать.

    Чем больше у вас структуры, тем больше чанков надо генерировать вокруг локации.
  • Как можно получить карту мира ввиде одного или нескольких изображений с максимальной детализацией?

    wataru
    @wataru
    Карта всего мира с такой детализацией будет занимать, наверно, сотни гигабайт. Это будет очень много изображений.
  • Как разделить mesh на отдельные сегменты?

    wataru
    @wataru Куратор тега C++
    Quark, Да, ребра придется считать самостоятельно. Но это просто.

    У вас же есть список троек, опысывающих треугольники номерами точек? Вот вы привели в пример треугольник {0,1,2}. Точно должны быть треугольники {1, 0, a}, {2, 1, b}, и {0, 2, c} (порядок точек может быть любым). Эти три треугольника - прямые соседи {1,2,0} - ведь они делят с ним стороны. Вам надо найти треугольник с такой же парой точек. Можно было бы тупо пройтись по всему списку треугольников и сравнить стороны, но это медлено. Но подумайте, эта задача практически идентична такой: Дан массив с числами. Каждое число встречается ровно 2 раза. Найдите пары индексов с одинаковыми числами. Только в вашей задаче чисел по три и совпадают они парами.
    Понятно, как быстро решать простую задачу. Или отсортировать массив с индексами, или использовать hash_map. Вам надо просто для каждого числа знать, где оно раньше встречалось. Если оно ее не встречалось - запомните его индекс. Если встречалось - то вот вы нашли пару индексов (текущий и запомненый ранее). Для этого можно использовать hash_map.

    Вот у вас будет структура: map из пары int в int. По двум номерам точек оно будет выдавать номер треугольника с такой стороной.

    Пройдитесь по списку треугольников один раз. Возьмите все 3 стороны. Если в мапе эта пара точек как ключ еще не лежит, то кладите map[{v1, v2}] = triangle_id. Если там уже что-то лежит, то вот оно является соседом текущего треугольника по стороне. Добавьте в списки смежности этих треугольников друг друга. Не забудьте только номера точек перед использованием в качестве ключа отсортировать, а то может в соседнем треугольнике они в другом порядке идут.
  • Как разделить mesh на отдельные сегменты?

    wataru
    @wataru Куратор тега C++
    Quark, для построения графа и нужны всякие структуры данных. Или мап из пары интов в инт (по стороне треугольника хранить его номер), или список трекгольников для каждой точки.

    Вот есть у вас треугольник {0,1,2} - запомнили, что точка 0 связана с первым треугольником. Допустим, десятый треугольник {1, 33, 0}. Он тоже попадет в список для точки 0. А дальше суть в том, что вы не храните граф, но там, где надо посмотреть всех соседей данной вершины графа (ака треугольник), вы смотрите все треугольники, пересекающиеся с текущим по углу. И когда вы будете искать соседей первого треугольника вы из списка точки 0 найдете десятый треугольник.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr, Зависит от данных. Если хотите более пологую кривую, то можно добавить новых точек между ключевыми, скажем, по линейной интерполяции. Будет полином более высокой степени. Так сказать, прибейте кривую гвоздями чтобы сделать более пологой.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr, а, нет. Я вас не понял. Вам нужно a менять от минимальной до максимальной координаты в xarray.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr,
    Подскажите, получится это реализовать ограничением xt и yt диапазоном между минимальным и максимальным значением в xArray и yArray?


    Да.

    То есть распределяем 100 точек по нужным координатам, соединяем их и получаем нужную кривую.

    Всмысле, у вас в массиве xarray 100 точек? Тогда никакая интерполяция вам не нужна - стройте ломанную по этим точкам. Вот если вы хотите провести через ключевые точки гладкую кривую, то вот тут интерполяция уже нужна. Но тогда вы координаты этой кривой считаете и в других точках, между ключевыми. Чем больше вспомогательных точек (меньше шаг по a), тем точнее и глаже будет график.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr,
    но общая картина остаётся неверной
    В смысле - не верной? Она верная. Такая полиномиальная кривая обязательно на бесконечности x уйдет в бесконечность по y. Полиномы Лагранжа лишь гарантируют, что кривая пройдет через ключевые точки. А дальше она может идти как угодно.

    Если вам надо, чтобы ваша кривая была более менее пологая везде, то полиномиальная интерполяция вам не подходит. Или надо смотреть на кривую только от первой до последней точки. За ними продолжать кривую нельзя.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr, Тогда почему вы работаете только с x до 100, если точка, через которую кривая должна пройти, имеет координату 106?

    И вообще, циклы у вас странные. Почему-то от 0, хотя в паскале (это же паскаль?) индексация вроде как с 1 была. Судя по графику, похоже, что последняя точка тупо не учитывается у вас почему-то. А в остальном все правильно - кривая проходит через нужные точки.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr, xt должно быть просто a. Ну и в уравнении, где p домножаете, тоже просто a должно быть, а не a/100.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr, Нет. Все разности в p остаются xArray. Но потом надо будет p домножить на yarray[i]. И вот это вот прибавить к yt. Внутри цикла по i. А вот xt вычисляется в цикле по a.

    Подумайте сами, вот эта вот формула (t-t[j])(t[i]-t[j]) дает 1 при t=t[i] и 0 для t равных другим индексам. Значит, если ее брать в качестве множителя перед значением точки i, то при x равном xarray[i], именно эта точка возьмется с множителем 1, а все остальные возьмутся с множителем 0.

    Т.е. Цикл по a (он же по x), цикл по i, внутри считаем формулу лагранжа для всех j != i. После цикла по j это домножаем на y[i] и суммируем.
  • Как нарисовать кривую Лагранжа через полином?

    wataru
    @wataru Куратор тега Математика
    EvgenyApMr,
    Тогда вам надо xt делать a. При вычислении p надо домножать на yArray[i], а не x. Все p в цикле по i надо будет просуммировать - это и будет значение yt.
  • Как найти угол между двумя точками?

    wataru
    @wataru
    max_haker, между двумя точками существует бесконечно много углов. Угол описывается вершиной и двумя лучами. Ну, или тремя точками (вершина и две точки). Что за две точки у вас заданы? Отметьте их на картинке.
  • Как достать из браузера куки?

    wataru
    @wataru Куратор тега C++
    rPman, куки? Я в файерфоксе никаких паролей не ввожу, а сайты все меня помнят. То же и с хромом. Вылогинивание из гуглового аккаунта не стирает куки сайтов. Может быть, сохраненные пароли еще и зашифрованы как-то, но по-моему и этого нет.
  • Почему при передаче имени файла как аргумент функции я не могу его открыть?

    wataru
    @wataru
    KeksikProg, Советую при компиляции включить все предупреждения. Тогда вам компилятор про эту ошибку бы несколько раз ругнулся. При вызове у вас преобразование char* в char, с потерей данных. В самой функции наоборот.
  • Почему std::swap вызывает конструктор перемещения?

    wataru
    @wataru Куратор тега C++
    mayton2019, Так-то и свап с аргументами-ссылками может быть лямбдой. Правда, зачем кому-то может понадобится лямбда, меняющая местами 2 аргумента, я не могу представить. Особенно, лямбда, которая возвращает аргументы в паре. Этакий make_pair, но переставляющий элементы.
  • Почему std::swap вызывает конструктор перемещения?

    wataru
    @wataru Куратор тега C++
    mayton2019, Можно. Но это не помена значений на месте. Чтобы поменять значения, надо будет еще эту пару назад присвоить, и это будет 2 временные пересенные (в паре), вместо одной.
  • Задача на геометрию. Как быстро найти подходящую выборку элементов из матрицы?

    wataru
    @wataru Куратор тега Алгоритмы
    alex_l2005, Ну вообще оно будет чуть быстрее O(n^2.5) вместо O(n^3). Но поможет ли это - неясно. Может, тут можно 2 бинпоиска в один объединить. Дальше идут какие-то идеи, но более быстрого решения я пока не придумал.

    Вот перебрали вы время в ответе. Построили окружности - куда можно с каждой точки дойти за это время.
    Каждая такая окружность пересекает окружность R по отрезку. Построили вы n таких отрезков. Также разбейте окружность на n интервалов, в каждом из которых должна быть вершина многоугольника.

    Если какой-то 1/n интервал целиком покрыт окружностью из изначальной точки, то вот этот жук вот до этой вершины мноугольника доедет с любым углом. Если же отрезок покрыт не целиком, то взяв это ребро, вы наложите ограничение на угол - он должен быть в пересечении отрезка пересечения окружностей и 1/n дуги. Может, сдвинув все отрезки в одну дугу 1/n окружности, попересекая все со всем, вы найдете O(n) возможных углов, в каждом из которых есть только какие-то дуги.

    Вообще, можно подумать, а в каком случае что-то в ответе меняется. Если чуть чуть поуменьшать/поувеличивать время в ответе, то пересечения с окружностью радиуса R тоже чуть-чуть сожмуться, разожмутся. И что-то принципиально поменяется только когда 2 отрезка на окружности станут пересекаться, или какой-то отрезок зайдет на нувую 1/n дуги.

    Соответственно, вы можете найти все O(n*n) интересных расстояний, потом обработать из все в порядке увеличения. И там, каждый раз добавляются какие-то ребра в двудольный граф. Ну надо поискать, а нет ли удлиняющей цепи вот через эти, добавляемые ребра.
  • Почему Config::search у меня возвращает мусор?

    wataru
    @wataru Куратор тега C++
    Acaunt, и тут вы его нигде не выводите же.

    Предполагаю, что вы там тоже без скобок написали. Тогда вы выводили бы адрес функции, а адреса cout выводит в 16-ричном виде.
  • Почему Config::search у меня возвращает мусор?

    wataru
    @wataru Куратор тега C++
    Acaunt, ах да, size - это метод. Его надо вызывать. Поставьте там скобки в lot_list.