Название: Веса и разбивка Отправлено: Igors от Ноябрь 10, 2014, 11:29 Добрый день
Есть треугольник ABC, известны его вершины в пр-ве. Также в каждой вершине записаны значения атрибута, напр цвет. Требуется интерполировать цвет в точке P внутри тр-ка. Это делается так (псевдокод) Код Др словами подаются веса вершин, достаточно 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 - точка): Вычислений уже немало, а будет еще больше - ведь есть еще z, да и x0, y0, z0 придется еще посчитать. И это всего лишь принадлежность точки. Работать "по весам" (barycentric) куда приятнее, напр если один из весов = 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 - ... - ...) Не понял абстракцию "(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) остается тем же. Ну а дальше все очевидно |