Паскаль как найти точку пересечения окружностей

Формулировка задачи:

Даны координаты центров двух окружностей (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.

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    Пересечение окружностей в паскале

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    07.11.08, 10:51

      Junior

      *

      Рейтинг (т): нет

      Народ, помогите, пожалуйста решить/доделать задачки…

      в общем вот 1 задача:

      Цитата

      1. Пересечение окружностей
      На плоскости даны две окружности. Требуется проверить, пересекаются ли они.
      Входные данные
      Входной файл INPUT.TXT состоит из двух строк. На каждой строке записана информация об одной окружности – координаты ее центра x и y (целые числа, по модулю не превосходящие 5000) и радиус (целое число 1 ≤ r ≤ 1000).
      Выходные данные
      В выходной файл OUTPUT.TXT выведите «YES», если окружности пересекаются, и «NO» в противном случае.
      Примеры
      №****INPUT.TXT****OUTPUT.TXT
      1******0 0 2*********YES
      *******0 3 2
      2******1 1 1********* NO
      *******4 4 1

      вот мое решение, но оно не правильно работает…

      ExpandedWrap disabled

        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

      Guru

      volvo877



      Сообщ.
      #2

      ,
      07.11.08, 11:08

        Moderator

        *******

        Рейтинг (т): 878

        Цитата Chel @ 07.11.08, 10:51

        Определите количество сверхпростых чисел, не превышающих натурального числа N.

        Это вообще олимпиадная задача, и как минимум на двух серверах сейчас она активна… Как ты думаешь, это нам надо, решать тебе, чтоб ты “скопировал и сдал”? Делай, что не получится, спрашивай… Начни с того, что такое вообще сверхпростое число.

        !

        P.S. Измени заголовок темы, иначе через час она будет закрыта…
        Правила надо читать.


        Chel



        Сообщ.
        #3

        ,
        07.11.08, 11:12

          Junior

          *

          Рейтинг (т): нет

          volvo877
          сори с заголовком.. сейчас поменяю…
          со 2(код позже приведу, тк сча нету флэхи с задачей) и 3 ладно..
          а что можете сказать на счет 1 задачи???

          Сообщение отредактировано: Chel – 07.11.08, 11:17


          albom



          Сообщ.
          #4

          ,
          07.11.08, 11:24

            Senior Member

            ****

            Рейтинг (т): 20

            условие пересечения двух окружностей:

             ( d < r1 + r2 ) and ( d > abs(r1 - r2) )
            где
              d = sqrt( sqr(x1 - x2) + sqr(y1 - y2) )


            miksayer



            Сообщ.
            #5

            ,
            07.11.08, 11:48

              ребят, извиняюсь за оффтоп. А что за сверхпростые числа? в википедии смотрел, не нашел


              albom



              Сообщ.
              #6

              ,
              07.11.08, 12:01

                Senior Member

                ****

                Рейтинг (т): 20

                Это просто число, обладающие неким замечательным свойством. В чем же именно состоит это замечательное свойство Chel решил нам не говорить.
                Лично мне встечалось несколько различных способов его задания. Естественно в разных способах разные числа называются сверхпростыми


                Chel



                Сообщ.
                #7

                ,
                07.11.08, 12:09

                  Junior

                  *

                  Рейтинг (т): нет

                  вот что нашел в инете по поводу сверхпростых чисел:

                  Цитата

                  Простым числом будем называть натуральное число, большее единицы и делящееся только на единицу и на само себя. Выпишем все простые числа в порядке возрастания и i-ое в этом порядке число обозначим pi (число 2 при этом будет иметь номер 1). Так, например, p1 = 2, p2 = 3, p3 = 5, p52 = 239.

                  Скажем, что число pi является сверхпростым, если i = pk для некоторого k. Иными словами, сверхпростое число — это простое число, номер которого в списке простых чисел, упорядоченном по возрастанию, является простым числом.

                  Сообщение отредактировано: Chel – 07.11.08, 12:10


                  FasterHarder



                  Сообщ.
                  #8

                  ,
                  07.11.08, 12:11

                    Может поможет данная программа по поиску свпростых чисел
                    P.S. сам не тестил, может исходник вообще “левый”…думаю автор разберется, нужно ли это было….

                    Сообщение отредактировано: FasterHarder – 07.11.08, 12:12


                    Chel



                    Сообщ.
                    #9

                    ,
                    07.11.08, 12:17

                      Junior

                      *

                      Рейтинг (т): нет

                      FasterHarder
                      спасибо, сейчас буду разбираться в ней!

                      а что на счет 1 задачи.. что у меня в коде не верно? может кто подсказать? :unsure:


                      albom



                      Сообщ.
                      #10

                      ,
                      07.11.08, 12:19

                        Senior Member

                        ****

                        Рейтинг (т): 20

                        У тебя условие неверное.

                        Цитата Chel @ 07.11.08, 12:17

                        может кто подсказать?

                        Запись верного условия не является достаточной подсказкой? :blink:

                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                        0 пользователей:

                        • Предыдущая тема
                        • Pascal
                        • Следующая тема

                        Рейтинг@Mail.ru

                        [ 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 2
                        YES
                        2 1 1 1
                        4 4 1
                        NO

                        Разбор решения задачи

                        Эту задачу можно решить множеством различных способов. Например, записать уравнения двух окружностей и найти точки их пересечения аналитически. Программе при этом останется лишь произвести расчет по вашим формулам.

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

                        В первых трех случаях цетр каждой окружности размещен снаружи другой окружности. Установить это можно сравнивая расстояние между центрами окружностей с суммой радиусов.

                        Во вторых трех случаях центр одной окружности находится внутри другой:

                        Для решения нам потребуется вычислять расстояние между точками (центрами окружностей) — реализация этой части приведена тут.

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

                        Следующая программа последовательно перебирает все описанные выше варианты размещения окружностей, однако это не обязательно (можно упростить). Ведь общих точек у окружностей не будет только в двух случаях — можно было проверить только их:

                        #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

                        Хыиуду, задачка то с подковыркой… 🙂

                        &quot писал(а):Две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов.

                        к сожалению, не так… они могут и не пересекаться в случае когда меньшая окружность полностью внутри большей…

                        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

                        &quot писал(а):Спасибки большое, мож кому пригодиться текст программы:

                        Не думаю… Почитай написанное ниже. Код неправильный.
                        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

                        ладно, сразу объясню.

                        в условии вы написали:

                        &quot писал(а):Найти число пересекающихся окружностей

                        Надо найти кол-во ОКРУЖНОСТЕЙ.
                        Но т.к вы также написали

                        &quot писал(а):(Ответ: № окружности число пересечений)

                        то надо найти кол-во ПЕРЕСЕЧЕНИЙ.
                        А у двух окружностей могут быть 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,
                        я, конечно, могу ошибаться, но, мне кажется, что господин АвторТопика давно уже потерял интерес к теме (программу? как мы видим, он написал, и, не исключаю, что уже и сдал 🙂 что ему теперь тут делать? Похоже теоретическо-философские изыски, как правильно решить задачу и считается ли касание пересечением его не интересуют… 🙂

                        Добавить комментарий