Всю математику забыл, может кто подскажет.
Пишу скрип, генерирующий градиент из трех компонентов для 3Д-принтера. Нужно сгенерировать градиент допустим от 100-0-0 до 0-0-100. Сумма трех компонентов всегда 100. Пытаюсь понять математически.
Дано: есть две точки в трехмерном пространтсве, сумма координат всегда 100.
Нужно провести линию между ними, условие сумма координат всегда 100 сохраняется.
Какова формула? Есть тут однозначное решение или нет?
Просто (1-t)*a+t*b.
Сумма по всем координатам (1-t)*a будет равна (1-t)*100, сумма по всем координатам t*b будет равна t*100. Соответственно, сумма по всем координатам их суммы будет равна 100.
Вообще все допустимые точки описываются уравнением x+y+z=100, это уравнение плоскости; данная плоскость однозначно задаётся точками (100,0,0), (0,100,0) и (0,0,100). В целом любой путь по этой плоскости будут удовлетворять заданным ограничениями, но (1-t)*a+t*b это, очевидно, самый короткий путь. Но если в градиент хочется добавить третью точку, то от этого пути можно отклониться, например, с помощью каких-нибудь сплайнов; так как мы работаем по сути в плоскости с минимальными ограничениями, то тут миллионы всяких возможных решений.
Спасибо! Пока что формул не понял, но если это плоскость, то прямая между точками находится в этой плоскости, что уже хорошо.
Цитата: kemerover от сентября 18, 2022, 13:17Просто (1-t)*a+t*b.
Можете пояснить, что имеется в виду.
Конкретно у меня дано:
(x1, y1, z1) - начальная точка
(x2, y2, z2) - конечная точка
h - количество точек на прямой, находящиеся на равном расстоянии друг от друга.
Нужно найти функцию f(c), выдаст (xc, yc, zc), где с - номер точки на отрезке.
Т.е. для начальной и конечно точки f(0) = (x1, y1, z1), f(h-1) = (x2, y2, z2)
a = (x1, y1, z1)
b = (x2, y2, z2)
Умножение вектора на скаляр = умножение всех компонент вектора на скаляр.
Сложение векторов = сложение соответствующих компонент векторов.
t идёт от 0 до 1. В данном случае будут использованы t = n/(h-1) для всех целых n от 0 до h-1.
Ааа, понял, спасибо! Сейчас попробую на практике :up:
Ага, значит мои изначальные интуитивные рассчеты были правильны, зря я засомневался. Я правда пришел к ним другим путем.
По формуле (1-t)*a+t*b выходит xc=(1-t)*x1+t*x2
а если попереносить, то получится x1+t(x2-x1), что я и использую на данный момент.
Спасибо!
Цитата: RawonaM от сентября 18, 2022, 15:16Ага, значит мои изначальные интуитивные рассчеты были правильны, зря я засомневался. Я правда пришел к ним другим путем.
Спасибо!
;up:
Цитата: RawonaM от сентября 18, 2022, 15:16По формуле (1-t)*a+t*b выходит xc=(1-t)*x1+t*x2
а если попереносить, то получится x1+t(x2-x1), что я и использую на данный момент.
Да, в целом это одно и то же. Разве что есть тонкости из-за арифметики чисел с плавающей точкой, но в данном случае они не важны. Ваша формула, наверное, даже более стандартна для линейной интерполяции.