Заполнение треугольника в виде RGB массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Заполнение треугольника в виде RGB массива

Сообщение d3drm » 15.03.2005 (Вт) 2:03

У меня есть массив, который представляет из себя прямоугольное изображение. Есть три точки, образующие треугольник в этом массиве (т.е. точка состоит из x,y - координат в этом массиве). Как мне закрасить весь треугольник в этом массиве?
ХЎ

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 15.03.2005 (Вт) 4:04

Перебираешь все точки, и проверяешь их на принадлежность треугольнику (который задаешь координатами вершин).
Алгоритм проверки наличия точки треугольнику есть, например тут:
http://algolist.manual.ru/maths/geom/belong/poly2d.php
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 15.03.2005 (Вт) 4:06

Эх... Как всегда, разобрался сам...

Ну и как всегда выкладываю код тем, кто может напороться на подобную проблему.

Код: Выделить всё
Private Sub DrawTriOnArray(x0, y0, x1, y1, x2, y2)

    Dim dxy_left As Single, dxy_right As Single
    Dim xs As Single, xe As Single

    If x1 > x2 Then
        dxy_left = (x2 - x0) / (y2 - y0)
        dxy_right = (x1 - x0) / (y1 - y0)
    Else
        dxy_left = (x1 - x0) / (y1 - y0)
        dxy_right = (x2 - x0) / (y2 - y0)
    End If
   
    xs = x0: xe = x0
   
    Dim i As Integer, j As Integer
    For i = y0 To y2
        For j = xs To xe
            pic.PSet (j, i)
        Next j
        xs = xs + dxy_left
        xe = xe + dxy_right
    Next i
End Sub



Но только этот код заполняет треугольники с плоским нижним ребром (x1=x2), как переделать для любого треугольника думаю труда не составит.
ХЎ

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 15.03.2005 (Вт) 4:07

SHURUP писал(а):Перебираешь все точки, и проверяешь их на принадлежность треугольнику (который задаешь координатами вершин).
Алгоритм проверки наличия точки треугольнику есть, например тут:
http://algolist.manual.ru/maths/geom/belong/poly2d.php


Слишком медленный способ. Мне это нужно делать в цикле, так что нужно максимально оптимизировать. Мой код тоже далек от идеала, там вычисления с плавающей точкой, нужно заменить на целочисленные координаты, будет работать раза в 2-3 быстрее.
ХЎ


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 147

    TopList