Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
Заблокирован

Найти точки пересечения отрезка и окружности

02.06.2015, 10:44. Показов 6226. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Here i go again

Нужен код готовой функции для поиска точек пересечения отрезка и окружности в 2D, может есть у кого готовая функция? Что - то самому очень не хочется вспоминать школьную геометрию и решать квадратные уравнения

Нужны функция типа:

C++ (Qt)
1
QList<QPointF> calcLineCricleIntersectionPoints(qreal x1, qreal y1, qreal x2, qreal y2, qreal xc, qreal yc, qreal r);
или же
C++
1
std::list<std::pair<double, double>> calcLineCricleIntersectionPoints(double x1, double y1, double x2, double y2, double xc, double yc, double r);
То есть в функцию передаются координаты двух точек отрезка (x1,y1,x2,y2), координаты центра окружности (xc,yc) и её радиус (r), на выходе функция должна выдать ноль точек, одну или две в каком - нибуть контейнере, допустим в листе или векторе ...



Добавлено через 9 минут
Помогите новичку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2015, 10:44
Ответы с готовыми решениями:

Найти точки пересечения гиперболы и окружности
Нужно найти точки пересечения гиперболы и окружности. Если смотреть с матиматической точки зрения то у окружности и гиперболы может бить...

Найти точки пересечения луча и окружности
Given a sphere of radius sphereRadius, center point is sphereCenter and a ray with origin rayStart and direction vector rayDirection (in 3D...

Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки
Привет! Помогите двоишнику, я же тупой батхэд :D! Есть отрезок, заданный двумя точками P1 и P2. Есть точка P3. Так вот, нужно найти...

4
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.06.2015, 11:00
Ну вы распишите формулы все, как что должно по вашему работать, что куда передаваться. Хоть какой-то материал дайте. Мож кто вам прям напишет персонально. А вот гуглить за вас формулы вряд ли кто возьмется.
0
Заблокирован
02.06.2015, 16:48  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ну вы распишите формулы все, как что должно по вашему работать, что куда передаваться. Хоть какой-то материал дайте
Ну а что там расписывать ... Там же всё просто, гемороя только много, по этому я и спрашиваю готовый код, может у кого - то завалялся от старых проектов ...

Скорее всего нужно найти K и B из:
y1 = k*x1 + b;
y2 = k*x2 + b;

потом решить систему (x,y - координаты нужной точки)
y = k*x + b;
(x - xc)^2 + (y - yc)^2 = r^2

далее из результатов нужно отфильтровать ненужное, что не попадает на отрезок...

Сам дома на бумажке вывел, проверил, не работает , точнее работает, но точки не там
Пробовал в MatLab, он какую - то ахинею выдаёт ... Может не так пробовал ... Может мне кто - нибуть хоть так сказать код матлаба полностью приведёт для решения этой проблемы ...

 Комментарий модератора 
Пункт 4.15 Правил: Чтобы "поднять" тему в разделе и поиске по форуму, используйте осмысленные сообщения, например "Тема/проблема/задача актуальна". Если вы чего-то достигли в решении проблемы на этот момент, сообщите об этом.

Попробуйте сами куда-нибудь продвинуться - так больше вероятность, что кто-то поможет.


Добавлено через 22 минуты
SatanaXIII, может ты мне поможешь с кодом этой функции? Ну выведи уже за меня всю эту пурклапу
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
02.06.2015, 23:04
Пересечение окружности и прямой
0
Заблокирован
04.06.2015, 11:58  [ТС]
С горем пополам я всё таки сделал себе функцию для нахождения точек пересечения отрезка/ прямой и окружности. Она кривая, куча лишний действий, так что если кому нужна скорость - перекоживайте, мне лень, делал глубокой ночью перед сном, да и плюс там не учтены крайние случаи, когда линия горизонтальна или вертикальна, это уже мне совсем лень делать было, в моём случае мне это и не понадобится.
Короче вот код, может кому пригодится (или мне, когда я сюда лет через 10 зайду с такой же задачей и мне опять будет лень выводить эти школьные формулы )
C++ (Qt)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
QList<QPointF> Link::getLineCircleIntersectionPoints(qreal x1, qreal y1, qreal x2, qreal y2, qreal xc, qreal yc, qreal r, bool section)
{
    QList<QPointF> result;
    result.reserve(2);
 
    qreal x1s = x1;
    qreal y1s = y1;
    qreal x2s = x2;
    qreal y2s = y2;
 
    qreal xShift = xc * (-1);
    qreal yShift = yc * (-1);
 
    x1s += xShift;
    y1s += yShift;
    x2s += xShift;
    y2s += yShift;
 
    qreal k = (y1s - y2s) / (x1s - x2s);
    qreal b = y1s - k * x1s;
 
    qreal fxA = 1 + pow(k,2);
    qreal fxB = 2*k*b;
    qreal fxC = pow(b,2) - pow(r,2);
 
    qreal D = pow(fxB,2) - 4*fxA*fxC;    
 
    if(D >= 0)
    {
        qreal fxX1 = ((-1)*fxB + sqrt(D)) / (2*fxA);
        qreal fxX2 = ((-1)*fxB - sqrt(D)) / (2*fxA);
        qreal fxY1 = k*fxX1 + b;
        qreal fxY2 = k*fxX2 + b;
 
        xShift *= -1;
        yShift *= -1;
 
        fxX1 += xShift;
        fxX2 += xShift;
        fxY1 += yShift;
        fxY2 += yShift;
 
        if(D >= 0)
        {
            bool accept1 = true;
            bool accept2 = true;
            if(section)
            {
                accept1 = false;
                accept2 = false;
 
                if(x2 > x1 && y2 > y1)
                {
                    if(fxX1 >= x1 && fxX1 <= x2 && fxY1 >= y1 && fxY1 <= y2)
                        accept1 = true;
                    if(fxX2 >= x1 && fxX2 <= x2 && fxY2 >= y1 && fxY2 <= y2)
                        accept2 = true;
                }
                if(x2 < x1 && y2 > y1)
                {
                    if(fxX1 >= x2 && fxX1 <= x1 && fxY1 >= y1 && fxY1 <= y2)
                        accept1 = true;
                    if(fxX2 >= x2 && fxX2 <= x1 && fxY2 >= y1 && fxY2 <= y2)
                        accept2 = true;
                }
                if(x2 < x1 && y2 < y1)
                {
                    if(fxX1 >= x2 && fxX1 <= x1 && fxY1 >= y2 && fxY1 <= y1)
                        accept1 = true;
                    if(fxX2 >= x2 && fxX2 <= x1 && fxY2 >= y2 && fxY2 <= y1)
                        accept2 = true;
                }
                if(x2 > x1 && y2 < y1)
                {
                    if(fxX1 >= x1 && fxX1 <= x2 && fxY1 >= y2 && fxY1 <= y1)
                        accept1 = true;
                    if(fxX2 >= x1 && fxX2 <= x2 && fxY2 >= y2 && fxY2 <= y1)
                        accept2 = true;
                }
            }
 
            if(accept1)
                result.append(QPointF(fxX1, fxY1));
            if(accept2 && D > 0.0)
                result.append(QPointF(fxX2, fxY2));
        }
    }
 
    return result;
}
Это на Qt, там qreal - это double, QList аналог std::list, QPointF - контейнер для точки.

В общем с этим вроде мне всё ясно, теперь ещё более глупый вопрос
Имея такую функцию описанную выше, казалось бы, нет ничего проще уже нарисовать стрелку на линии, а нет.. опять ерунда какая то... Всё забыл

В общем на рисунке синенькие кружочки, я мышкой могу их соединить, так вот когда я их соединяю, должны появится линия между центрами кружочков, на пересечение со стартовым кружочком - один маленький жёлтый должен быть, а на пересечение с целевым, стрелку хочу нарисовать.
Полагаю, что нужно с помощью моей супер функции найти точку пересечения линии и целевого кружка, потому матрицей поворота повернуть отрезок в обе стороны и найти точки пересечения с более крупной окружностью ...

Подкиньте пару строк кода в помощь .... На варит
Миниатюры
Найти точки пересечения отрезка и окружности  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.06.2015, 11:58
Помогаю со студенческими работами здесь

Точки пересечения окружности и прямой
Необходимо создать программу которая находит точки пересечения окружности и прямой. Причем я задаю радиус сам, и координаты центра фигуры,...

Определить точки пересечения прямой и окружности
Задана окружность с центром в точке О(x0,y0) и радиусом R0 и прямая y=ax+b. Определить, пересекаются ли прямая и окружность. При...

Дайте готовый код нахождения точки пересечения окружности с прямой :-)
Нужен код нахождения точки пересечения окружности с прямой. Прямая задана координатами двух точек в 2D. Окружность &quot;сидит&quot; на...

Вычислительная геометрия (Даны координаты центра, R окружности, координаты точки вне окруж-ти. Найти точку пересечения одной из касательных с окруж-ю)
Даны координаты центра (xc,yc) и радиус R окружности, координаты точки (x,y) вне окружности. Найти точку пересечения одной из касательных с...

Найти координаты точки пересечения окружности
Здравствуйте. Нужно написать программу на паскале. Заданы координаты центра окружности, ее радиус и значение некоторого угла. Найти...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru