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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2017, 13:55   #1
Эцио
 
Аватар для Эцио
 
Регистрация: 09.02.2017
Сообщений: 6
По умолчанию Нахождение диагоналей оси

Мои наработки:
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var C:array of tCube;
i,j,n,d:Integer;
begin
n:=StrToInt(Edit1.Text);
SetLength(C,n);
for i := Low(C) to High(C) do
begin
C[I].x:=StrToFloat(InputBox('Ввод данных','Введите абсциссу ' + IntToStr(i+1)+' квадрата','0'));
C[I].y:=StrToFloat(InputBox('Ввод данных','Введите ординату ' + IntToStr(i+1)+' квадрата','0'));
C[I].r:=StrToFloat(InputBox('Ввод данных','Введите длину сторон ' + IntToStr(i+1)+' квадрата','0'));
PaintBox1.Canvas.Rectangle(Round(C[I].x),Round(C[I].y),Round(C[I].x + C[i].r),Round(C[I].y + C[i].r));
end;
for i := Low(C) to High(C)-1 do
for j := i+1 to High(C) do
if Peres(C[i],C[j]) then
Memo1.Lines.Add(IntToStr(i+1)+','+IntToStr(j+1)+' Пересекающиеся квадраты');
if Memo1.Lines.Count <= 0 then
Memo1.Lines.Add('Таких пересекающихся квадратов нет');
Finalize(C);
end;
procedure TForm1.Lf1Click(Sender: TObject);
begin
ShowMessage('стороны');
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.N3Click(Sender: TObject);
begin
Edit1.Text:='';
Memo1.Clear;
end;
function TForm1.Peres(a,b: tCube):Boolean;
begin
if
((a.x = b.x + b.r) and (a.y = b.y + b.r)) or
((a.x + a.r = b.x) and (a.y = b.y + b.r)) or
((a.x = b.x+b.r) and (a.y + a.r = b.y)) or
((a.x + a.r = b.x) and (a.y + a.r = b.y))
then
Peres:=True else Peres:=False;
end;
end.
Это нахождение сторон параллельных оси. Мне ещё нужно добавить нахождение диагоналей оси.
Кто знает помогите пожалуйста.

Последний раз редактировалось Аватар; 05.04.2017 в 16:20.
Эцио вне форума Ответить с цитированием
Старый 05.04.2017, 14:08   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Мои наработки:
к ЧЕМУ?
Цитата:
нахождение диагоналей оси.
что есть диагональ линии? А ось это есть линия.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.04.2017 в 14:22.
evg_m вне форума Ответить с цитированием
Старый 05.04.2017, 14:11   #3
Эцио
 
Аватар для Эцио
 
Регистрация: 09.02.2017
Сообщений: 6
По умолчанию

Ээээ... Что? Я не понимаю вопрос.
Мне нужно прокомментировать код что-ли?
Эцио вне форума Ответить с цитированием
Старый 05.04.2017, 14:22   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Эцио Посмотреть сообщение
Я не понимаю вопрос.
задание какое?

и в чём, собственно вопрос?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.04.2017, 14:26   #5
Эцио
 
Аватар для Эцио
 
Регистрация: 09.02.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
задание какое?

и в чём, собственно вопрос?
На плоскости имеется N квадратов с диагоналями, параллельными осям координат. Найти все пары, пересекающиеся в одной точке.
Эцио вне форума Ответить с цитированием
Старый 05.04.2017, 14:51   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так. задание понятно.

хочу уточнить. что такое "пересекающиеся в одной точке" ?
может быть, вопрос звучит "имеющие хотя бы одну ОБЩУЮ точку"?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.04.2017, 15:26   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вопрос про пересечения особенно актуален после того, как я посмотрел работу вашей программы:

primer_square.png

если что, вот код, которым я это проверил:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TSquare = record
    x, y, r: Double;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    PaintBox1: TPaintBox;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    function Peres(a, b: TSquare): Boolean;
    procedure Lf1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  primerArray: array[0..3] of TSquare =
  (
    (x: 22; y: 32; r: 20),
    (x:100; y:100; r:300),
    (x: 10; y: 10; r: 300),
    (x: 20; y: 20; r: 100)
  );
var C: array of TSquare;
  i, j, n, d: Integer;
begin
  Memo1.Lines.Clear;
  //n:=StrToInt(Edit1.Text);
  n := Length(primerArray); Edit1.Text := IntToStr(n);
  SetLength(C, n);
  PaintBox1.Canvas.Brush.Style := bsClear;
  for i := Low(C) to High(C) do
  begin
    C[i] := primerArray[i];
    (*C[I].x := StrToFloat(InputBox('Ввод данных', 'Введите абсциссу ' + IntToStr(i + 1) + ' квадрата', '0'));
    C[I].y := StrToFloat(InputBox('Ввод данных', 'Введите ординату ' + IntToStr(i + 1) + ' квадрата', '0'));
    C[I].r := StrToFloat(InputBox('Ввод данных', 'Введите длину сторон ' + IntToStr(i + 1) + ' квадрата', '0'));
    *)
    PaintBox1.Canvas.Rectangle(Round(C[I].x), Round(C[I].y), Round(C[I].x + C[i].r), Round(C[I].y + C[i].r));
  end;
  for i := Low(C) to High(C) - 1 do
    for j := i + 1 to High(C) do
      if Peres(C[i], C[j]) then
        Memo1.Lines.Add(IntToStr(i + 1) + ',' + IntToStr(j + 1) + ' Пересекающиеся квадраты');
  if Memo1.Lines.Count <= 0 then
    Memo1.Lines.Add('Таких пересекающихся квадратов нет');
  Finalize(C);
end;

procedure TForm1.Lf1Click(Sender: TObject);
begin
  ShowMessage('стороны');
end;

procedure TForm1.N2Click(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
  Edit1.Text := '';
  Memo1.Clear;
end;

function TForm1.Peres(a, b: TSquare): Boolean;
begin
  if
    ((a.x = b.x + b.r) and (a.y = b.y + b.r)) or
    ((a.x + a.r = b.x) and (a.y = b.y + b.r)) or
    ((a.x = b.x + b.r) and (a.y + a.r = b.y)) or
    ((a.x + a.r = b.x) and (a.y + a.r = b.y))
    then
    Peres := True else Peres := False;
end;

end.
исходники проекта: SquareCrossed.rar

Последний раз редактировалось Serge_Bliznykov; 05.04.2017 в 15:28.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.04.2017, 15:42   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
может быть, вопрос звучит "имеющие хотя бы одну ОБЩУЮ точку"?
Цитата:
Найти все пары, пересекающиеся в одной точке.
Имеющие РОВНО одну общую точку.
Для квадратов имеющих параллельные стороны такое возможно только для ОБЩЕЙ вершины и "диагонального" расположения.
диагональное для квадратов со сторонами параллельными осям это
Код:
a -  - a  b -  - b
- b  b -  - a  a -
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.04.2017 в 15:48.
evg_m вне форума Ответить с цитированием
Старый 05.04.2017, 16:07   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Имеющие РОВНО одну общую точку.
ага. согласен.


вот только сравнивать вещественные числа на равенство с помощью = нельзя!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.04.2017, 17:27   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

А вот вариант для квадратов, диагонали которых расположены параллельно осям координат:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TSquare = record
    x, y, diag: Double;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    PaintBox1: TPaintBox;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    function Peres(a, b: TSquare): Boolean;
    procedure Lf1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  primerArray: array[0..4] of TSquare =
  (
    (x: 60; y: 160; diag: 100),
    (x: 160; y: 160; diag: 100),
    (x: 260; y: 160; diag: 100),
    (x: 10; y: 310; diag: 200),
    (x: 60; y: 460; diag: 100)
  );
var C: array of TSquare;
  i, j, n, d: Integer;
begin
  Memo1.Lines.Clear;
  //n:=StrToInt(Edit1.Text);
  n := Length(primerArray); Edit1.Text := IntToStr(n);
  SetLength(C, n);
  PaintBox1.Canvas.Brush.Style := bsClear;
  for i := Low(C) to High(C) do
  begin
    C[i] := primerArray[i];
    (*C[I].x := StrToFloat(InputBox('Ввод данных', 'Введите абсциссу крайней левой вершины ' + IntToStr(i + 1) + ' квадрата', '0'));
    C[I].y := StrToFloat(InputBox('Ввод данных', 'Введите ординату крайней левой вершины ' + IntToStr(i + 1) + ' квадрата', '0'));
    C[I].diag := StrToFloat(InputBox('Ввод данных', 'Введите длину диагонали ' + IntToStr(i + 1) + ' квадрата', '0'));
    *)
    PaintBox1.Canvas.Polygon([Point(Round(C[I].x), Round(C[I].y)),Point(Round(C[I].x+C[i].diag/2), Round(C[I].y-C[i].diag/2)),
       Point(Round(C[I].x+C[i].diag), Round(C[I].y)),Point(Round(C[I].x+C[i].diag/2), Round(C[I].y++C[i].diag/2))]);
  end;
  for i := Low(C) to High(C) - 1 do
    for j := i + 1 to High(C) do
      if Peres(C[i], C[j]) then
        Memo1.Lines.Add(IntToStr(i + 1) + ',' + IntToStr(j + 1) + ' Пересекающиеся квадраты');
  if Memo1.Lines.Count <= 0 then
    Memo1.Lines.Add('Таких пересекающихся квадратов нет');
  Finalize(C);
end;

function isEqual(a,b : Double ) : boolean;
begin
  isEqual := abs(a-b)<0.00001;
end;

function TForm1.Peres(a, b: TSquare): Boolean;
begin
   Peres := (isEqual( a.x, b.x+b.diag ) and isEqual( a.y, b.y ))
             or
            (isEqual( a.x+a.diag/2, b.x+b.diag/2 ) and isEqual( a.y-a.diag/2, b.y+b.diag/2 ))
             or
            (isEqual( a.x+a.diag, b.x ) and isEqual( a.y, b.y ))
             or
            (isEqual( a.x+a.diag/2, b.x+b.diag/2 ) and isEqual( a.y+a.diag/2, b.y-b.diag/2 ))
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Суммы диагоналей матрицы, параллельных побочной(С++) anastasiyakrit Помощь студентам 3 15.11.2016 10:49
Переворот диагоналей Death-woolf Общие вопросы по Java, Java SE, Kotlin 11 08.05.2014 12:59
Вывод всех диагоналей массива Ardentis Помощь студентам 6 03.11.2013 16:17
Ромб с вводом диагоналей (TASM) demon2321 Помощь студентам 0 30.11.2011 08:47
Сортировка диагоналей матрицы skiffter Общие вопросы Delphi 8 07.10.2009 19:40