Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > "Синхронизвать/наложить" 2 поверхности |
Автор: kjf03 12.3.2012, 16:53 |
Здравствуйте. -------------------------------------------------- Есть кривая в 3 мерном измерении (оси x y z), кривая построена прямыми отрезками (есть координаты начала и конца отрезка), причем координата z = const. Есть плоскость изогнутая по оси Z, в 3 мерном измерении, причем информация о точках поскости есть с шагом s=10 по по осям x и y. -------------------------------------------------- Или условие другими словами: --- есть массив отрезвокв {x0,y0,z0 x1,y1,z1 x2,y2,z2 ... xn,yn,zn}, причем z0..n=const --- есть массив точек принадлежащих кривой проскости {p_x0,p_y0,p_z0; p_x0+1*s,p_y0+1*s,p_z1; p_x0+2*s,p_y2+2*s,p_z2 ... p_x0+n*s,p_yn+n*s,p_zn p_x1,p_y0,p_z0; p_x1+1*s,p_y0+1*s,p_z1; p_x1+2*s,p_y2+2*s,p_z2 ... p_x1+n*s,p_yn+n*s,p_zn ... p_xm,p_y0,p_z0; p_xm+1*s,p_y0+1*s,p_z1; p_xm+2*s,p_y2+2*s,p_z2 ... p_xm+n*s,p_yn+n*s,p_zn }, причем z0..n не равно const -------------------------------------------------- Отрезки проецируется на кривую по плоскость, каким образом теперь получить массив отрезков полученных на кривой плоскости, при этом считая что кривая плоскость состоит из идеально плоских квадратов с координатами вершин из массива кривой плоскости. Может есть готовый алгорим, а то велосипед не охота заново изобретать? |
Автор: Mirkes 12.3.2012, 18:01 |
Если я правильно понял (количесво опечаток впечатляет и сильно затрудняет понимание) то есть некая ломанная в плоскости z=const и поверхность заданная координатами (x[i],y[j],z[i,j], x[i]=x[0]+s*i, y[j]=y[0]+s*j, z[i,j] - произвольно заданные значения) требуется найти проекцию ломанной на поверхность. Прежде чем решать эту задачу необходимо определить о какой проекции идет речь. Возможые варианты: 1. Центральная проекция (есть лампа, расположенная в определенном мессте, а проекцией служит тень от ломанной). На этот вариант наводит солнышко на картинке 2. Проекция вдоль оси z. На этот вариант наводит изображение направления проецирования. 3. По наименьшему расстоянию. Для каждого из этих вариантов есть свои методы. Определитесь, чего вы хотите. Кстати, такого рода проекции часто используются в играх, так что есть смысл спросить в соответсвующем разделе. |
Автор: kjf03 12.3.2012, 18:28 |
Спасибо за уточнение задачи. 2)Проекция вдоль оси Z. |
Автор: _Y_ 12.3.2012, 20:29 |
Боюсь что из идеальных квадратов может состоять только идеально плоская плоскость. ![]() Мы как-то давно обсуждали здесь описание трехмерных поверхностей. По всему выходит, что описать ее плоскими элементами можно только если использовать треугольники, форма которых не ограничена дополнительными условиями (типа равностороннести, прямоугольности и т.п.) В целом же если решать задачу в лоб, то просто строите проекцию на плоскость каждго плоского элемента, использованного для описания поверхности. Потом отбрасываете части, вышедшие за границы элемента. Но это тупо, конечно. Разумнее будет сначала найти проекцию на один какой-то элемент, а поотом идти "по цепочке" ища проекции на соседние элементы. |
Автор: kjf03 12.3.2012, 20:42 | ||||
Вы правы, уместней говорить о триангуляции. В общем, известны значения точек Z по сетке с шагом S, неровной поверхность на которую делается проекция отрезка (являющегося частью кривой на проецируемой плоскости). А говоря еще проще допустим есть у вас фото кривой, на прозрачной основе, состоящей из отрезков, есть плоскость кривая (измерить можно только значения по оси Z по сетке с шагом S). Вы выходите в ясную погоду (это для того чтобы солнце выступла в роли источника параллельных лучей) на пляж, где "паркет" неровный. В итоге на песке получается картинка отличная от фото. Как сделать подобную проекцию на программно? |
Автор: kjf03 12.3.2012, 23:20 |
Помогите пожалуйста, разве это сложная задача? |
Автор: _Y_ 13.3.2012, 11:09 | ||
Задача не особо сложная. А вот время позднее ![]() Будет двадцать минут свободных распишу как бы я подходил к проблеме. Но я не гуру особенный, просто подобные задачи решал. Может до моих свободных минут кто-то что-то действительно хорошее и предложит. |
Автор: kjf03 13.3.2012, 15:13 |
Вот пример данных. Данные о отрезках хранятся в текстовом файле в следующем виде: ... X1.27127 Y3.73310 Z0.00000 X1.41238 Y3.73310 Z0.00000 X3.10571 Y3.73310 Z0.00000 X3.24683 Y3.73310 Z0.00000 ... Данне о точках по сетке хранятся в текстовом файле в следующем виде: ... X0.00000 Y0.00000 Z3.73310 X10.00000 Y0.00000 Z3.10571 X20.00000 Y0.00000 Z3.73310 ... X0.00000 Y0.00000 Z3.44310 X0.00000 Y10.00000 Z3.50571 X0.00000 Y20.00000 Z3.9301 ... |
Автор: Mirkes 13.3.2012, 18:24 |
Параллельное оси Z проецирование очень просто. Если координаты исходной вершины ломаной равны (X,Y,z), то координаты проекции будут (X,Y,z1). По этому правилу можно определить проекции всех вершин ломанной. Если вершины ломанной (X1,Y1),(X2,Y2),...,(Xn,Yn), то их проекции на "кривую" плоскость будут такими же. После этого необходимо определить координаты решетки в которые попали вершины ломанной. xi=((xi-x0)/s)*s+x0. (деление целочисленное, s-шаг решетки, x0 - координата первой вершины РЕШЕТКИ). yi=((yi-y0)/s)*s+y0. (деление целочисленное, s-шаг решетки, y0 - координата первой вершины РЕШЕТКИ). Получаем ячейку решетки (xi,yi),(xi,Yi+s),(xi+s,yi),(xi+s,yi+s) Теперь необходимо дополнить список вершин ломанной точками пересечения ребер ломаной с ребрами решетки. (см. рис.) После этого остается рассчитать координату Z для нового списка вершин ломаной. Для каждой вершины (Xi,Yi) мы имеем координаты ячейки решетки которой принадлежит эта вершина: (xi,yi,zi1),(xi,Yi+s,zi2),(xi+s,yi,zi3),(xi+s,yi+s,zi4). Поскольку Вы предложили считать ячейку идеально плоским квадратом (что крайне сомнительно, но да хозяин - барин), аглоритм рассчета Zi достаточно прост: Z(Xi,yi+s)=(zi4-zi2)*(Xi-xi)/s+zi2 Z(Xi,yi) =(z34-zi1)*(Xi-xi)/s+zi1 Zi=Z(Xi,Yi)=(Z(Xi,yi+s)-Z(Xi,yi))*(Yi-yi)/s+Z(Xi,yi) по этим формулам можно вычислить координату Z для всех вершин ломанной на "кривой" плоскости. |
Автор: _Y_ 13.3.2012, 22:53 |
О! К этому осталось только добавить, что, как уже говорилоось, плоские квадраты лучше заменить треугольниками. Проще всего каждый квадрат заменить четырьмя треугольниками с дополнительной усредненной опорной точкой в центре квадрата: Каждый квадрат с координатами углов (обходя квадрат по кругу) (X1,Y1,Z1), (X1,Y2,Z2), (X2,Y2,Z3), (X2,Y1,Z4) заменяем треугольниками (X1,Y1,Z1), (X1,Y2,Z2), (x,y,z) (X1,Y2,Z2), (X2,Y2,Z3), (x,y,z) (X2,Y2,Z3), (X2,Y1,Z4), (x,y,z) (X2,Y1,Z4), (x,y,z), (X1,Y1,Z1) где x = (X1+X2)/2 y = (Y1+Y2)/2 z = (Z1+Z2+Z3+Z4)/4 .................................... Впрочем, если поверхность кривляется не очень сильно, а другие размерности системы велики по сравнению с кривляниями, то можно, наверное и квадратами. Но тогда придется брать допущение, что между квадратами возможны ступеньки, на которые проекция не приходится: рванная такая по оси Z проекция. И квадрат описывать как (X1,Y1,z), (X1,Y2,z), (X2,Y2,z), (X2,Y1,z) где, как и в предидущем случае, z = (Z1+Z2+Z3+Z4)/4 |
Автор: Mirkes 14.3.2012, 09:20 |
Вариант с заменой квадрата на четыре треугольника заведомо предпочтительней. В предложенном мной алгоритме нужно будет определять не квадрат а треугольник (точнее в определенном квадрате брать треугольник). Вычисления проводятся по аналогичным формулам исходя из подобия. Но я думаю в этой ситуации автор задачи должен решить, с чем он будет работать. |
Автор: kjf03 15.3.2012, 14:27 |
ок, благодарю сейчас буду реализовывать... |