Конференция "Игры" » FloodFill и OpenGL [Delphi, Windows]
 
  • Pa6ha (20.03.08 23:07) [0]
    Вечер добрый.

    Затруднился куда обратится с данным вопросом. Мне нужно запрогать один алгоритм, а поскольку игры подразумевают это... Вобщем.

    Допустим у меня есть набор точек, которые если соединить последовательно, то получится какая-либо фигура. Допустим, у меня есть контуры домов для карты. Задача состоит в заполнении данной фигуры цветом (т.е. допустим требуется нарисовать желтый дом на зеленом газоне). Поскольку "карта" будет большая и полигонов будет много, то я хочу прикрутить  к этому делу вбо. Следовательно надо преобразовать данные контуры в полигоны. Я могу придумать алгоритм и запрограммировать, но не хочется писать велосипед, если его уже кто-то написал.
  • Sergio666 © (21.03.08 09:36) [1]
    Если можешь - напиши свой. Будет понятнее
  • Pa6ha (21.03.08 15:54) [2]
    да блин, свой - оно конечно хорошо, но времени заниматься этими велосипедами нет.
  • Sapersky (21.03.08 16:22) [3]
  • Pa6ha (13.07.08 15:49) [4]
    Sapersky, спасибо, разобрался, написал :)

    Сессия была, работа, все дела, вот руки опять дошли. Продолжаем :)

    У нас есть карта большого города. Она представлена большим количеством домов и других объектов типа улиц и т.п. Полигонов достаточно много, естественно, все рисовать нереально. Как лучше разбить карту и представить данные? Можно все разбить на квадраты и каждому квадрату привязать дома, которые в него попадают. Можно использовать bounding circles по аналогии с bounding spheres :) Вопросы не сложные, но сейчас боюсь ошибиться. Неохота потом все переделывать.
  • Renegat (13.07.08 15:56) [5]
    > Можно использовать bounding circles

    Кругами какого бы то ни было радиуса (пусть даже -> 0) невозможно заполнить какую бы то ни было плоскость целиком. Юзайте квадраты. Или на крайняк шестиугольники =)
  • Renegat (13.07.08 15:56) [6]
    > невозможно заполнить какую бы то ни было плоскость целиком

    Если исключить наложение, конечно же.
  • Pa6ha (15.07.08 22:05) [7]
    Ладно, я подумаю об этом завтра :)

    Сейчас ещё засада. Дороги в мапинфо - это палочки, которым заданы 2 координаты: начало и конец. Отрезки т.е. Надо их сделать толстыми. Если просто все линии сделать толстыми, то они будут неправильно соединяться, с трещинами. Щас будем думать. Мат. аппарат мож где уже описан? :)
  • Renegat (16.07.08 13:52) [8]
    > Щас будем думать. Мат. аппарат мож где уже описан? :)

    У меня подобное есть. Только для замкнутых кривых Безье... там придётся столько напильником обрабатывать, что проще написать заново.
    Короче, основная идея такова:
    Дана ломаная, состоящая из двух отрезков. В простейшем случае, предполагается, что "ширина дороги" меньше, чем удвоенная наименьшая из ломаных (иначе, придётся идти на ухищрения, такие как пропуск вершины, расчёт ближайшего пересечения, и прочее, пока на этом не заостряемся). План действий следующий:

    1) Находим угол между отрезками.
    2) Складываем их как векторы, выходящие из одной точки, и проставляем результирующему вектору длину, равную |K| = L/2sin(0.5Ф), где L - ширина дороги, Ф - угол между отрезками.
    3) Мы получили первую, "внутреннюю" точку дороги. Ищем внешнюю:
    4) Строим из точки пересечения два отрезка длины 0.5L, соотв. перпендикулярных данным.
    5) По желанию, между ними провешиваем окружность. Если этого не требуется, соединяем так.
  • Renegat (16.07.08 13:54) [9]
    > между ними провешиваем окружность

    Круговой сектор, извиняюсь. Целиком окружность жирновато будет =)
  • Renegat (16.07.08 13:55) [10]
    ...или дугу, если рисуем линиями.
  • Pa6ha (16.07.08 18:16) [11]
    Седня попробую, доложу о результатах )
  • @!!ex © (16.07.08 18:50) [12]
    > [8] Renegat   (16.07.08 13:52)

    От это извращение...
    А почему бы просто не рисовать линии полигонами?
  • Renegat © (16.07.08 18:55) [13]
    > [12] @!!ex ©   (16.07.08 18:50)

    Как, например?
  • @!!ex © (16.07.08 20:01) [14]
    > [13] Renegat ©   (16.07.08 18:55)

    ну вообще линия это два треугольника...
    Соответственно ничего не мешает края треугольников состыковать.

    Конечно это придется считать построение треугольников...
    Однако это все равно делается на уровне драйвера.

    P.S.
    В вашем методе достаточно всегда на стыку рисовать сглаженную точку.
  • Renegat © (16.07.08 20:10) [15]
    Линия - это суть спрайт. А если карту придётся вертеть? Я не думаю, что когда дороги "встанут на дыбы", стремясь быть повёрнутыми к наблюдателю, и частично пропадут "под землёй", это будет очень уж хорошо выглядеть :)
  • Renegat © (16.07.08 20:11) [16]
    Поэтому я и предлагаю такие извращения))
 
Конференция "Игры" » FloodFill и OpenGL [Delphi, Windows]
Есть новые Нет новых   [134430   +2][b:0][p:0.001]