Формулировка задачи:
Даны координаты центров двух окружностей (0,0)и (x2,y2), а также их радиусы r1 и r2. Найти точки пересечения этих окружностей, помогите решить или подскажите как решить
Код к задаче: «Найти точки пересечения двух окружностей»
textual
Листинг программы
var x1,y1,r1,x2,y2,r2,d:real; begin x1:=0; y1:=0; writeln('радиус первой окружности:'); readln(r1); writeln('x2=');readln(x2); writeln('y2=');readln(y2); writeln('r2=');readln(r2); d:=sqrt(sqr(x1-x2)+sqr(y1-y2)); begin if d>r1-r2 then write('Окружности пересекаются') else if d>r1+r2 then write('Окружности отделены') else write('Окружность внутри друг друга'); end; end.
Даны две окружности одинакового радиуса R , заданные координатами их центров (X1,Y1) (X2,Y2) -целыми числами. Определить пересекаются ли они, в этом случае вычислить координаты, (вещественные числа) точек их пересечения
program okr2; const e=0.0001; var x1,y1,x2,y2,r:integer; x,y,a,h,d,x3,y3,x4,y4:real; begin writeln('Введите координаты центра 1 окружности, целые цисла'); write('x1=');readln(x1); write('y1=');readln(y1); writeln('Введите координаты центра 2 окружности, целые числа'); write('x2=');readln(x2); write('y2=');readln(y2); repeat write('Введите радиус окружностей r>0 r='); readln(r); until r>0; if (x1=x2)and(y1=y2)then write('Окружности совпадают') else begin d:=sqrt(sqr(x1-x2)+sqr(y1-y2));//расстояние между центрами if d>2*r then write('Точек пересечения нет') else if abs(d-2*r)<e then begin writeln('Окружности касаются в точке:'); x3:=(x1+x2)/2; y3:=(y1+y2)/2; writeln('x=',x3:0:2,' y=',y3:0:2); end else begin a:=d/2; h:=sqrt(sqr(r)-sqr(a)); x:=x1+a*(x2-x1)/d; y:=y1+a*(y2-y1)/d; x3:=x-(y2-y1)*h/d; y3:=y+(x2-x1)*h/d; x4:=x+(y2-y1)*h/d; y4:=y-(x2-x1)*h/d; writeln('Точки пересечения:'); writeln('1:x=',x3:0:2,' y=',y3:0:2); writeln('2:x=',x4:0:2,' y=',y4:0:2); end; end; end.
|
|
|
Пересечение окружностей в паскале
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): нет |
Народ, помогите, пожалуйста решить/доделать задачки… в общем вот 1 задача: Цитата 1. Пересечение окружностей вот мое решение, но оно не правильно работает…
program z; var x,x1,y,y1,y2,r,r1:integer; i,d:integer; str,str2:string; f,f1:text; begin assign(f,’C:LABA1input.txt’); reset(f); read(f); read(f,x); read(f,y); readln(f,r); read(f,x1); read(f,y1); readln(f,r1); close(f); if (r>=1)and(r<=1000)and(r1>=1)and(r1<=1000)and (abs(x)<5000)and(x1<5000)and(abs(x)<5000)and (y1<5000)and(abs(y1)<5000) then begin d:=(sqr(x1-x)+sqr(y1-y)); assign(f,’C:LABA1output.txt’); rewrite(f); if(d<=r+r1) then write(f,’Yes’) else write(f,’No’); close(f); end; end. и еще две задачки.. Цитата Вычеркнуть из записи элементов линейного массива цифры, совпадающие с номером элемента (номер от 0 до 9). и Цитата Определите количество сверхпростых чисел, не превышающих натурального числа N. заранее благодарен! Сообщение отредактировано: Chel – 07.11.08, 11:12 |
volvo877 |
|
Moderator Рейтинг (т): 878 |
Цитата Chel @ 07.11.08, 10:51 Определите количество сверхпростых чисел, не превышающих натурального числа N. Это вообще олимпиадная задача, и как минимум на двух серверах сейчас она активна… Как ты думаешь, это нам надо, решать тебе, чтоб ты “скопировал и сдал”? Делай, что не получится, спрашивай… Начни с того, что такое вообще сверхпростое число. ! P.S. Измени заголовок темы, иначе через час она будет закрыта… |
Chel |
|
Junior Рейтинг (т): нет |
volvo877 Сообщение отредактировано: Chel – 07.11.08, 11:17 |
albom |
|
Senior Member Рейтинг (т): 20 |
условие пересечения двух окружностей: ( d < r1 + r2 ) and ( d > abs(r1 - r2) ) где d = sqrt( sqr(x1 - x2) + sqr(y1 - y2) ) |
miksayer |
|
ребят, извиняюсь за оффтоп. А что за сверхпростые числа? в википедии смотрел, не нашел |
albom |
|
Senior Member Рейтинг (т): 20 |
Это просто число, обладающие неким замечательным свойством. В чем же именно состоит это замечательное свойство Chel решил нам не говорить. |
Chel |
|
Junior Рейтинг (т): нет |
вот что нашел в инете по поводу сверхпростых чисел: Цитата Простым числом будем называть натуральное число, большее единицы и делящееся только на единицу и на само себя. Выпишем все простые числа в порядке возрастания и i-ое в этом порядке число обозначим pi (число 2 при этом будет иметь номер 1). Так, например, p1 = 2, p2 = 3, p3 = 5, p52 = 239. Скажем, что число pi является сверхпростым, если i = pk для некоторого k. Иными словами, сверхпростое число — это простое число, номер которого в списке простых чисел, упорядоченном по возрастанию, является простым числом. Сообщение отредактировано: Chel – 07.11.08, 12:10 |
FasterHarder |
|
Может поможет данная программа по поиску свпростых чисел Сообщение отредактировано: FasterHarder – 07.11.08, 12:12 |
Chel |
|
Junior Рейтинг (т): нет |
FasterHarder а что на счет 1 задачи.. что у меня в коде не верно? может кто подсказать? |
albom |
|
Senior Member Рейтинг (т): 20 |
У тебя условие неверное. Цитата Chel @ 07.11.08, 12:17 может кто подсказать? Запись верного условия не является достаточной подсказкой? |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Pascal
- Следующая тема
[ Script execution time: 0,0313 ] [ 15 queries used ] [ Generated: 17.05.23, 05:21 GMT ]
Условие задачи взято с сайта acmp.ru (Время: 1 сек. Память: 16 Мб Сложность: 17%):
На плоскости даны две окружности. Требуется проверить, имеют ли они хотя бы одну общую точку.
Входные данные
Входной файл INPUT.TXT состоит из двух строк. На каждой строке записана информация об одной окружности – координаты ее центра x и y (целые числа, по модулю не превосходящие 5000) и радиус (целое число
1 ≤ r ≤ 1000
).Выходные данные
В выходной файл OUTPUT.TXT выведите «YES», если окружности имеют хотя бы одну общую точку, и «NO» в противном случае.
Примеры
№ INPUT.TXT OUTPUT.TXT 1 0 0 2
0 3 2YES 2 1 1 1
4 4 1NO
Разбор решения задачи
Эту задачу можно решить множеством различных способов. Например, записать уравнения двух окружностей и найти точки их пересечения аналитически. Программе при этом останется лишь произвести расчет по вашим формулам.
Можно найти точки пересения геометрически, однако от нас не требуют точки пересечения — достаточно лишь установить факт того, что окружности пересекаются. Все что нам нужно — рассмотреть возможные варианты их взаимного положения.
В первых трех случаях цетр каждой окружности размещен снаружи другой окружности. Установить это можно сравнивая расстояние между центрами окружностей с суммой радиусов.
Во вторых трех случаях центр одной окружности находится внутри другой:
Для решения нам потребуется вычислять расстояние между точками (центрами окружностей) — реализация этой части приведена тут.
Насмотря на то, что цетры и радиусы в задаче задаются целыми числами, точки пересечения окружностей могут оказаться дробными. В двух случаях нам нужно проверять равенство дробных чисел — делать это можно только с заданием «погрешности» — соответствующая реализация описана в статье.
Следующая программа последовательно перебирает все описанные выше варианты размещения окружностей, однако это не обязательно (можно упростить). Ведь общих точек у окружностей не будет только в двух случаях — можно было проверить только их:
#include <fstream> #include <cmath> using namespace std; double distance(double a_x, double a_y, double b_x, double b_y) { double dx = a_x-b_x, dy = a_y-b_y; return sqrt(dx*dx + dy*dy); } bool is_close(const double a, const double b, const double epsilon = 0.00001) { return std::fabs(a - b) < epsilon; } int main() { ifstream ifst("input.txt"); ofstream ofst("output.txt"); int a_x, a_y, a_r, b_x, b_y, b_r; ifst >> a_x >> a_y >> a_r >> b_x >> b_y >> b_r; double center_dist = distance(a_x, a_y, b_x, b_y); double radius_sum = a_r + b_r; if (is_close(center_dist, radius_sum)) { /* окружности не вложены, пересекаются в одной точке */ ofst << "YES"; return 0; } if (center_dist > radius_sum) { /* окружности не вложены, не пересекаются */ ofst << "NO"; return 0; } /* центр одной окружности находится внутри другой */ if (is_close(center_dist + a_r, b_r) || is_close(center_dist + b_r, a_r)) { /* пересекаются в одной точке */ ofst << "YES"; return 0; } if (center_dist + a_r < b_r || center_dist + b_r < a_r) { /* одна окружность полностью лежит внутри другой */ ofst << "NO"; return 0; } /* пересекаются в двух точках */ ofst << "YES"; }
-
DemonRed
- Сообщения:2
- Зарегистрирован:14 июн 2008, 11:56
Задан массив, размером n строк на 3.(Const n=10, элементы массива типа байт) Первые два элемента строки координаты центра окружности, третий элемент ее радиус. Найти число пересекающихся окружностей. (Ответ: № окружности число пересечений)
P.S. буду очень благодарен!
-
Хыиуду
- Сообщения:2388
- Зарегистрирован:06 мар 2005, 21:03
- Откуда:Москва
- Контактная информация:
14 июн 2008, 22:05
Расстояние между двумя точками вычисляется по теореме Пифагора.
Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов.
Искусство программирования – заставить компьютер делать все то, что вам делать лень.
Для “спасибо” есть кнопка “Спасибо” в виде звездочки внизу под ником автора поста.
-
Serge_Bliznykov
- Сообщения:366
- Зарегистрирован:31 авг 2007, 03:06
14 июн 2008, 22:42
Хыиуду, задачка то с подковыркой… 🙂
" писал(а):Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов.
к сожалению, не так… они могут и не пересекаться в случае когда меньшая окружность полностью внутри большей…
-
DemonRed
- Сообщения:2
- Зарегистрирован:14 июн 2008, 11:56
15 июн 2008, 16:42
Спасибки большое, мож кому пригодиться текст программы:
Var a:array[1..n] of real;
b:array[1..n] of real;
r:array[1..n] of real;
i,KolvoPeresecheni: integer;
sum,d,L:real;
count:integer;
Begin
Clrscr;
writeln(‘Vvedite ‘, n , ‘ elementov massiva dlya x’);
for i:=1 to n do
readln(a);
writeln(‘vvedite ‘,n, ‘ elementov massiva dlya y’);
for i:=1 to n do
readln(b);
writeln(‘vvedite ‘, n, ‘ radiusov okryznostey’);
for i:=1 to n do
readln(r);
if r<0 then writeln (‘vvedeno nevernoe chislo radiysov’);
KolvoPeresecheni := 0;
i:= 0;
for i:=1 to n-1 do
begin
L:=sqrt(sqr(a-a[i+1])+sqr(b-b[i+1]));
if L < r+r[i+1] then KolvoPeresecheni := KolvoPeresecheni + 1;
end;
Writeln(‘ okryznosti peresekaitsa -‘, KolvoPeresecheni, ‘raz.’);
Readln;
End.
-
Хыиуду
- Сообщения:2388
- Зарегистрирован:06 мар 2005, 21:03
- Откуда:Москва
-
Контактная информация:
16 июн 2008, 12:10
Serge_Bliznykov писал(а):Хыиуду, задачка то с подковыркой… 🙂
к сожалению, не так… они могут и не пересекаться в случае когда меньшая окружность полностью внутри большей…
Тогда “Меньше суммы их радиусов, но больше разности”
Искусство программирования – заставить компьютер делать все то, что вам делать лень.
Для “спасибо” есть кнопка “Спасибо” в виде звездочки внизу под ником автора поста.
-
Serge_Bliznykov
- Сообщения:366
- Зарегистрирован:31 авг 2007, 03:06
16 июн 2008, 20:52
Хыиуду писал(а):Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов, но больше разности радиусов
Хыиуду, угу, вот теперь полностью согласен!
проблема только в том, что, похоже, автор топика не стал заморачиваться с подобными сложностями и сделал как мог… :-)))
ну, как говорится, дай Бог 🙂
-
Medved
- Сообщения:250
- Зарегистрирован:14 фев 2008, 20:51
- Контактная информация:
23 июн 2008, 21:45
" писал(а):Спасибки большое, мож кому пригодиться текст программы:
Не думаю… Почитай написанное ниже. Код неправильный.
1)это не ошибка, но зачем i присваивать ноль перед циклом “for?
2)if l <r+r[i+1] надо заменить на if (l<r+r[i+1])and(l>abs(r-r[i+1])
3)но даже принципиально кодж неверен. Почему вы сравниваете только радиусы i и i+1? окружность ведь пересекается не только с соседней!
цикл надо делать такой:
Код: Выделить всё
for i:=1 to n do begin
peres:=0;
for j:=1 to n do
if (i<>j)and(l<r[i]+r[j])and(l>abs(r[i]-r[j]) then inc(peres,2) else if (l=r[i]+r[j])or(l=abs(r[i]-r[i+1]) then inc(peres)
writeln('N okruzhnosti ',i,' peresechenij ',peres);
end;
понимаешь, почему так, или объяснить?
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
-
Medved
- Сообщения:250
- Зарегистрирован:14 фев 2008, 20:51
- Контактная информация:
23 июн 2008, 21:48
ладно, сразу объясню.
в условии вы написали:
" писал(а):Найти число пересекающихся окружностей
Надо найти кол-во ОКРУЖНОСТЕЙ.
Но т.к вы также написали
" писал(а):(Ответ: № окружности число пересечений)
то надо найти кол-во ПЕРЕСЕЧЕНИЙ.
А у двух окружностей могут быть 2 пересечения либо одно(когда они кассаются).
Дальше надеюсь, всё понятно.
З.Ы. вот я и senior developer=)
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
-
Хыиуду
- Сообщения:2388
- Зарегистрирован:06 мар 2005, 21:03
- Откуда:Москва
- Контактная информация:
24 июн 2008, 11:45
Medved, поздравляю с повышением
DemonRed, у вас нечетко сформулировано задание. “Найти число пересекающихся окружностей. (Ответ: № окружности число пересечений)” – это бред. Ответ, данный в скобках, предполагает вопрос “Найти число пересечений для каждой окружности”. А “найти число пересекающихся окружностей” (кстати, не число, а количество) – это, по моему мнению, количество разных пар окружностей, таких, что окружности в каждой паре пересекаются.
Еще остается открыт вопрос, считать ли касание окружностей пересечением.
В общем, по-хорошему такие вопросы должны быть объяснены в задании. Но я еще не видел преподавателя, который давал бы нормальные задания.
Искусство программирования – заставить компьютер делать все то, что вам делать лень.
Для “спасибо” есть кнопка “Спасибо” в виде звездочки внизу под ником автора поста.
-
Serge_Bliznykov
- Сообщения:366
- Зарегистрирован:31 авг 2007, 03:06
24 июн 2008, 13:27
Хыиуду,
Medved,
я, конечно, могу ошибаться, но, мне кажется, что господин АвторТопика давно уже потерял интерес к теме (программу? как мы видим, он написал, и, не исключаю, что уже и сдал 🙂 что ему теперь тут делать? Похоже теоретическо-философские изыски, как правильно решить задачу и считается ли касание пересечением его не интересуют… 🙂