Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.03.2010, 12:26
vovey vovey вне форума
Прохожий
 
Регистрация: 17.03.2010
Сообщения: 8
Репутация: 10
По умолчанию Помогите найти ошибку! Работа для курсовой

Ошибка в том:
Найти три точки: Самую высшую,самую левую и самую правую точки.Построить треугольник! А он не строит((


Код:
procedure TForm1.Button1Click(Sender: TObject);
var q,p,s,i,n,m,j,h,b,b1,b2,b3:integer;
    x,y:real;
    a:array[1..30] of TPoint;
    m1:array[1..3] of TPoint;
begin
      memo1.Clear;
      for i:=1 to strtoint(edit3.Text) do
      begin
      randomize;
            with image1.canvas do
            begin
            n:=(image1.width-250-strtoint(edit2.Text)*3)+random(image1.width-80);
            m:=(image1.Height-250-strtoint(edit2.Text)*3)+random(image1.Height-50);
            x:=n;
            y:=m;
            memo1.Lines.Add('№'+inttostr(i)+' ('+floattostrf(x,fffixed,3,0)+':'+floattostrf(y,fffixed,3,0)+')');
            p:=10+random(385);
            s:=10+random(385);
            image1.Canvas.Pen.Width:=5;
            image1.Canvas.Pen.Color:=clGreen;
            image1.Canvas.Ellipse(n-1,image1.Height-(m-1),n+1,image1.Height-(m+1));
            image1.Canvas.TextOut(n,image1.Height-(m),'№'+inttostr(i));
            a[i].X:=n;
            a[i].Y:=m;
      end;
            image1.Canvas.Pen.Width:=1;
            image1.Canvas.Pen.Color:=clblack;
            image1.Canvas.Font.Size:=7;
            memo1.Visible:=true;

      end;

            m1[1].Y:=a[1].y;
            for b:=1 to strtoint(edit3.Text) do
            if (a[b].Y>m1[1].Y)
            then begin m1[1].Y:=a[b].Y;
                       m1[1].X:=a[b].X;
      end;
            m1[2].X:=a[1].X;
            for b:=1 to strtoint(edit3.Text) do
            if (a[b].X>m1[2].X)
            then begin m1[2].X:=a[b].X;
                       m1[2].Y:=a[b].Y;
      end;
            m1[3].X:=a[1].X;
            for b:=1 to strtoint(edit3.Text) do
            if (a[b].X<m1[3].X)
            then begin m1[3].X:=a[b].X;
                       m1[3].Y:=a[b].Y;
      end;
            image1.Canvas.MoveTo(m1[1].X,image1.Height-m1[1].Y);
            image1.Canvas.LineTo(m1[2].X,image1.Height-m1[2].Y);

            image1.Canvas.MoveTo(m1[2].X,image1.Height-m1[2].Y);
            image1.Canvas.LineTo(m1[3].X,image1.Height-m1[3].Y);

            image1.Canvas.MoveTo(m1[3].X,image1.Height-m1[3].Y);
            image1.Canvas.LineTo(m1[1].X,image1.Height-m1[1].Y);


end;
__________________
пвапвап
Ответить с цитированием
  #2  
Старый 29.03.2010, 12:59
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Какой то треугольник строит, я вводил малые цифры 2..4...
Далее вскрытие покажет...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #3  
Старый 29.03.2010, 18:17
vovey vovey вне форума
Прохожий
 
Регистрация: 17.03.2010
Сообщения: 8
Репутация: 10
По умолчанию

Вот полное задание!




Задаваемое кол-во точек (3..30) генерируется случайным образом на координатной плоскости 40*40.Найти три точки: Самую высшую,самую левую и самую правую точки.Построить треугольник и подсчитать количество точек,находящихся внутри треугольника и снаружи!


А ошибка где-то при построении треугольника,найти только не могу((
__________________
пвапвап
Ответить с цитированием
  #4  
Старый 29.03.2010, 18:19
vovey vovey вне форума
Прохожий
 
Регистрация: 17.03.2010
Сообщения: 8
Репутация: 10
По умолчанию

Ошибка как я понимаю тут,а где она не знаю!


Код:
            m1[1].Y:=a[1].y;
            for b:=1 to strtoint(edit3.Text) do
            if (a[b].Y>m1[1].Y)
            then begin m1[1].Y:=a[b].Y;
                       m1[1].X:=a[b].X;
      end;
            m1[2].X:=a[1].X;
            for b:=1 to strtoint(edit3.Text) do
            if (a[b].X>m1[2].X)
            then begin m1[2].X:=a[b].X;
                       m1[2].Y:=a[b].Y;
      end;
            m1[3].X:=a[1].X;
            for b:=1 to strtoint(edit3.Text) do
            if (a[b].X<m1[3].X)
            then begin m1[3].X:=a[b].X;
                       m1[3].Y:=a[b].Y;
      end;
            image1.Canvas.MoveTo(m1[1].X,image1.Height-m1[1].Y);
            image1.Canvas.LineTo(m1[2].X,image1.Height-m1[2].Y);

            image1.Canvas.MoveTo(m1[2].X,image1.Height-m1[2].Y);
            image1.Canvas.LineTo(m1[3].X,image1.Height-m1[3].Y);

            image1.Canvas.MoveTo(m1[3].X,image1.Height-m1[3].Y);
            image1.Canvas.LineTo(m1[1].X,image1.Height-m1[1].Y);


end;
__________________
пвапвап
Ответить с цитированием
  #5  
Старый 30.03.2010, 07:58
vovey vovey вне форума
Прохожий
 
Регистрация: 17.03.2010
Сообщения: 8
Репутация: 10
По умолчанию

Ау,помогите,плиЗ!!!!!!!!!!!!!!!(((((((((
__________________
пвапвап
Ответить с цитированием
  #6  
Старый 30.03.2010, 09:04
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Хорошо, настроение подходящее...но сначала ответь, что делет Edit2...Edit3 как я понимаю задает количество точек...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...

Последний раз редактировалось NIch, 30.03.2010 в 09:07.
Ответить с цитированием
  #7  
Старый 30.03.2010, 09:30
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Я бы так сделал:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure DrawDot(x, y: Integer);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ax: array[1..30] of Integer;
  ay: array[1..30] of Integer;

implementation

{$R *.dfm}

procedure TForm1.DrawDot(x, y : Integer);
begin
  // Ðèñóåì òî÷êó ñ ïåðåâîäîì îòñ÷åòà íóëåâîé òî÷êè
  PaintBox1.Canvas.MoveTo(40 - x, 40 - y);
  PaintBox1.Canvas.LineTo(40 - (x + 1), 40 - y);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  tx1, ty1, tx2, ty2, tx3, ty3 : Integer;
  rect : TRect;
begin
  // Î÷èùàåì îáëàñòü ðèñîâàíèÿ
  rect.Left := 0;
  rect.Top  := 0;
  rect.Bottom := 41;
  rect.Right  := 41;
  PaintBox1.Canvas.Brush.Color := clBtnFace;

  if SpinEdit1.Value > 30 then SpinEdit1.Value := 30;
  PaintBox1.Canvas.FillRect(rect);
// Ãåíåðèðóåì è ðèñóåì òî÷êè
  Randomize;
  for i:= 1 to SpinEdit1.Value do
  begin
    ax[i] := random(40);
    ay[i] := random(40);
    DrawDot(ax[i], ay[i]);
  end;

// Èùåì ñàìóþ âûñøóþ òî÷êó
  tx1 := 0;
  ty1 := 0;
  for i:= 1 to SpinEdit1.Value do
  begin
    if ay[i] > ty1 then
      begin
        ty1 := ay[i];
        tx1 := ax[i];
      end;
  end;

// Èùåì ñàìóþ ëåâóþ òî÷êó
  tx2 := 40;
  ty2 := 0;
  for i:= 1 to SpinEdit1.Value do
  begin
    if ax[i] < tx2 then
      begin
        ty2 := ay[i];
        tx2 := ax[i];
      end;
  end;

// Èùåì ñàìóþ ïðàâóþ òî÷êó
  tx3 := 0;
  ty3 := 0;
  for i:= 1 to SpinEdit1.Value do
  begin
    if ax[i] > tx3 then
      begin
        ty3 := ay[i];
        tx3 := ax[i];
      end;
  end;

// Ñòðîèì ïî íàéäåííûì òî÷êàì òðåóãîëüíèê

  PaintBox1.Canvas.MoveTo(40 - tx1, 40 - ty1);
  PaintBox1.Canvas.LineTo(40 - tx2, 40 - ty2);
  PaintBox1.Canvas.LineTo(40 - tx3, 40 - ty3);
  PaintBox1.Canvas.LineTo(40 - tx1, 40 - ty1);

end;

end.
Ответить с цитированием
  #8  
Старый 30.03.2010, 10:30
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
Лампочка Практически готовый код

Позволил себе чуть подправить код...
Данный код рисует точки и треугольники и вычисляет точки внутри него...но есть небольшое исключение которое нужно обрабатывать...точка может быть и самой верхней и самой левой к примеру...
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 x, y, n, i: integer;
 a: array[1..30] of TPoint;
 m1: array[1..3] of TPoint;
begin
 randomize;//Генератор
 Memo1.Clear;//Очистить мемо
 Image1.Picture := nil;//очистить имедж
 n := StrToInt(Edit3.Text);//количество точек
 //Установки канвас
 image1.Canvas.Pen.Width:=5;
 image1.Canvas.Pen.Color:=clGreen;
 image1.Canvas.Font.Size:=7;
 //Расчмтать точки
 for i:= 1 to n do//до количества точек делать
 begin
  x := Random(Image1.Width);//координата X
  y := Random(Image1.Height);//Координата Y
  memo1.Lines.Add(' №'+inttostr(i)+'  ('+inttostr(x)+' : '+ //вывод на экран
                                         inttostr(y)+')');
  image1.Canvas.Ellipse(x-1, y-1, x+1, y+1);//рисовать точки
  image1.Canvas.TextOut(x+2, y, '№'+inttostr(i));//рисовать текст
  a[i].X:=x;//заполнить массив
  a[i].Y:=y;
 end;
 //Установки канвас
 image1.Canvas.Pen.Width:=1;
 image1.Canvas.Pen.Color:=clblack;
 //расчитать треугольник
 m1[1].Y:= a[1].y;//самая высшая
 m1[2].X:= a[1].X;//самая левая
 m1[3].X:= a[1].X;//самая правая
 for i:=1 to n do
 begin
  if (a[i].Y > m1[1].Y) then
  begin
   m1[1].Y := a[i].Y;
   m1[1].X := a[i].X;
  end;
  if (a[i].X > m1[2].X) then
  begin
   m1[2].X := a[i].X;
   m1[2].Y := a[i].Y;
  end;
  if (a[i].X < m1[3].X) then
  begin
   m1[3].X := a[i].X;
   m1[3].Y := a[i].Y;
  end;
 end;
 //вывестин на экран треугольник
 image1.Canvas.MoveTo(m1[1].X, m1[1].Y);
 image1.Canvas.LineTo(m1[2].X, m1[2].Y);
 image1.Canvas.LineTo(m1[3].X, m1[3].Y);
 image1.Canvas.LineTo(m1[1].X, m1[1].Y);
 //Проверка точек
 for i := 1 to n do
  if PointInTriangle(a[i], m1[1], m1[2], m1[3]) = true
   then
    memo1.Lines.Add (IntToStr(i));
end;
//Принадлежит точка треугольнику или нет
//Самый простой способ такой: соединяешь точку с вершинами треугольника,
//считаешь площадь малеьких треугольников, если сумма площадей равна площади
//большего трегольника, то точка внутри, иначе снаружи.
//Способ был предложен тут  forum.vingrad.ru
Function PointInTriangle(p, a, b, c : TPoint): boolean;
var
 Square, Square1, Square2, Square3  : real;
begin
 Square :=  abs(((a.X-c.X)*(b.Y-c.Y))-((b.X-c.X)*(a.Y-c.Y)));
 Square1 := abs(((p.X-b.X)*(a.Y-b.Y))-((a.X-b.X)*(p.Y-b.Y)));
 Square2 := abs(((p.X-c.X)*(a.Y-c.Y))-((a.X-c.X)*(p.Y-c.Y)));
 Square3 := abs(((p.X-c.X)*(b.Y-c.Y))-((b.X-c.X)*(p.Y-c.Y)));
 if Square = (Square1 + Square2 + Square3) then
  Result:= true
 else
  Result:= false;
end;
__________________
В начале был Бит, потом Байт и только потом появилось Слово...

Последний раз редактировалось NIch, 30.03.2010 в 11:15. Причина: исправление ошибок
Ответить с цитированием
  #9  
Старый 01.04.2010, 13:05
vovey vovey вне форума
Прохожий
 
Регистрация: 17.03.2010
Сообщения: 8
Репутация: 10
По умолчанию

А что такое PointInTriangle?Что за компонент?
__________________
пвапвап
Ответить с цитированием
  #10  
Старый 01.04.2010, 14:23
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Это не компонент...Смотри листинг до конца...
Это функция которая определяет:
Цитата:
Принадлежит точка треугольнику или нет
Там же описан принцип работы функции...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #11  
Старый 02.04.2010, 09:39
vovey vovey вне форума
Прохожий
 
Регистрация: 17.03.2010
Сообщения: 8
Репутация: 10
По умолчанию

а как программа будет работать,если функция PointInTriangle задается позже проверок точек ?
__________________
пвапвап
Ответить с цитированием
  #12  
Старый 02.04.2010, 10:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Нормально, если предварительно ее описание вынести в секцию interface
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 02.04.2010, 12:04
vovey vovey вне форума
Прохожий
 
Регистрация: 17.03.2010
Сообщения: 8
Репутация: 10
По умолчанию

У меня выдает ошибку,если я ставлю так:
Код:
interface

 Function PointInTriangle(p, a, b, c : TPoint): boolean;

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

type
Или как нужно ее записать?
__________________
пвапвап
Ответить с цитированием
  #14  
Старый 02.04.2010, 12:36
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от vovey
У меня выдает ошибку,если я ставлю так:
Код:
interface

 Function PointInTriangle(p, a, b, c : TPoint): boolean;

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

type
Или как нужно ее записать?

Описали правильно, только переместите после uses и желательно после описания типов.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 02.04.2010, 12:57
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Вот вся программа...
Вложения
Тип файла: rar 29.03.2010.rar (2.0 Кбайт, 7 просмотров)
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025