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

Пересечения круга и отрезка

01.05.2013, 22:14. Показов 26905. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно сделать функцию пересечения кола и отрезка, известны координаты двух точек отрезка, координаты центра кола и радиус.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2013, 22:14
Ответы с готовыми решениями:

Точка пересечения отрезка и плоскости
Есть отрезок с координатами концов p1(x0,y0,z0) и p2(x1,y1,z1), есть плоскость, для простоты -...

Определить точки пересечения круга и прямоугольника
Помогите, пожалуйста!( Даны вещественные числа x1, y1, r, x2, y2, x3, y3....

Найти точки пересечения отрезка и окружности
Here i go again :) Нужен код готовой функции для поиска точек пересечения отрезка и окружности в...

Найти точку пересечения отрезка с прямой
Найти точку пересечения отрезка, заданного точками (х1;y1) и (x2;y2) с прямой, перпендикулярной...

7
Заблокирован
02.05.2013, 06:59 2
Про пересечение прямой и окружности - здесь: Найти координаты точек пересечения прямой и окружности
Для отрезка нужно добавить проверку вдоль прямой: по Х (левее-правее), по У (выше-ниже).
1
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 43
02.05.2013, 13:25  [ТС] 3
Цитата Сообщение от IrineK Посмотреть сообщение
Про пересечение прямой и окружности - здесь: Найти координаты точек пересечения прямой и окружности
Для отрезка нужно добавить проверку вдоль прямой: по Х (левее-правее), по У (выше-ниже).
ничего не ясно, можно кинуть код функции булевого типа?
0
Заблокирован
02.05.2013, 19:55 4
Коллега, у вас есть алгоритм - по существу решение квадратного уравнения.
Набросайте код - и когда возникнут проблемы - обращайтесь.

Не по теме:

Если не можете - есть повод задуматься о выборе профессии.

1
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 43
02.05.2013, 22:07  [ТС] 5
Цитата Сообщение от IrineK Посмотреть сообщение
Коллега, у вас есть алгоритм - по существу решение квадратного уравнения.
Набросайте код - и когда возникнут проблемы - обращайтесь.
это булева функция, входной параметр - отрезок пересечение с которым рассматривается функция - метод класса окружность, вызывается к его объекту, но есть ошибки
C++
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
bool Circle::cCircle(Line l)
{
    double x1=l.getX();
    double y1=l.getY();
    double x2=l.getX2();
    double y2=l.getY2();
    double x4=((x2-x1)*(y2-y1)*(cy-y1)+x1*(y2-y1)*(y2-y1)+cx*(x2-x1)*(x2-x1))/((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
    double y4=(y2-y1)*(x4-x1)/(x2-x1)+y1;
    double s1=dist(cx,cy,x1,y1);
    double s2=dist(cx,cy,x2,y2);
    double s3=dist(cx,cy,x4,y4);
    if ((s1<r) && (s2<r)) {return false;}
    if (y1<y2){
        if (cy+r<=y1 && cy-r>=y2){return false;}
    }
    if (y1>y2){
        if (cy+r<=y2 && cy-r>=y1){return false;}
    }
    if (cx+r<=x1) {return false;}
    if (cx-r>=x2) {return false;}
    if (y1==y2 && x1==x2) {
        if(s1<r){return true;}
    }
    if (r>s1){return true;}
    if (r>s2){return true;}
    if (r>s3) {return true;}
    else {return false;}
}
Добавлено через 13 минут
Цитата Сообщение от IrineK Посмотреть сообщение
Коллега, у вас есть алгоритм - по существу решение квадратного уравнения.
Набросайте код - и когда возникнут проблемы - обращайтесь.
при x1=290 y1=200 x2=310 y2=43 cx=300 cy=350 r=30 возвращает true, хоть не должно.
0
Заблокирован
02.05.2013, 23:34 6
Погоняйте по тестам такое:

C++
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
#include <iostream>
#include <cmath>
using namespace std;
 
bool commonSectionCircle    (   double x1, double y1, double x2, double y2, 
                                double xC, double yC, double R)
{   x1 -= xC;
    y1 -= yC;
    x2 -= xC;
    y2 -= yC;
 
  double dx = x2 - x1;
  double dy = y2 - y1;
 
  //составляем коэффициенты квадратного уравнения на пересечение прямой и окружности.
  //если на отрезке [0..1] есть отрицательные значения, значит отрезок пересекает окружность
  double a = dx*dx + dy*dy;
  double b = 2.*(x1*dx + y1*dy);
  double c = x1*x1 + y1*y1 - R*R;
 
  //а теперь проверяем, есть ли на отрезке [0..1] решения
  if (-b < 0)
    return (c < 0);
  if (-b < (2.*a))
    return ((4.*a*c - b*b) < 0);
 
  return (a+b+c < 0);
}
 
 
int main()
{   double x1,y1,x2,y2, xC,yC,R;
 
    cout<<"x1 y1 x2 y2:\t";
    cin>>x1>>y1>>x2>>y2;
    cout<<"xC yC R:\t";
    cin>>xC>>yC>>R;
 
    cout<<commonSectionCircle(x1,y1,x2,y2,xC,yC,R)<<"\n";
 
    cin.sync();cin.get();
    return 0;
}
4
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 43
03.05.2013, 00:19  [ТС] 7
Дякую, працює!
0
0 / 0 / 0
Регистрация: 23.05.2013
Сообщений: 22
13.01.2014, 14:50 8
Цитата Сообщение от IrineK Посмотреть сообщение
Погоняйте по тестам такое:

C++
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
#include <iostream>
#include <cmath>
using namespace std;
 
bool commonSectionCircle    (   double x1, double y1, double x2, double y2, 
                                double xC, double yC, double R)
{   x1 -= xC;
    y1 -= yC;
    x2 -= xC;
    y2 -= yC;
 
  double dx = x2 - x1;
  double dy = y2 - y1;
 
  //составляем коэффициенты квадратного уравнения на пересечение прямой и окружности.
  //если на отрезке [0..1] есть отрицательные значения, значит отрезок пересекает окружность
  double a = dx*dx + dy*dy;
  double b = 2.*(x1*dx + y1*dy);
  double c = x1*x1 + y1*y1 - R*R;
 
  //а теперь проверяем, есть ли на отрезке [0..1] решения
  if (-b < 0)
    return (c < 0);
  if (-b < (2.*a))
    return ((4.*a*c - b*b) < 0);
 
  return (a+b+c < 0);
}
 
 
int main()
{   double x1,y1,x2,y2, xC,yC,R;
 
    cout<<"x1 y1 x2 y2:\t";
    cin>>x1>>y1>>x2>>y2;
    cout<<"xC yC R:\t";
    cin>>xC>>yC>>R;
 
    cout<<commonSectionCircle(x1,y1,x2,y2,xC,yC,R)<<"\n";
 
    cin.sync();cin.get();
    return 0;
}
Доброе время суток.

Хорошее решение. Быстро, просто, никаких делений.
Но КАК ЭТО РАБОТАЕТ? )))
Можете объяснить, плиз.
0
13.01.2014, 14:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2014, 14:50
Помогаю со студенческими работами здесь

Определить находится ли точка внутри пересечения эллипса и круга
подскажите пожалуйста, что я не так делаю ? вроде должно видеть все, а в ответе пишет только z=0...

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru