Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
2 / 2 / 2
Регистрация: 24.02.2014
Сообщений: 13

Нахождение точки пересечения прямой и плоскости

24.02.2014, 19:31. Показов 5095. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, господа. У меня возникли некоторые трудности с отладкой программы нахождения точки пересечения прямой и плоскости.
Краткая предыстория: прямая задается направляющим вектором, плоскость - нормальным вектором. Запрограммировал по формулам, которые вывел сам (есть во вложении).

Проблемы в следующем: начал глупить в простейшем случае - когда плоскость параллельна плоскости XY. Почему-то y обращается в бесконечность. Картинки прикреплять не могу, ибо слишком юн, так что тоже впилю во вложения.

Буду очень признателен за помощь.

Вот собственно, фрагмент, который не получается отладить.
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
x0 = -5.0; y0 = -5.0; z0 = 4.0; % Координаты начальной точки
AlfaZ = 0.0 / 180.0 * pi; %AlfaX = 0.0 / 180.0 * pi; % Координаты в сферической системе координат
 
% Задание плоскости
xp = 0.0; yp = 0.0; zp = 0.0;  % Точка, принадлежащая плоскости
BetaZ = 0.0 / 180.0 * pi; BetaX = 0.0 / 180.0 * pi; % Координаты в сферической системе координат
pX = sin(BetaX) * cos(BetaZ); pY = sin(BetaX) * sin(BetaZ); pZ = cos(BetaX); % Единичный нормальный вектор плоскости
 
% Нахождение точки пересечения луча и плоскости
figure; 
for degree = 110 : 10 : 180;
 
AlfaX = degree * pi / 180.0;
aX = sin(AlfaX) * cos(AlfaZ); aY = sin(AlfaX) * sin(AlfaZ); aZ = cos(AlfaX); % Единичный направляющий вектор
 
if dot([aX aY aZ], [pX pY pZ]) >= 0 % Для случая, когда вектор направлен от плоскости
    quiver3(x0, y0, z0, aX, aY, aZ, '-g', 'LineWidth', 2); hold on; % Направляющий вектор
    quiver3(xp, yp, zp, pX, pY, pZ, '-b', 'LineWidth', 2); % Нормаль плоскости из заданной точки
    
    [X,Y] = meshgrid(-5:0.4:5, -4:0.4:4);
    Z = zp - (pX * (X - xp) + pY * (Y - y0))/pZ;
    hS = mesh(X,Y,Z);
    set(hS,'FaceColor','w','EdgeColor','k');
 
    error('Ошибка: Проверьте задание направляющего вектора и нормального вектора плоскости: вектора не пересекаются!');
end;
 
if dot([aX aY aZ], [pX pY pZ]) == -1 % Для случая, когда вектор перпендикулярен плоскости (т.е pX = -aX, pY = -aY, pZ = -aZ)
    x = aX * aX * xp + aY * aY * x0 + aZ * aZ * x0 + aY * aX * (y0 - yp) + aZ * aX * (z0 - zp);  
    y = aY * aY * yp + aX * aX * y0 + aZ * aZ * y0 + aY * aX * (x0 - xp) + aZ * aY * (z0 - zp); 
    z = aZ * aZ * zp + aY * aY * z0 + aX * aX * z0 + aZ * aY * (y0 - yp) + aZ * aX * (x0 - xp); 
else
    x = (pX * xp + x0 * (pY * aY + pZ * aZ) / aX - pY * (y0 - yp) - pZ * (z0 - zp)) / (pX + (pY * aY + pZ * aZ) / aX);
    y = (pY * yp + y0 * (pX * aX + pZ * aZ) / aY - pX * (x0 - xp) - pZ * (z0 - zp)) / (pY + (pX * aX + pZ * aZ) / aY);
    z = (pZ * zp + z0 * (pX * aX + pY * aY) / aZ - pX * (x0 - xp) - pY * (y0 - yp)) / (pZ + (pX * aX + pY * aY) / aZ);
end;
 
[X,Y] = meshgrid(-5:0.4:5, -4:0.4:4);
Z = zp - (pX * (X - xp) + pY * (Y - y0))/pZ;
hS = mesh(X,Y,Z);
set(hS,'FaceColor','w','EdgeColor','k');
 
quiver3(x, y, z, pX, pY, pZ, '-b', 'LineWidth', 2); % Нормаль в точке пересечения  
quiver3(x0, y0, z0, aX, aY, aZ, '-g', 'LineWidth', 2); hold on; % Направляющий вектор
quiver3(xp, yp, zp, pX, pY, pZ, '-b', 'LineWidth', 2); % Нормаль плоскости из заданной точки
 
grid on; set(gca, 'FontName', 'Arial Cyr', 'FontSize', 10); set(gcf, 'Color', 'white');
title('Прямая пересекает плоскость'); xlabel('x, мм'); ylabel('y, мм'); zlabel('z, мм');
xlim([-10.0 10.0]); ylim([-10.0 10.0]); zlim([-10.0 10.0]);
Миниатюры
Нахождение точки пересечения прямой и плоскости   Нахождение точки пересечения прямой и плоскости  
Вложения
Тип файла: docx Задание параметров.docx (92.1 Кб, 24 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2014, 19:31
Ответы с готовыми решениями:

Найти координаты точки пересечения прямой линии и плоскости
Не могу решить , запутался, знает кто нибудь?

Координаты точки пересечения прямой и синусоиды
Доброго времени суток! Я новичок в Матлабе. Есть синусоида и прямая (уравнение: -1/tand( i)*x),исходящая из начала координат под...

Найти точки пересечения графика с этой прямой
Добрый день! Имеется набор из нескольких тысяч точек, по которым построен график. Нужно как-то определить при каких значения по оси Х...

1
2 / 2 / 2
Регистрация: 24.02.2014
Сообщений: 13
02.03.2014, 18:43  [ТС]
Лучший ответ Сообщение было отмечено Зосима как решение

Решение

Все, решил сам. Надо было домножить на соответствующие составляющие направляющего вектора. Короче, вот такая формула (для y и z аналогично):

https://www.cyberforum.ru/cgi-bin/latex.cgi?x=\frac{Al\times {x}_{p}+{x}_{0}\times (Bm+Cn)-l\times (B({y}_{0}-{y}_{p})+C({z}_{0}-{z}_{p}))}{Al+Bm+Cn}

В коде выглядит так:
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
if dot([aX aY aZ], [pX pY pZ]) == -1 % Для случая, когда вектор перпендикулярен плоскости (т.е pX = -aX, pY = -aY, pZ = -aZ)
    x = aX * aX * xp + aY * aY * x0 + aZ * aZ * x0 + aY * aX * (y0 - yp) + aZ * aX * (z0 - zp);  
    y = aY * aY * yp + aX * aX * y0 + aZ * aZ * y0 + aY * aX * (x0 - xp) + aZ * aY * (z0 - zp); 
    z = aZ * aZ * zp + aY * aY * z0 + aX * aX * z0 + aZ * aY * (y0 - yp) + aZ * aX * (x0 - xp); 
else
    od = pX * aX + pY * aY + pZ * aZ;
    x = (pX * aX * xp + x0 * (pY * aY + pZ * aZ) - aX * (pY * (y0 - yp) + pZ * (z0 - zp))) / od;
    y = (pY * aY * yp + y0 * (pX * aX + pZ * aZ) - aY * (pX * (x0 - xp) + pZ * (z0 - zp))) / od;
    z = (pZ * aZ * zp + z0 * (pX * aX + pY * aY) - aZ * (pX * (x0 - xp) + pY * (y0 - yp))) / od;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2014, 18:43
Помогаю со студенческими работами здесь

Нахождение точки пересечения двух полиномов
Прошу помочь в решении !!! Даны: 1) коэффициенты, аппроксимирующие полиномы 7-й степени W1(w) и W2(w): P1=; P2=; 2)...

Построение прямой на плоскости через 2 точки
Здравствуйте. Допустим у меня есть 2 точки x = 4.4 y = 1.9 Как мне провести через них прямую, используя line?

Вычислить точки пересечения плоскости и прямой С++
Помогите пожалуйста с кодом для задачи Вычислить точки пересечения плоскости AX+BY+CZ+D=0 и прямой (x-x1)/n = (y-y1)/m+(z-z1)/h по...

Координаты точки пересечения прямой и плоскости
Заданы координаты вершин пирамиды АВСD. А(1;-1;1) , B (0;2;4) , C (1;3;3) , D (4;2;-3). Найти угол между прямыми AD и CB Проверьте,...

Найти проекцию точки на прямую и точку пересечения прямой и плоскости
Прямая l задана в пространстве общими уравнениями. Написать её каноническое и параметрическое уравнения. Составить уравнение прямой 1 l,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru