Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.04.2022
Сообщений: 3

Координаты пересечения двух лучей

10.08.2022, 20:15. Показов 1671. Ответов 5

Студворк — интернет-сервис помощи студентам
третий день пытаюсь написать программу, которая будет искать координаты точки пересечения двух лучей. Из входных данных - координаты (x,z вместо y) точек начала лучей и их угол наклона a. Также есть код по получению линейных уравнений вида y=kx+b для этих лучей, но решить систему уравнений не получилось. Пытался переделать рабочий код, выкорчеванный из кода сайта https://www.skrepkaq.ru/stronghold но не получилось. может кто-то помочь с этой задачкой?

Линейные системы:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import math
import numpy as np
 
#первая линия
x1 = 10
y1 = 0
u1 = 45
#вторая линия
x2 = 50
y2 = 100
u2 = 60
#угловой коэффициент
k1 = math.tan(math.radians(u1))
k2 = math.tan(math.radians(u2))
#свободный коэффициент
b1 = y1-k1*x1
b2 = y2-k2*x2
#нахождение пересечения
M1 = np.array([[k1, 1.], [k2, 1.]]) # Матрица (левая часть системы)
v1 = np.array([b1, b2]) # Вектор (правая часть системы)
print(np.linalg.solve(M1, v1))
Переделка:
Python
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
50
51
52
import math
 
P = math.pi/180
 
def cot(x):
    return 1 / math.tan(math.radians(x))
 
def getPortalCoords(x1, z1, a1, x2, z2, a2):
    a1 = float(a1)
    a2 = float(a2)
    x1 = int(float(x1))
    z1 = int(float(z1))
    x2 = int(float(x2))
    z2 = int(float(z2))
    print(x1, z1, a1, x2, z2, a2)
 
    if math.fabs(a1 - a2) < 1 :
        print("углы не могут быть равны!")
    elif (((a1 < 0) & (a2 > 0)) | ((a1 > 0) & (a2 < 0))) & (math.fabs(math.fabs(math.fabs(a1) - 180) - math.fabs(a2)) < 1):
        print("углы не могут быть противоположны")
    else:
        match round(a1):
            case -180 | 0 | -90:
                return None
 
            case 180:
                xOut = round(x1)
                zOut = round(cot(-a2*P)*x1 - (x2*cot(-a2*P) - z2))
 
            case 90:
                zOut = round(z1)
                xOut = round(round(x2*cot(-a2*P) - z2 + z1)/cot(-a2*P))
 
            case _:
                match round(a2):
                    case -180 | 0 | -90:
                        return None
 
                    case 180:
                        xOut = round(x2)
                        zOut = round(cot(-a1*P)*x2 - (x1*cot(-a1*P) - z1))
 
                    case 90:
                        zOut = round(z2)
                        xOut = round((x1*cot(-a1*P) - z1 + z2)/cot(-a1*P))
 
                    case _:
                        xOut = round(((x1*cot(-a1*P) - z1) - (x2*cot(-a2*P) - z2))/(cot(-a1*P) - cot(-a2*P)))
                        zOut = round(cot(-a1*P)*xOut-(x1*cot(-a1*P)-z1))
    print('coords is ', xOut, ' ', zOut)
 
getPortalCoords(input('x1 :'), input('z1 :'), input('a1 :'), input('x2 :'), input('z2 :'), input('a2 :'))
Оригинал, JS наверное:
JavaScript
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
const p = Math.PI/180;
function cot(x) { return 1 / Math.tan(x); }
    function getPortalCoords(x1, z1, a1, x2, z2, a2) {
        var a1 = parseFloat(a1),
            a2 = parseFloat(a2),
            x1 = parseInt(x1),
            z1 = parseInt(z1),
            x2 = parseInt(x2),
            z2 = parseInt(z2);
console.log(a1,a2,x1,z1,x2,z2);
if(Math.abs(a1 - a2) < 1) {alert("углы не могут быть равны!")}
        else if ((((a1 < 0) && (a2 > 0)) || ((a1 > 0) && (a2 < 0))) && (Math.abs(Math.abs(Math.abs(a1) - 180) - Math.abs(a2)) < 1)) {alert("углы не могут быть противоположны")}
        else{
            switch(Math.round(a1)) {
                case -180:
                case 0:
                case 180:
                    document.getElementById('x-output').value = Math.round(x1);
                    document.getElementById('z-output').value = Math.round(cot(-a2*p)*x1 - (x2*cot(-a2*p) - z2));
                    break;
                case -90:
                case 90:
                    document.getElementById('z-output').value = Math.round(z1);
                    document.getElementById('x-output').value = Math.round(Math.round(x2*cot(-a2*p) - z2 + z1)/cot(-a2*p));
                    break;
                default:
console.log(1);
                    switch(Math.round(a2)){
                        case -180:
                        case 0:
                        case 180:
                            document.getElementById('x-output').value = Math.round(x2);
                            document.getElementById('z-output').value = Math.round(cot(-a1*p)*x2 - (x1*cot(-a1*p) - z1));
                            break;
                        case -90:
                        case 90:
                            document.getElementById('z-output').value = Math.round(z2);
                            document.getElementById('x-output').value = Math.round((x1*cot(-a1*p) - z1 + z2)/cot(-a1*p));
                            break;
                        default:
console.log(2);
                            document.getElementById('x-output').value = Math.round(((x1*cot(-a1*p) - z1) - (x2*cot(-a2*p) - z2))/(cot(-a1*p) - cot(-a2*p)));
                            document.getElementById('z-output').value = Math.round(cot(-a1*p)*document.getElementById('x-output').value-(x1*cot(-a1*p)-z1));
                    }
            }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2022, 20:15
Ответы с готовыми решениями:

Точка пересечения двух прямых
Всем привет! столкнулся с громоздкой формулой нахождение точки пересечения двух прямых и задался вопросом: как это упростить? существует...

Координаты пересечения высот треугольника
С клавиатуры вводятся целые координаты трёх вершин невырожденного треугольника. Найдите координаты точки пересечения его высот. Формат...

Найти координаты точки D пересечения биссектрисы угла А со стороной СВ
В пространстве дан треугольник А(x1,y1, z1), B(x2,y2, z2), C(x3,y3,z3). Найти координаты точки D пересечения биссектрисы угла А со...

5
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,751
10.08.2022, 21:14
Цитата Сообщение от GiC_on Посмотреть сообщение
Также есть код по получению линейных уравнений вида y=kx+b для этих лучей
Не лучей, а прямых. Даже если прямые пересекаются, то лучи могут и не пересекаться.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
11.08.2022, 11:19
Цитата Сообщение от GiC_on Посмотреть сообщение
Из входных данных - координаты (x,z вместо y)
- и как это понимать? Что за глупость - "z вместо y"?
0
0 / 0 / 0
Регистрация: 08.04.2022
Сообщений: 3
11.08.2022, 11:21  [ТС]
никакой разницы, просто плоскость, на которой эти лучи/линии лежат - не XY, а XZ
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
11.08.2022, 12:03
Точка пересечения двух прямых - детская задача. Решается она так:


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def task(x1,y1,x2,y2,k1,k2):
    if abs(k1-k2)<1.0e-14:
        k=(y2-y1)/(x2-x1)
        if abs(k-k1)<1.0e-14:
            print("прямые совпадают")
        else:
            print("прямые не пересекаются")
    else:
        x=(y1-y2-k1*x1+k2*x2)/(k2-k1)
        y=((k2*x2-y2)*k1+k2*(y1-k1*x1))/(k2-k1)
        print("координаты пересечения ",(x,y))
        
task(1,2,1,1,1,-1)
А то мы уже без numpy чихнуть боимся...
2
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
12.08.2022, 10:49
Цитата Сообщение от GiC_on Посмотреть сообщение
третий день пытаюсь написать программу, которая будет искать координаты точки пересечения двух лучей.
1)В гугле “ray ray intersection”
2) В гугле “пересечение двух лучей”
3) В гугле python ray ray intersection
https://nurbs-python.readthedo... e_ray.html

Добавлено через 1 минуту
4) В гугле python geometry library
SymPy.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2022, 10:49
Помогаю со студенческими работами здесь

Найти площадь пересечения двух фигур
Даны координаты прямоугольника и прямоугольного треугольника. Найти площадь пересечения двух фигур.

Даны координаты двух вершин треугольника A(2;-3) , B(-2;4) и координаты точки пересечения медиан этого треугольника M(2;2) . Найти координаты вершины
Даны координаты двух вершин треугольника A(2;-3) , B(-2;4) и координаты точки пересечения медиан этого треугольника M(2;2) . Найти...

Координаты пересечения двух окружностей
На вход даются целочисленные координаты двух окружностей и целочисленные их радиусы, которые не меньше 1 и не больше, чем 1000. Они...

Координаты пересечения двух прямоугольников
здравствуйте. сегодня наткнулся на такую задачу: определить координаты левого верхнего и правого нижнего углов общей части 2-х...

Координаты точки пересечения двух отрезков
День добрый уважаемые читатели форума. Разбираю задачу по расчету Координаты точки пересечения двух отрезков и столкнулся с проблемой. ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru