Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.87
des1ner
1 / 1 / 0
Регистрация: 13.05.2011
Сообщений: 12
#1

Окружность и прямая - C++

22.07.2011, 17:47. Просмотров 5427. Ответов 21
Метки нет (Все метки)

Помогите написать программу на чистом Си. Вот условие:"Дана окружность с координатами Xо,Yo и радиусом r. Дана прямая с координатами x1,y1-x2,y2. Определить координаты точек пересечения прямой с окружостью"
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2011, 17:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Окружность и прямая (C++):

Прямая и окружность - C++
Есть прямая, заданая уравнением Ax+By+C=0 И окружность с координатами центра и радиусом Нужно найти координаты точек пересечения если...

Пересекает ли прямая окружность - C++
Есть класс окружность. Нужно создать метод "добавить/удалить прямую сечения". Прямую задаём двумя точками , ввод с консоли. ...

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

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

Определить, пересекаются ли прямая и окружность, и найти точки пересечения - C++
задана окружность с центром в точке х(нулевое) и(нулевое) у и радиусом Р и прямая у=ах+в. определить пересекаются ли прямая и окружность....

Определить, сколько точек пересечения имеют прямая и окружность и найти координаты этих точек - C++
Привет. Тут такое дело. В общем я неплохо знаю сам язык, но вот задачку решить не могу. Т.е не знаю как. С школьной математикой у меня...

21
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.07.2011, 04:31 #16
Цитата Сообщение от easybudda
Можно например провести через центр окружности прямую, перпендикулярную данной. Считая, что центр у нас всё-таки чудесным образом совпадает с началом координат
Цитата Сообщение от easybudda
Находим абсцису точки пересечения прямых, что в общем проще, чем квадратное уравнение: , находим ординату и собственно расстояние от центра до точки пересечения.
есть готовая формула нахождения расстояния от точки до прямой
мало того, при переносе окружности нужно переносить и данную прямую
иначе, как у -=ЮрА=-, получится неправильное расстояние

система:
http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\begin{cases}<br />
 & \text (x - x_0)^2 + (y - y_0)^2 = r^2\\ <br />
 & \text Ax + By + C = 0  <br />
\end{cases}<br />

прямая:
http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\begin{vmatrix}<br />
 x & y & 1\\ <br />
 x_1& y_1 & 1\\ <br />
 x_2& y_2 & 1<br />
\end{vmatrix} = 0<br />
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
26.07.2011, 04:55 #17
Цитата Сообщение от accept Посмотреть сообщение
при переносе окружности нужно переносить и данную прямую
Так я ж про это говорил уже. Но в любом случае, если центр окружности совпадает с началом координат, считать будет значительно легче, так, что, есть смысл сдвинуть всё, потом вернуть...

Цитата Сообщение от accept Посмотреть сообщение
система:
Мудрёно как-то очень... Есть проще способ понять, прийдётся две точки высчитывать, или нет: считаем точки пересечения прямой с осями координат (x; 0) и (0; y). Если |х| или |у| получится меньше радиуса - уже есть две точки... Если оба больше - находим высоту треугольника, образованного этими точками и центром координат: http://www.cyberforum.ru/cgi-bin/latex.cgi?h = \frac{|x||y|}{\sqrt{{x}^{2}+{y}^{2}}} и снова сравниваем с радиусом...
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.07.2011, 08:12 #18
Окружность и прямая
там ссылка на wiki, где уже написана формула нахождения расстояния от точки до прямой
берёшь прямую и точку, подставляешь в формулу, получаешь расстояние
если расстояние меньше радиуса или равно ему, то решаем систему

Цитата Сообщение от easybudda
Мудрёно как-то очень...
x0, y0, r - известны
A, B, C - вычисляются по заданным точкам
потом надо получить квадратное уравнение с x
после нахождения x1, x2 подставить их в уравнение прямой, чтобы найти y1, y2
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2011, 10:21 #19
Вчера не мог зайти, кстати так и не понял почему с 12 до 19 форум был недоступен???Но не в этом дело, итак по порядку:
1 easybudda, в нахождении дискриминанта х лишний, это не более чем описка, в коде х нет, посмотри листинг алгоритма
2 при нахождении корней я сам напутал и вместо того чтобы делить на 2а делил на 2ас, тут признаю огрех, хотя как раз этого то никто и не заметил, в итоге сам себя и поправил
3 соглашусь с accept-ом, да вначале не учёл координаты центра окружности, ниже код и математические соображения по переходу от х-х0 к обычному квадратному уравнению, вкратце скажу что этого достигаю переходом к Х = х-х0 и У=у-у0 и соответсвующим обратным преобразованием х = Х + х0, у = У+у0
4 единственное мое но - считаю, что если уж и юзать какую либо формулу - её сначала нужно хотябы для себя доказать, в вики в ряде случаев приведены уже конечные преобразования, в которых иногда сокрыт большой объём преобразований и выкладок, и по сути полагаемся на корректность математики автора статьи...
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
44
45
46
47
48
#include <stdio.h>
#include <math.h>
 
float line(float k, float x, float b);
 
int main()
{
    float x1,x2,y1,y2,x0,y0,r,X1,X2,Y1,Y2;
    printf("\tEnter parameters of line\r\n");
    printf("x1 = ");scanf("%g",&x1);
    printf("y1 = ");scanf("%g",&y1);
    printf("x2 = ");scanf("%g",&x2);
    printf("y2 = ");scanf("%g",&y2);
    printf("\tEnter parameters of cicule\r\n");
    printf("x0 = ");scanf("%g",&x0);
    printf("y0 = ");scanf("%g",&y0);
    printf("r  = ");scanf("%g",&r);
 
    float k = (y2 - y1)/(x2 - x1);
    float b = (y2*x1 - y1*x2)/(x1 - x2);
 
    b += (k*x0 - y0); 
 
    float D = pow(2*b*k,2) + 4*(1 + pow(k,2))*(pow(r,2) - pow(b,2));
    if(0 <= D)
    {
        X1 = (-2*b*k - sqrt(D))/(-2*(1 + pow(k,2)));
        Y1 = line(k,X1,b);
        printf("coord point of intersection P1(%lf;%lf)\r\n",X1 + x0,Y1 + y0);
        if(D == 0)
            printf("\tline is tangent line to circule\r\n");
        else
        {
            X2 = (-2*b*k + sqrt(D))/(-2*(1 + pow(k,2)));
            Y2 = line(k,X2,b);
            printf("coord point of intersection P2(%.2f;%.2f)\r\n",X2 + x0,Y2 + y0);
            printf("\tline cross circle in two points\r\n");
        }
    }
    else
        printf("line not cross circule\r\n");
    return 0;
}
 
float line(float k, float x, float b)
{
    return (k*x + b);
}
0
Миниатюры
Окружность и прямая   Окружность и прямая  
des1ner
1 / 1 / 0
Регистрация: 13.05.2011
Сообщений: 12
26.07.2011, 14:16  [ТС] #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вчера не мог зайти, кстати так и не понял почему с 12 до 19 форум был недоступен???Но не в этом дело, итак по порядку:
1 easybudda, в нахождении дискриминанта х лишний, это не более чем описка, в коде х нет, посмотри листинг алгоритма
2 при нахождении корней я сам напутал и вместо того чтобы делить на 2а делил на 2ас, тут признаю огрех, хотя как раз этого то никто и не заметил, в итоге сам себя и поправил
3 соглашусь с accept-ом, да вначале не учёл координаты центра окружности, ниже код и математические соображения по переходу от х-х0 к обычному квадратному уравнению, вкратце скажу что этого достигаю переходом к Х = х-х0 и У=у-у0 и соответсвующим обратным преобразованием х = Х + х0, у = У+у0
4 единственное мое но - считаю, что если уж и юзать какую либо формулу - её сначала нужно хотябы для себя доказать, в вики в ряде случаев приведены уже конечные преобразования, в которых иногда сокрыт большой объём преобразований и выкладок, и по сути полагаемся на корректность математики автора статьи...
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
44
45
46
47
48
#include <stdio.h>
#include <math.h>
 
float line(float k, float x, float b);
 
int main()
{
    float x1,x2,y1,y2,x0,y0,r,X1,X2,Y1,Y2;
    printf("\tEnter parameters of line\r\n");
    printf("x1 = ");scanf("%g",&x1);
    printf("y1 = ");scanf("%g",&y1);
    printf("x2 = ");scanf("%g",&x2);
    printf("y2 = ");scanf("%g",&y2);
    printf("\tEnter parameters of cicule\r\n");
    printf("x0 = ");scanf("%g",&x0);
    printf("y0 = ");scanf("%g",&y0);
    printf("r  = ");scanf("%g",&r);
 
    float k = (y2 - y1)/(x2 - x1);
    float b = (y2*x1 - y1*x2)/(x1 - x2);
 
    b += (k*x0 - y0); 
 
    float D = pow(2*b*k,2) + 4*(1 + pow(k,2))*(pow(r,2) - pow(b,2));
    if(0 <= D)
    {
        X1 = (-2*b*k - sqrt(D))/(-2*(1 + pow(k,2)));
        Y1 = line(k,X1,b);
        printf("coord point of intersection P1(%lf;%lf)\r\n",X1 + x0,Y1 + y0);
        if(D == 0)
            printf("\tline is tangent line to circule\r\n");
        else
        {
            X2 = (-2*b*k + sqrt(D))/(-2*(1 + pow(k,2)));
            Y2 = line(k,X2,b);
            printf("coord point of intersection P2(%.2f;%.2f)\r\n",X2 + x0,Y2 + y0);
            printf("\tline cross circle in two points\r\n");
        }
    }
    else
        printf("line not cross circule\r\n");
    return 0;
}
 
float line(float k, float x, float b)
{
    return (k*x + b);
}
не хочет она у меня работать, ввожу координаты, а потом она зависает и выдаёт ошибку
1
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2011, 14:33 #21
Напиши какие координаты вводишь, сейчас проверю
ошибка может лишь при делении на ноль это вот здесь /(x2 - x1), если это так забей проверку данного условия уровнение прямой в этом случае преодразуется к виду у = у1 или у = у2
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.07.2011, 03:31 #22
Цитата Сообщение от -=ЮрА=-
4 единственное мое но - считаю, что если уж и юзать какую либо формулу - её сначала нужно хотябы для себя доказать
http://www.cyberforum.ru/cgi-bin/latex.cgi?d = \frac{|Ax_0 + By_0 + C|}{\sqrt{A + B}}
доказательство
0
27.07.2011, 03:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2011, 03:31
Привет! Вот еще темы с ответами:

Структуры (Создайте структуру Прямая с элементами x1, y1, x2, y2 – координаты двух точек, через которые проходит прямая) - C++
Создайте структуру Прямая с элементами x1, y1, x2, y2 – координаты двух точек, через которые проходит прямая. Для К заданных прямых вывести...

Окружность вписана в квадрат заданной площади; найти площадь квадрата, вписанного в эту окружность - C++
Окружность вписана в квадрат заданной площади. Найти площадь квадрата, вписанного в эту окружность. Во сколько раз площадь вписанного...

Квадрат и прямая - C++
Здравствуйте. Помогите пожалуйста написать программу на языке Си(не С++). Дан квадрат с координатами х1,у1 и х2,у2, так же даны координаты...

Параллельная прямая - C++
Надо по заданным A,B,C найти две прямые на расстоянии от заданной от R. Кто-нибудь парочку формул для нахождения не скинет?


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru