Закрашивание треугольников

Тема в разделе "WASM.GRAPHICS", создана пользователем OverMind, 3 июн 2005.

  1. OverMind

    OverMind New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    4
    Адрес:
    Nosgoth
    Имеются экранные координаты вершин - как закрасить с нанесением текстуры ( без OpenGL/DirectX )?

    Или хотя бы дайте ссылки.
     
  2. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Стандартным апи не подходит? Создаешь браш из битмапа

    и закрашиваешь треугольник (хреново выразился, но, думаю, ты понял).
     
  3. nobodi

    nobodi Сисадмин Команда форума

    Публикаций:
    0
    Регистрация:
    2 апр 2004
    Сообщения:
    35
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    OverMind



    Какой ник красивый, а подумать лень? :derisive:
     
  5. OverMind

    OverMind New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    4
    Адрес:
    Nosgoth
    ник - из старкрафта
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    OverMind



    Ну что я могу сказать... Берем треугольник, берем bounding box к нему, и, сканируя бокс решаем для каждого пикселя задачу о принадлежности точки треугольнику.
     
  7. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    делал давно так:

    1. есть три точки - по ним находим уравнения прямой (три коэффициента для каждой пары точек)

    2. далее проходим от края до края. находим недостающую координату и выводим.

    Если заинтересует могу подробней написать
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    _DEN_

    Попиксельно может получиться долго :dntknw:



    Можно попробовать так:

    1.Создать регион равный треугольнику и закрасить его структурой (сделать на основе статика и STM_SETIMAGE)

    2.Подвинуть треугольник-регион на то место, где нужно закрасить, и скопировать изображение прямоугольника, включающего регион, в memory DC.

    3.Убрать регион (сделать невидимым) и по присылаемому для вышедшего наверх из-под региона окну WM_PAINT, зарисовать его BitBlt из memoryDC.



    Создание региона, присваивание ему текстуры, позиционирование над нужным местом можно делать для невидимого региона, чтобы не мозолить глаза, и быстрее будет, а когда все готово, показать.
     
  9. Narkomanius

    Narkomanius New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2003
    Сообщения:
    144
    ТАК ПОПЕРЛИ!



    делается так

    переходим в проекционные координаты

    (X,Y,Z)->(x,y,z,w)



    как переходить - бери opengl32.hlp от борланд Ц 4.5+ и там смотри проекционные матрицы (glPerspective)

    `



    x/w, x/w z/w = координата точки =(X,Y,Z)

    U,V - координата текстуры(или компоненты цвета)

    U/w, V/w 1/w = можно интерполировать линейно - ошибка минимальна





    сперва находим самую верхнюю точку и от нее интерполируем

    X Y 1/Z (U/Z V/Z ...)

    по строкам - получим значения X1 X2 1/Z1 1/Z2 (U/Z)1 (U/Z)2 ...

    для каждой строки пикселов в многоугольнике



    далее мона прям на краях пощитать (U/Z)/(1/Z) и полученные значения линейно вдоль строки или квадратично(точность достаточная) или точно деля для каждого пикселя.
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Зачем закрашивать треугольник? Как минимум, это значит 2 раза вычислять коорлинаты граничных пикселей придётся. Сразу рисуйте закрашенный (горизонталиными линиями).
     
  11. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    а ведь заливка- это классика...

    Подойдет любой алгоритм заливки областей, если надо, могу бросить.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cresta





    НА сколько я понял, комрада интересует именно алгоритм, а не средства GDI.



    Johnikum





    Для треугольников в пол экрана это может и нормально, но когда треугольников будет пару кило и они будут по 10-100 пикселей, это слишком долго.



    Narkomanius





    Во-первых однородные, а не проекционные. А во-вторых однородные координаты ни коим образом не относятся к алготирму растеризации треугольника.



    OverMind



    Оптимизируем пост № 6 :) Каждую строку бокса будем сканировать с двух сторон, прока не найдем начальный и конечный пиксель. После того как нашли - рисуем линию.

    Искать можно кусерчем :)



    Как это сделано в современных видяхах - хрен знает. Но скорее всего граничные отрезки не строятся, потому что в wireframe видяхи работают в 2-3 раза медленнее, чем с обычной заливкой.
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Видяхи сразу рисуют треугольники текстурой, потому что рисовать границу, а потом заливать - это слишком долго.
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_







    Не совсем. Видяхи рисуют граници и растеризуют построчно.
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    с построчной растеризацией я полностью согласен, но какой смысл рисовать границу? - лишняя трата времени.