Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.61
Daber
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 43
01.05.2013, 22:14     Пересечения круга и отрезка #1
Нужно сделать функцию пересечения кола и отрезка, известны координаты двух точек отрезка, координаты центра кола и радиус.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2013, 22:14     Пересечения круга и отрезка
Посмотрите здесь:

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

Не по теме:

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

Daber
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, хоть не должно.
IrineK
Заблокирован
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;
}
Daber
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 43
03.05.2013, 00:19  [ТС]     Пересечения круга и отрезка #7
Дякую, працює!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2014, 14:50     Пересечения круга и отрезка
Еще ссылки по теме:

Определить точки пересечения круга и прямоугольника C++
Найти точки пересечения отрезка и окружности C++
Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки C++

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

Или воспользуйтесь поиском по форуму:
Mikl81
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;
}
Доброе время суток.

Хорошее решение. Быстро, просто, никаких делений.
Но КАК ЭТО РАБОТАЕТ? )))
Можете объяснить, плиз.
Yandex
Объявления
13.01.2014, 14:50     Пересечения круга и отрезка
Ответ Создать тему
Опции темы

Текущее время: 21:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru