Russian Qt Forum
Апрель 29, 2024, 04:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Веса и разбивка  (Прочитано 5787 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Ноябрь 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 новых тр-ков попадает точка и вычислить новые веса для этого тр-ка?

Спасибо
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Ноябрь 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 - ... - ...)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 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. Что дальше?   
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Ноябрь 10, 2014, 12:58 »

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

С весами не работал. Правда, уже даже и не помню с чем это едят.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 10, 2014, 13:09 »

Отбросьте z и получите проекцию на XY. Точка все равно останется в том же треугольнике.
"Хрен редьки не слаще", эта проекция может вырождаться в линию.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Ноябрь 10, 2014, 13:24 »

Отбросьте z и получите проекцию на XY. Точка все равно останется в том же треугольнике.
"Хрен редьки не слаще", эта проекция может вырождаться в линию.
Если проекция является отрезком, значит можно отбросить другую координату и воспользоваться формулой выше.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 10, 2014, 13:41 »

Если проекция является отрезком, значит можно отбросить другую координату и воспользоваться формулой выше.
Конечно можно, но Вы же сами понимаете что это непринципиально - все равно имеем немало тупых вычислений. А мне нужна скорость, хочу работать "по весам"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 11, 2014, 08:26 »

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

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

Ну а дальше все очевидно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 22.