Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

Подчсет количества многоугольников   Найти похожие ветки 

 
bogdan   (2005-08-27 17:54) [0]

Привет, и вновь я со своими вопросами. У меня задание : нужно на image построить n прямых и посчитать все многоугольники , которые появились и закрасить их разными цветами. Вот я сделал расстановку прямых и вроде рассчет количества многоугольников, но он почему то не пашет. Может вы проверите.
алгоритм подсчета придумал следующий. есть массив координат точек создающих прямые.
через функцию yx(x,x1,..):real узнаю значение функции в даной точке графика и сравниваю со значением функции из массива в той же точке.
я посчитал что если одна прямаяя пересекает n прямых то создается  n+1 многоугольников. а если не пересекает так логично +1. А почему не работает не знаю. вот то что я натворил.

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Image1: TImage;
   BitBtn1: TBitBtn;
   BitBtn2: TBitBtn;
   Edit1: TEdit;
   Edit2: TEdit;
   procedure FormCreate(Sender: TObject);
   procedure BitBtn2Click(Sender: TObject);
   procedure BitBtn1Click(Sender: TObject);
 private
   { Private declarations }
 public

   { Public declarations }
 end;
TPointReal= packed record
   x1,x2,y1,y2:real;
end;
 function yx(x,x1,x2,y1,y2:real):real;
  function peret(y1,y2:real):boolean;
var
 Form1: TForm1;
 KPr,ktoch,ktoch1:integer;
 par:array [1..10] of TPointReal;
 xper,yper,x1,x2,y1,y2:real;
 a,b,c,d:integer;
 implementation

{$R *.DFM}
  function peret(y1,y2:real):boolean;
  begin
     result:=false;
     if y1=y2 then result:=true;
  end;
function yx(x,x1,x2,y1,y2:real):real;
begin
 result:=0;
 if x2<>x1 then
 result:=x*((y2-y1)/(x2-x1))+ ((y2*x2-2*x1*y2+x1*y1)/(x2-x1));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.Canvas.Create;
a:=0;b:=Image1.Picture.Width;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var i,k,j:integer;

begin
  try
  KPr:=strtoint(Edit2.Text);
  except on EConvertError do
  begin
  MessageDlg("Error",mtError,[mbOK],0);
  end;
  end;
  ktoch:=0;
  ktoch1:=0;
// dali perevirjajemo 4y je spilni to4ky elementiv masyvu

  for i:=1 to KPr-1  do
  begin
  for j:=i+1 to KPr do
  begin
  ktoch1:=0;
  for k:=a to b do
  begin    // сравниваем значения в одинаковых точках
  y1:=yx(k,par[i].x1,par[i].x2,par[i].y1,par[i].y2);
  y2:=yx(k,par[j].x1,par[j].x2,par[j].y1,par[j].y2);
  if peret(y1,y2) then  begin
  xper:=k;
  yper:=trunc(y1);
  ktoch1:=ktoch1+1;// количество пересекаемых прямых i-той прямой
  end; //if
  end;//k:=a
  end; //j
  if ktoch1=0 then ktoch:=ktoch+1 else // сумарное количество многоугольников
  ktoch:=ktoch1+1;
  end;   //i
  edit1.Text:=inttostr(ktoch);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var i:integer;
    x1p,x2p,y1p,y2p:integer;
    s,ss:integer;
begin
KPr:=strtoint(edit2.text);
Image1.Canvas.Rectangle(0,0,image1.Picture.Width,image1.Picture.Height);
randomize;
for i:=1 to kpr do
begin
s:=random(4);
   edit1.Text:=inttostr(s);
    case s of
    0: begin
          x1p:=0;
          y1p:=random(289);
       end;
    1: begin
          x1p:=random(473);
          y1p:=0;
       end;
    2: begin
          x1p:=483;
          y1p:=random(289);
       end;
    3: begin
          x1p:=random(473);
          y1p:=289;
       end;
    end;
    repeat
    ss:=random(4);
    until s<>ss;
case ss of
    0: begin
          x2p:=0;
          y2p:=random(289);
       end;
    1: begin
          x2p:=random(473);
          y2p:=0;
       end;
    2: begin
          x2p:=473;
          y2p:=random(289);
       end;
    3: begin
          x2p:=random(473);
          y2p:=289;
       end;
    end;
 par[i].x1:=x1p;
 par[i].x2:=x2p;
 par[i].y1:=y1p;
 par[i].y2:=y2p;
 Image1.Canvas.MoveTo(x1p,y1p);
 Image1.Canvas.LineTo(x2p,y2p);
end;
end;

end.


 
bogdan   (2005-08-28 11:49) [1]

allo


 
A22 ©   (2005-08-29 12:20) [2]

слушаю вас



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
1-1136800132
M_Alex
2006-01-09 12:48
2006.02.12
как приостановить и возобновить выполение процедуры


15-1138086376
syte_ser78
2006-01-24 10:06
2006.02.12
Хочу ноутбук


6-1131098835
kazar
2005-11-04 13:07
2006.02.12
компоненты indy


1-1137387906
Гость101
2006-01-16 08:05
2006.02.12
Прокручивание текста


2-1137452058
Leito
2006-01-17 01:54
2006.02.12
Форматирование Чисел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский