![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Ошибка в том:
Найти три точки: Самую высшую,самую левую и самую правую точки.Построить треугольник! А он не строит(( Код:
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
|
||||
|
||||
![]() Какой то треугольник строит, я вводил малые цифры 2..4...
Далее вскрытие покажет... В начале был Бит, потом Байт и только потом появилось Слово... |
#3
|
|||
|
|||
![]() Вот полное задание!
Задаваемое кол-во точек (3..30) генерируется случайным образом на координатной плоскости 40*40.Найти три точки: Самую высшую,самую левую и самую правую точки.Построить треугольник и подсчитать количество точек,находящихся внутри треугольника и снаружи! А ошибка где-то при построении треугольника,найти только не могу(( пвапвап |
#4
|
|||
|
|||
![]() Ошибка как я понимаю тут,а где она не знаю!
Код:
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
|
|||
|
|||
![]() Ау,помогите,плиЗ!!!!!!!!!!!!!!!(((((((((
пвапвап |
#6
|
||||
|
||||
![]() Хорошо, настроение подходящее...но сначала ответь, что делет Edit2...Edit3 как я понимаю задает количество точек...
В начале был Бит, потом Байт и только потом появилось Слово... Последний раз редактировалось NIch, 30.03.2010 в 09:07. |
#7
|
|||
|
|||
![]() Я бы так сделал:
Код:
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
|
||||
|
||||
![]() Позволил себе чуть подправить код...
Данный код рисует точки и треугольники и вычисляет точки внутри него...но есть небольшое исключение которое нужно обрабатывать...точка может быть и самой верхней и самой левой к примеру... Код:
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
|
|||
|
|||
![]() А что такое PointInTriangle?Что за компонент?
пвапвап |
#10
|
||||
|
||||
![]() Это не компонент...Смотри листинг до конца...
Это функция которая определяет: Цитата:
В начале был Бит, потом Байт и только потом появилось Слово... |
#11
|
|||
|
|||
![]() а как программа будет работать,если функция PointInTriangle задается позже проверок точек ?
![]() пвапвап |
#12
|
||||
|
||||
![]() Нормально, если предварительно ее описание вынести в секцию interface
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#13
|
|||
|
|||
![]() У меня выдает ошибку,если я ставлю так:
Код:
interface Function PointInTriangle(p, a, b, c : TPoint): boolean; uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type пвапвап |
#14
|
||||
|
||||
![]() Цитата:
Описали правильно, только переместите после uses и желательно после описания типов. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#15
|
||||
|
||||
![]() Вот вся программа...
В начале был Бит, потом Байт и только потом появилось Слово... |