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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2010, 22:00   #1
Kurai
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 27
По умолчанию построение окружностей в Delphi

Задание следующее:
Отобразить взаимное расположение двух окружностей радиусов R1и R2 с центрами в точках (x1 , y1 ), (х2 , у2 ) соответственно.

Вот что есть на данный момент:

Код:
unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics,
Forms, Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, StdCtrls, ComCtrls, Series,
Clipbrd, Controls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Button1: TButton;
    Button2: TButton;
    Image2: TImage;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x1, y1, r1, x2, y2, r2: integer;
  xomin, xomax, yomin, yomax : extended;
 implementation
{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);// Рисование в Image2
var xmax, ymax, xo, yo : integer;

begin
  x1:=StrToInt(Edit1.Text);
  y1:=StrToInt(Edit2.Text);
  r1:=StrToInt(Edit3.Text);
  xomin:=StrToFloat(Edit4.Text);
  xomax:=StrToFloat(Edit5.Text);
  yomin:=StrToFloat(Edit6.Text);
  yomax:=StrToFloat(Edit7.Text);
  x2:=StrToInt(Edit8.Text);
  y2:=StrToInt(Edit9.Text);
  r2:=StrToInt(Edit10.Text);
     with Image2.Canvas do begin
  Pen.Color:=clBlack;   // Установка цвета карандаша
  Brush.Style:=bsclear;  // Уставнока цвета кисти
  xmax:=Image2.Width;    // Чтение максимальной координаты по x
  ymax:=Image2.Height;   // Чтение максимальной координаты по y
    {Строим оси координат}
    yo:=ymax div 2;
    xo:=xmax div 2;
   MoveTo(0,yo);         LineTo(xmax,yo);
   MoveTo(0,0);           LineTo(0,ymax);
   Pen.Color:=clRed;   // Установка цвета карандаша
   Pen.Width:=2;       // Установка толщины карандаша

//построение окружностей
     begin
      Ellipse(x1-r1,ymax/2-(y1-r1),x1+r1,ymax/2-(y1+r1));
      Ellipse(x2-r2,ymax/2-(y2-r2),x2+r2,ymax/2-(y2+r2));
     end;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='20';   Edit2.Text:='60';    Edit3.Text:='50';    Edit4.Text:='-70';
Edit5.Text:='70';      Edit6.Text:='-10';   Edit7.Text:='10';    Edit8.Text:='-10';
Edit9.Text:='-40';   Edit10.Text:='60';
end;

end.

Ошибка во время создания окружностей: E2250 There is no overloaded version of 'Ellipse' that can be called with these arguments


Но если делать естандартную формулу (х1-r1,y1-r1,x1+r1,y1+r1) все получается... да вот только я же оси сместила, значит и формулу у эллипса нужно поменять...

подскажите пожалуйста!
Kurai вне форума Ответить с цитированием
Старый 08.04.2010, 08:22   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

используйте div для деления
p51x вне форума Ответить с цитированием
Старый 08.04.2010, 09:09   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
используйте div для деления
да нет, лучше подставляемые координаты округлять через round :
Код:
    Ellipse(x1-r1,round(ymax/2-(y1-r1)),x1+r1,round(ymax/2-(y1+r1)));
    Ellipse(x2-r2,round(ymax/2-(y2-r2)),x2+r2,round(ymax/2-(y2+r2)));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2010, 13:58   #4
Kurai
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 27
По умолчанию

Serge_Bliznykov

cпасибо огромное! я вот так записала
Ellipse(round(xo+(x1-r1)), round(yo-(y1-r1)), round(xo+(x1+r1)), round(yo-(y1+r1)));
Ellipse(round(xo+(x2-r2)), round(yo-(y2-r2)), round(xo+(x2+r2)), round(yo-(y2+r2)));

теперь все правильно отображается

мне вот сказали, что каким-то образом можно посчитать, как будут располагаться окружности относительно друг друга (касаться, пересекаться, одна внутри другой...)

никто не знает, как это можно сделать? какой формулой нужно воспользоваться?
Kurai вне форума Ответить с цитированием
Старый 08.04.2010, 14:21   #5
Orakul89
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию

если (r1+r2)-(sqrt(sqr(x2-x1)+sqr(y2-y1))) :
= 0 то окружности соприкасаються;
>0 то пересекаються(или одна внутри другой)
Orakul89 вне форума Ответить с цитированием
Старый 08.04.2010, 14:28   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

погодите-ка..
Kurai, судя по всему у Вас обе окружности имеют один центр?!!

тогда расстояние между центрами считать не надо (оно будет равно нулю! )
сравните радиусы.
if r1= r2 - окружности полностью совпадают,
if r1>r2 - окружность вторая внутри первой окружности
if r1<r2 - окружность первая внутри второй окружности

__________________
добавлено
нет, похоже, я был неправ, окружности имеют разные центры...

Последний раз редактировалось Serge_Bliznykov; 08.04.2010 в 14:30.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2010, 19:40   #7
Kurai
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 27
По умолчанию

Orakul89
так...а если у нас разность радиусов отрицательна? лучше модуль взять, да?

ну вот, я все взяла, расписала... теперь хочу, чтобы у меня текстом в Memo выводился ответ, но что-то программа ничего не выдает...Memo тупо пустой

вот что я вставила
Код:
procedure TForm1.Button2Click(Sender: TObject);
var  m:extended;
begin
m:=sqrt(sqr(abs(x2-x1))+sqr(abs(y2-y1)));
if m=r1+r2 then  Memo1.Lines.Add('Окружности имеют только одну общую точку')
else if m<r1-r2 then  Memo1.Lines.Add('Одна окружность лежит внутри другой' )
else if m=r1-r2 then  Memo1.Lines.Add('Одна окружность касается другой изнутри')
else if m>r1-r2 then if m<r1+r2 then  Memo1.Lines.Add('Окружности пересекаются')
else Memo1.Lines.Add('Окружности не затрагивают друг друга') ;
end;
это мой последний вопрос)
Kurai вне форума Ответить с цитированием
Старый 08.04.2010, 20:29   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

прежде всего - abs можете смело выкинуть.
sqr - это возведение в квадрат - а любое число в квадрате даёт положительное значение.

а во-вторых, не подтверждаю - в Мемо прекрасно добавляется...

Последний раз редактировалось Serge_Bliznykov; 08.04.2010 в 20:59.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2010, 22:00   #9
Kurai
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 27
По умолчанию

Serge_Bliznykov
это я формулу не так прочитала, вот косая!

да, я сейчас заново программу написала - стало все работать!
спасибо большое за помощь!
Kurai вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение спирали на Delphi loonymen Помощь студентам 2 19.04.2010 09:44
Построение графика [Delphi] StudeHt Помощь студентам 7 23.12.2009 21:11
построение окружности по 3 точкам в Delphi ксона Помощь студентам 16 12.12.2009 17:14
Построение графика в Delphi сер4ей Помощь студентам 0 25.04.2009 15:15