Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Igors от Ноябрь 10, 2014, 11:29



Название: Веса и разбивка
Отправлено: Igors от Ноябрь 10, 2014, 11:29
Добрый день

Есть треугольник ABC, известны его вершины в пр-ве. Также в каждой вершине записаны значения атрибута, напр цвет. Требуется интерполировать цвет в точке P внутри тр-ка. Это делается так (псевдокод)
Код
C++ (Qt)
ARGB GetColor( const Point & A, const Point & B, const Point & C,  float alpha, float beta )
{
return A.color * (1 - alpha - beta) + B.color * alpha + C.color * beta;
}
 
Др словами подаются веса вершин, достаточно 2 (alpha и beta), третий вес дополняет до 1

Но вот исходный то-к разбивается на 2 (правый рисунок). Конечно положение новой точки D известно, но вызывающий об этом ничего не знает, для него по-прежнему существует лишь вмещающий тр-к ABC и alpha и beta по-прежнему для ABC.

Как определить в какой из 2 новых тр-ков попадает точка и вычислить новые веса для этого тр-ка?

Спасибо


Название: Re: Веса и разбивка
Отправлено: __Heaven__ от Ноябрь 10, 2014, 12:25
Как определить в какой из 2 новых тр-ков попадает точка и вычислить новые веса для этого тр-ка?

считаются произведения (1, 2, 3 - вершины треугольника, 0 - точка):
(x1 - x0) * (y2 - y1) - (x2 - x1) * (y1 - y0)
(x2 - x0) * (y3 - y2) - (x3 - x2) * (y2 - y0)
(x3 - x0) * (y1 - y3) - (x1 - x3) * (y3 - y0)
Если они одинакового знака, то точка внутри треугольника, если что-то из этого - ноль, то точка лежит на стороне, иначе точка вне треугольника.

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


Название: Re: Веса и разбивка
Отправлено: Igors от Ноябрь 10, 2014, 12:47
считаются произведения (1, 2, 3 - вершины треугольника, 0 - точка):
(x1 - x0) * (y2 - y1) - (x2 - x1) * (y1 - y0)
(x2 - x0) * (y3 - y2) - (x3 - x2) * (y2 - y0)
(x3 - x0) * (y1 - y3) - (x1 - x3) * (y3 - y0)
Если они одинакового знака, то точка внутри треугольника, если что-то из этого - ноль, то точка лежит на стороне, иначе точка вне треугольника.
Вычислений уже немало, а будет еще больше - ведь есть еще z, да и x0, y0, z0 придется еще посчитать. И это всего лишь принадлежность точки. Работать "по весам" (barycentric) куда приятнее, напр если один из весов = 0, значит точка на ребре. Спрашивается как перескочить из одних весов в другие не разводя такого "месива".

Вес новой точки пусть определяет тот, кто делит треугольник. Ведь этот кто-то знает вес старых точек. Те, что остались на своих местах будут иметь прежние значения. Новая вершина вычислится по (1 - ... - ...)
Не понял абстракцию "(1 - ... - ...)"  :) Известны веса точки деления, напр для рисунка выше alpha_D = 0.2, beta_D = 0. Что дальше?   


Название: Re: Веса и разбивка
Отправлено: __Heaven__ от Ноябрь 10, 2014, 12:58
ведь есть еще z.
Отбросьте z и получите проекцию на XY. Точка все равно останется в том же треугольнике.
Если проекция является отрезком, значит можно отбросить другую координату и воспользоваться формулой выше.

С весами не работал. Правда, уже даже и не помню с чем это едят.


Название: Re: Веса и разбивка
Отправлено: Igors от Ноябрь 10, 2014, 13:09
Отбросьте z и получите проекцию на XY. Точка все равно останется в том же треугольнике.
"Хрен редьки не слаще", эта проекция может вырождаться в линию.


Название: Re: Веса и разбивка
Отправлено: __Heaven__ от Ноябрь 10, 2014, 13:24
Отбросьте z и получите проекцию на XY. Точка все равно останется в том же треугольнике.
"Хрен редьки не слаще", эта проекция может вырождаться в линию.
Если проекция является отрезком, значит можно отбросить другую координату и воспользоваться формулой выше.


Название: Re: Веса и разбивка
Отправлено: Igors от Ноябрь 10, 2014, 13:41
Если проекция является отрезком, значит можно отбросить другую координату и воспользоваться формулой выше.
Конечно можно, но Вы же сами понимаете что это непринципиально - все равно имеем немало тупых вычислений. А мне нужна скорость, хочу работать "по весам"


Название: Re: Веса и разбивка
Отправлено: Igors от Ноябрь 11, 2014, 08:26
Подумал, все прекрасно получилось. Нужно было только вывести маленькую теорему:

При разбиении ребра вес противоположной вершины остается тем же в любом из новых тр-ков. Напр в рисунка выше разбивается AB, значит вес С (beta) остается тем же.

Ну а дальше все очевидно