![]() |
|
![]() ![]() ![]() |
|
kjf03 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.7.2010 Репутация: нет Всего: нет |
Здравствуйте.
-------------------------------------------------- Есть кривая в 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 -------------------------------------------------- Отрезки проецируется на кривую по плоскость, каким образом теперь получить массив отрезков полученных на кривой плоскости, при этом считая что кривая плоскость состоит из идеально плоских квадратов с координатами вершин из массива кривой плоскости. Может есть готовый алгорим, а то велосипед не охота заново изобретать? Это сообщение отредактировал(а) kjf03 - 12.3.2012, 17:38 Присоединённый файл ( Кол-во скачиваний: 11 ) ![]() |
|||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Если я правильно понял (количесво опечаток впечатляет и сильно затрудняет понимание) то есть некая ломанная в плоскости 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. По наименьшему расстоянию. Для каждого из этих вариантов есть свои методы. Определитесь, чего вы хотите. Кстати, такого рода проекции часто используются в играх, так что есть смысл спросить в соответсвующем разделе. -------------------- Mirkes |
|||
|
||||
kjf03 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.7.2010 Репутация: нет Всего: нет |
Спасибо за уточнение задачи.
2)Проекция вдоль оси Z. Это сообщение отредактировал(а) kjf03 - 12.3.2012, 18:32 |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Боюсь что из идеальных квадратов может состоять только идеально плоская плоскость. ![]() Мы как-то давно обсуждали здесь описание трехмерных поверхностей. По всему выходит, что описать ее плоскими элементами можно только если использовать треугольники, форма которых не ограничена дополнительными условиями (типа равностороннести, прямоугольности и т.п.) В целом же если решать задачу в лоб, то просто строите проекцию на плоскость каждго плоского элемента, использованного для описания поверхности. Потом отбрасываете части, вышедшие за границы элемента. Но это тупо, конечно. Разумнее будет сначала найти проекцию на один какой-то элемент, а поотом идти "по цепочке" ища проекции на соседние элементы. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
kjf03 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.7.2010 Репутация: нет Всего: нет |
Вы правы, уместней говорить о триангуляции. В общем, известны значения точек Z по сетке с шагом S, неровной поверхность на которую делается проекция отрезка (являющегося частью кривой на проецируемой плоскости). А говоря еще проще допустим есть у вас фото кривой, на прозрачной основе, состоящей из отрезков, есть плоскость кривая (измерить можно только значения по оси Z по сетке с шагом S). Вы выходите в ясную погоду (это для того чтобы солнце выступла в роли источника параллельных лучей) на пляж, где "паркет" неровный. В итоге на песке получается картинка отличная от фото. Как сделать подобную проекцию на программно? Это сообщение отредактировал(а) kjf03 - 12.3.2012, 20:45 Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
||||
|
|||||
kjf03 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.7.2010 Репутация: нет Всего: нет |
Помогите пожалуйста, разве это сложная задача?
|
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Задача не особо сложная. А вот время позднее ![]() Будет двадцать минут свободных распишу как бы я подходил к проблеме. Но я не гуру особенный, просто подобные задачи решал. Может до моих свободных минут кто-то что-то действительно хорошее и предложит. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
kjf03 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.7.2010 Репутация: нет Всего: нет |
Вот пример данных.
Данные о отрезках хранятся в текстовом файле в следующем виде: ... 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 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Параллельное оси 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 для всех вершин ломанной на "кривой" плоскости. Присоединённый файл ( Кол-во скачиваний: 5 ) ![]() -------------------- Mirkes |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
О! К этому осталось только добавить, что, как уже говорилоось, плоские квадраты лучше заменить треугольниками. Проще всего каждый квадрат заменить четырьмя треугольниками с дополнительной усредненной опорной точкой в центре квадрата:
Каждый квадрат с координатами углов (обходя квадрат по кругу) (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 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Вариант с заменой квадрата на четыре треугольника заведомо предпочтительней.
В предложенном мной алгоритме нужно будет определять не квадрат а треугольник (точнее в определенном квадрате брать треугольник). Вычисления проводятся по аналогичным формулам исходя из подобия. Но я думаю в этой ситуации автор задачи должен решить, с чем он будет работать. -------------------- Mirkes |
|||
|
||||
kjf03 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 18.7.2010 Репутация: нет Всего: нет |
ок, благодарю
сейчас буду реализовывать... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |