Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2007, 18:33   #1
Snord
 
Регистрация: 08.12.2007
Сообщений: 7
По умолчанию Программирование с отображением графической информации(Delphi).

Найти координаты точек пересечения двух окружностей радиуса R1 и R2 с центрами в точках (х1 , у1 ) и (х2 , у2 ) соответственно.
Snord вне форума Ответить с цитированием
Старый 16.12.2007, 20:15   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Необходимо решить систему двух нелинейных уравнений
(x-x1)^2+(y-y1)^2=R1^2
(x-x2)^2+(y-y2)^2=R2^2
система имеет 2 корня если выполняется условие:
sqrt(sqr(x2-x1)+sqr(y2-y1)) < (R1+R2)
если левая часть = (R1+R2), то корень 1, окружности касаются друг друга,
ну, а если левая часть > (R1+R2), то у окружностей нет общих точек.

Последний раз редактировалось _Dmitry; 16.12.2007 в 20:20.
_Dmitry вне форума Ответить с цитированием
Старый 18.12.2007, 18:46   #3
Snord
 
Регистрация: 08.12.2007
Сообщений: 7
По умолчанию

Программу написал: рисует 2 окружности если не пересекаются то выводит- нет общих точек. Если пересекаются выводит точки пересечения...(здесь как понимаю должны быть координаты) как их вывести ?


Вот мой код:
Код:


procedure TForm1.Button1Click(Sender: TObject);
begin
label12.show;
x1:=strtoint(Edit6.text);
y1:=strtoint(edit7.text);
R1:=strtoint(edit10.text);
R2:=strtoint(edit11.text);
with image1.canvas do
begin
MoveTo(x1,y1);
for i:=1 to 1000 do
begin
for j:=1 to 1000 do
begin
if (sqr(r1)=sqr(x1-j)+sqr(y1-i))then with image1.canvas do lineto((x1-j),(y1-i));
end;
end;
end;
with image1.canvas do
begin
moveto(x1,y1);
ellipse(x1,y1,(x1+2*r1),(2*r1+y1));
moveto(x2,y2);
ellipse(x2,y2,(x2+2*r2),(2*r2+y2));
If sqrt(sqr(x2-x1)+sqr(y2-y1)) < (R1+R2) then
Label12.Caption:='Точки пересечения' ;
If sqrt(sqr(x2-x1)+sqr(y2-y1)) > (R1+R2) then
  Label12.Caption:='Точек пересечения нет'
end;
end;


end.
Snord вне форума Ответить с цитированием
Старый 18.12.2007, 19:01   #4
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Чтоб найти координаты, надо найти решение системы.......
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 18.12.2007, 19:17   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А если пойти по другому пути?
Одну окружность нарисовать, допустим, красным цветом и залить, а в процессе рисования (поточечно) второй окружности (например, зеленым цветом) перед рисованием очередной точки проверять цвет в том месте, где она должна рисоваться.
Ведь смысл задания, как я понимаю, не в проверке умения решать системы уравнений, а в проверке умения программировать...
mihali4 вне форума Ответить с цитированием
Старый 18.12.2007, 20:53   #6
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Можно так, x - меняется через 1 пиксел, определяем y по обеим уравнениям и сравниваем, если разница между игреками <=1, то точку пересечения нашли. Затем тоже самое наоборот
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  x1,y1,x2,y2,r1,r2,y11,y22,x11,x22,x,y,i,g1,g2,minx,maxx,miny,maxy: integer;
begin
x1:=100; y1:=100;
x2:=150; y2:=150;
r1:=100; r2:=50;
with Image1.Canvas do
  begin
    Brush.Style:=bsClear;
    Ellipse(x1-r1,y1-r1,x1+r1,y1+r1);
    Ellipse(x2-r2,y2-r2,x2+r2,y2+r2);
  end;
Image1.Canvas.Brush.Style:=bsSolid;
Image1.Canvas.Brush.Color:=clRed;
for i:=1 to 4 do
  begin
    case i of
    1: begin g1:=1; g2:=1; end;
    2: begin g1:=1; g2:=-1; end;
    3: begin g1:=-1; g2:=1; end;
    4: begin g1:=-1; g2:=-1; end;
    end;
    if (x1-r1) < (x2-r2) then minx:=x2-r2
                         else minx:=x1-r1;
    if (x1+r1) < (x2+r2) then maxx:=x1+r1
                         else maxx:=x2+r2;
    if (y1-r1) < (y2-r2) then miny:=y2-r2
                         else miny:=y1-r1;
    if (y1+r1) < (y2+r2) then maxy:=y1+r1
                         else maxy:=y2+r2;
    for x:=minx to maxx do
      begin
        y11:=y1+g1*trunc(sqrt(r1*r1-sqr(x-x1)));
        y22:=y2+g2*trunc(sqrt(r2*r2-sqr(x-x2)));
        if abs(y11-y22) <= 1 then break;
      end;
    if x <= maxx then Image1.Canvas.Ellipse(x-5,y11-5,x+5,y11+5);
    for y:=miny to maxy do
      begin
        x11:=x1+g1*trunc(sqrt(r1*r1-sqr(y-y1)));
        x22:=x2+g2*trunc(sqrt(r2*r2-sqr(y-y2)));
        if abs(x11-x22) <= 1 then break;
      end;
    if y <= maxy then Image1.Canvas.Ellipse(x11-5,y-5,x11+5,y+5);
  end;
end;
_Dmitry вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Системное программирование: Delphi или С++ nazavrik Свободное общение 7 03.09.2008 11:12
Программирование на Delphi на ПКП LeoN Общие вопросы Delphi 2 09.02.2008 03:40
Программирование Delphi vrealmaker Фриланс 2 14.11.2007 09:33
Delphi. Программа, которая использует системные функции для получения информации о файловой системе metamfetamin Помощь студентам 16 08.11.2007 13:24