![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Вот вся программа...
|