Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.12.2013, 21:55
HorusWM вне форума Посмотреть профиль Отправить личное сообщение для HorusWM Найти все сообщения от HorusWM
  № 1  
Ответить с цитированием
HorusWM

Регистрация: Sep 2010
Сообщений: 90
По умолчанию Пересечение луча с плоскостью в пространстве

Есть плоскость, выстраиваемая по 4 точкам {x,y,z} и есть луч - отрезок, построенный по двум точкам {x2,y2,z2}-{x1,y1,z1}, как определить какие плоскости пересекает луч и точку пересечение на плоскости, помогите, если кто решал подобную задачу? с аналитической геометрией у меня никак от слова совсем. В инете нашел много информации по этому поводу, включая алгоритмы на си-крестах, но все везде разное и дает соответственно разные результаты, причем у меня все неверные)

Старый 25.12.2013, 22:15
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 2  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
1) Вообще плоскость должна задаваться 3 точками. 4 могут не образовать плоскость. Давайте считать что у нас есть 3 точки: A, B, C
2) Создадим вектора AB и AC (оба соответственно лежат в плоскости, так как соединяют вершины, лежащие на этой плоскости)
3) Возмем cross-product от AB и AC (это третий вектор, который точно перпендикулярен и AB и AC). Что такое cross-product и как его считать можно нагуглить. Так вот, помимо прочего cross-product будет нормалью плоскости (то есть перпендикулярен любой прямой, лежащей в плоскости)
4) Проверим, что обе точки отрезка лежат по одну сторону относительно плоскости (зная нормаль и координаты это можно посчитать. Координаты - это у нас точка A, так как и AB и AC, и cross-product выходят из нее и направлены в разные стороны). Как считать - я честно не помню. Но опять же можн найти.
5) Если в пункте 4 выяснилось что обе точки нашего отрезка лежат по одну сторону от плоскости, значит отрезок плоскость не пересекает.
6) Все готово, дело за малым - осталось лишь найти пересечение прямой, на которой лежит отрезок, и плоскости. Все данные у нас есть. Решение, опять же, можно найти.

ЗЫ
Извините что даю только теорию, но я совсем давно этим занимался. Кстати, когда занимался, я все что мне нужно было находил здесь: http://www.enlight.ru/faq3d/content.htm
__________________
...вселенская грусть

Старый 25.12.2013, 22:17
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Я не спец по геометрии, но в числе первых нагугленных вроде есть несколько по теме.

cross-product это вроде бы векторное произведение, не путать со скалярным умножением векторов и умножением вектора на скаляр.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 25.12.2013 в 22:32.
Старый 25.12.2013, 22:25
HorusWM вне форума Посмотреть профиль Отправить личное сообщение для HorusWM Найти все сообщения от HorusWM
  № 4  
Ответить с цитированием
HorusWM

Регистрация: Sep 2010
Сообщений: 90
Т.е., я могу взять любые 3 точки из 4х или это должны быть какие-то иные точки? Вообще, теории, конечно, уже начитался, кроссы и доты расписаны давно, проблема именно с уравнением плоскости и нормалью - по идее, достаточно ее одной и луча, для определения пересечения, но то ли у меня лыжи не едут, то ли неверно беру нормаль: у меня все плоскости образуют коробки, т.е., 2 компоненты нормали каждой стороны, по идее, должны быть равны нулю, а 3я 1 или -1, но так вычисления выходят неверны.

UPD. Все правильно было, я не поставил возврат значения и луч улетал в деревню дедушки, продолжая считать)
вот, если кому пригодится:
Код AS3:
// tested_direction кэширован заранее шоп копий не плодить
// p1 - одна из точек плоскости
// start начальная точка луча
tested_direction.x = p1.x - start.x;
tested_direction.y = p1.y - start.y;
tested_direction.z = p1.z - start.z;
 
// коэффициент приближения к плоскости
// если k > 1, значит луч не пересекает плоскость, если меньше, значит находится в одном полупространстве с ней
// trace_direction - вектор луча					
var k:Number = tested_direction.Dot(normal) / trace_direction.Dot(normal);
 
// точка на плоскости	
trace_point.x = start.x +trace_direction.x *k;
trace_point.y = start.y +trace_direction.y *k;
trace_point.z = start.z +trace_direction.z *k;


Последний раз редактировалось dimarik; 25.12.2013 в 23:27. Причина: зачеркивания глаз режут.
Создать новую тему Ответ Часовой пояс GMT +4, время: 07:09.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 07:09.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.