Kategoria: Delphi

44 komentarze

Brak avatara
Napisany 2012-01-08 20:52 przez plotka

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Spin, math;
  const
 maxPunktow=20;

type
  TPointArray = array of TPoint;
    TPunkt = record x,y:real;end;
  TWielokat=array[1..MaxPunktow] of TPunkt;
  TPointFloat = Record
    X : Real;
    Y : Real;
  end;

  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    SpinEdit1: TSpinEdit;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    Button4: TButton;
    GroupBox1: TGroupBox;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
   
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Przelicz(xt,yt:real;var xe,ye:integer);
    procedure RysujWielokat();
    procedure DoMemo();
    procedure Ekstrama();
    function WyznaczSkale(xp,yp,xk,yk:real):real;
    procedure Linia(xp,yp,xk,yk,color,grubosc:integer);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  function ZnajdzOtoczke(var APunkty : TPointArray) : boolean;
  procedure SprawdzKat(var A: TPointArray; Katy : array of Real; iLo, iHi: Integer);

var
  Form1: TForm1;
  NumPunkty : integer;
  PierwszyPunkt : boolean;
  Wielokat:TWielokat;
  Punkty : TPointArray;
  xmin,xmax,ymin,ymax,x2,y2:real;
  skala,skalap:real;
  nPunktow,margines,zakresx,zakresy,zakresxp,zakresyp,wx,wy,xx1,xx2,yy1,yy2,xe,ye,c,g,wxp,wyp,suwx,suwy,x1,y1,x3,y3:integer;
implementation

{$R *.dfm}

function ZnajdzOtoczke(var APunkty : TPointArray) : boolean;
var
  LKaty : array of Real;
  Lindex, LMinY, LMaxX, LPivotIndex, LPunktyHi : integer;
  LPivot : TPoint;
  LPoprzedni, LNastepny : TPoint;
  LPoPrawej : boolean;
  LVecPointX, LVecPointY : Real;
  LPunktyize : integer;
begin
  Result := True;

  LPunktyHi := High(APunkty);

  if LPunktyHi = 2 then Exit;
  if LPunktyHi <> LMaxX then begin
        LMaxX := APunkty[Lindex].X;
        LPivotIndex := Lindex;
      end;
    end else if APunkty[Lindex].Y < LMinY then begin
      LMinY := APunkty[Lindex].Y;
      LMaxX := APunkty[Lindex].X;
      LPivotIndex := Lindex;
    end;
  end;

  LPivot := APunkty[LPivotIndex];
  APunkty[LPivotIndex] := APunkty[LPunktyHi];
  SetLength(APunkty, LPunktyHi);
  SetLength(LKaty, LPunktyHi);
  Dec(LPunktyHi);

  for Lindex := 0 to LPunktyHi do begin
    LVecPointX := LPivot.X - APunkty[Lindex].X;
    LVecPointY := LPivot.Y - APunkty[Lindex].Y;

    LKaty[Lindex] := LVecPointX / Hypot(LVecPointX, LVecPointY);
  end;

  SprawdzKat(APunkty, LKaty, 0, LPunktyHi);


  Lindex := 1;
  Repeat

    if Lindex = 0 then LPoPrawej := True else begin
      LPoprzedni := APunkty[Lindex - 1];
      if Lindex = LPunktyHi then LNastepny := LPivot
                            else LNastepny := APunkty[Lindex + 1];


      if ((LPoprzedni.X-APunkty[Lindex].X)*(LNastepny.Y-APunkty[Lindex].Y))-
         ((LNastepny.X-APunkty[Lindex].X)*(LPoprzedni.Y-APunkty[Lindex].Y)) < 0 then
        LPoPrawej := true else
        LPoPrawej := false;
    end;

    if LPoPrawej then begin
      Inc(Lindex);
    end else begin

      if Lindex = LPunktyHi then begin
        SetLength(APunkty, LPunktyHi);
        Dec(LPunktyHi);
      end else begin
        Move(APunkty[Lindex + 1], APunkty[Lindex], (LPunktyHi - Lindex) * LPunktyize + 1);
        SetLength(APunkty, LPunktyHi);
        Dec(LPunktyHi);
      end;

      Dec(Lindex);
    end;
  until Lindex = LPunktyHi;


  Inc(LPunktyHi);
  SetLength(APunkty, LPunktyHi + 1);
  APunkty[LPunktyHi] := LPivot;
end;


procedure SprawdzKat(var A: TPointArray ; Katy : array of Real; iLo, iHi: Integer);
var
  Lo, Hi : Integer;
  Mid : real;
  TempPoint : TPoint;
  TempAngle : Real;
begin
  Lo := iLo;
  Hi := iHi;
  Mid := Katy[(Lo + Hi) shr 1];
  repeat
    while Katy[Lo] <> Mid do Dec(Hi);
    if Lo <> Hi;

  if Hi > iLo then SprawdzKat(A, Katy, iLo, Hi);
  if Lo < iHi then SprawdzKat(A, Katy, Lo, iHi);
end;

procedure TForm1.Przelicz(xt,yt:real;var xe,ye:integer);
var dx,dy:real;
begin
dx:=xt-xmin;
dy:=yt-ymin;
xe:=round(dy*skala)+margines;
ye:=Image1.ClientHeight-round(dx*skala)-margines;
end;

procedure TForm1.DoMemo();
  var s1,s2:string;i:integer;
begin
  Memo1.Lines.Clear;
  for i:=1 to nPunktow do
    begin
    Str(wielokat[i].x:12:3,s1); Str(wielokat[i].y:12:3,s2);
    Memo1.lines.Add(IntToStr(i)+' '+s1+' '+s2);
    end;
end;

procedure TForm1.ekstrama();
  var i:integer;
begin
  xmin:=wielokat[1].x;xmax:=wielokat[1].x;ymin:=wielokat[1].y;ymax:=wielokat[1].y;
  for i:=1 to nPunktow do
    begin
    if wielokat[i].x <> xmax then xmax:=wielokat[i].x else xmax:=xmax;
    if wielokat[i].y <> ymax then ymax:=wielokat[i].y else ymax:=ymax;
    end;
    //ShowMessage('xmin='+FloatToStr(xmin)+'xmax'+FloatToStr(xmax)+'ymin='+FloatToStr(ymin)+'ymax'+FloatToStr(ymax));
end;

procedure TForm1.RysujWielokat();
var i,xe,ye,xe2,ye2:integer;
begin

c:=100;
g:=2;
//Image1.Canvas.Font.Style:=[fsBold];
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Font.Size:=1;
image1.Canvas.Rectangle(0,0,Image1.Clientwidth,Image1.ClientHeight);
for i:=1 to (nPunktow-1) do
begin
Przelicz(wielokat[i].x,wielokat[i].y,xe,ye);
Przelicz(wielokat[i+1].x,wielokat[i+1].y,xe2,ye2);
Linia(xe,ye,xe2,ye2,c,g);
image1.Canvas.TextOut(xe2+15+wx,ye2-15-wy,floattostr(i+1));
end;
Przelicz(wielokat[nPunktow].x,wielokat[nPunktow].y,xe,ye);
Przelicz(wielokat[1].x,wielokat[1].y,xe2,ye2);
Linia(xe,ye,xe2,ye2,c,g);
end;



function TForm1.WyznaczSkale(xp,yp,xk,yk:real):real;
var dxe,dye,dxt,dyt:real;sx,sy:real;
begin
margines:=17;
dxe:=Image1.ClientHeight-2*margines;
dye:=Image1.ClientWidth-2*margines;
dxt:=xk-xp;
dyt:=yk-yp;
sx:=dxe/dxt;
sy:=dye/dyt;
result:=sx;if sy<sx then result:=sy;

end;
procedure TForm1.Linia(xp,yp,xk,yk,color,grubosc:integer);
begin
Image1.canvas.Pen.Color:=color;
Image1.canvas.Pen.Width:=grubosc;

Image1.canvas.MoveTo(xp+wx,yp-wy);
Image1.canvas.LineTo(xp+wx,yp-wy);
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage('Aplikacja znajduje otoczke wypukla dla punktow (Algorytm Grahama)');
  PierwszyPunkt := True;
  Randomize;
  Image1.Canvas.Brush.Color := clwhite;
end;


procedure TForm1.Button1Click(Sender: TObject);
Var
  YLindex : integer;
  XRand, YRand : integer;
begin
  NumPunkty := SpinEdit1.Value;


  Image1.Canvas.FillRect(Image1.ClientRect);


  SetLength(Punkty, 0);
  for YLindex := 1 to NumPunkty do begin
    XRand := random(250) + 25; YRand := random(250) + 25;
    if Image1.Canvas.Pixels[XRand, YRand] = clwhite then begin
      Image1.Canvas.Pixels[XRand,YRand] := clblack;
      SetLength(Punkty,length(Punkty) + 1);
      Punkty[High(Punkty)].X := XRand;
      Punkty[High(Punkty)].Y := YRand;
    end;
  end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if PierwszyPunkt then begin
    Image1.Canvas.FillRect(Image1.ClientRect);
    PierwszyPunkt := False;
    SetLength(Punkty, 0);
  end;

  if Image1.Canvas.Pixels[X, Y] = clblack then Exit;


  SetLength(Punkty, length(Punkty) + 1);
  Punkty[High(Punkty)].X := X;
  Punkty[High(Punkty)].Y := Y;
  Image1.Canvas.Pixels[X, Y] := clblack;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
  LPoint : integer;
begin
  PierwszyPunkt := True;

  if not ZnajdzOtoczke(Punkty) then begin
    ShowMessage('Zbyt mała liczba punktów (n<3)');
    Exit;
  end;
  SetLength(Punkty, length(Punkty) + 1);
  Punkty[High(Punkty)] := Punkty[0];


  Image1.Canvas.Pen.Color := clred;
  Image1.Canvas.Polyline(Punkty);
  Image1.Canvas.Pen.Color := clblue;
  for LPoint := 0 to High(Punkty) do
    Image1.Canvas.Ellipse(Punkty[LPoint].X - 3, Punkty[LPoint].Y - 3,
                          Punkty[LPoint].X + 3, Punkty[LPoint].Y + 3);
end;

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

procedure TForm1.Button4Click(Sender: TObject);

var punkty:TextFile; {linia:string;}   x,y:real;   ww:integer; nrlinii:integer;
begin

if not OpenDialog1.execute then exit;

nrlinii:=0;nPunktow:=0;
AssignFile(punkty,OpenDialog1.FileName);Reset(punkty);
while not eof(punkty) do
 begin
 {$i-}
 inc(NrLinii);Readln(punkty,x,y);
 {$i+} ww:=IOResult;
 if ww<>0 then ShowMessage('Blad odczytu w linii '+IntToStr(NrLinii))
          else begin inc(nPunktow);wielokat[npunktow].x:=x;wielokat[npunktow].y:=y;
              DoMemo();
          end;
 end;
CloseFile(punkty);ShowMessage('Wczytano '+IntToStr(nPunktow)+' punktów.');
Ekstrama();
skala:=WyznaczSkale(xmin,ymin,xmax,ymax);
skalap:=skala;
Przelicz(xmin,ymin,xx1,yy1);
Przelicz(xmax,ymax,xx2,yy2);
zakresx:=xx2-xx1;
zakresy:=yy1-yy2;
zakresxp:=zakresx;
zakresyp:=zakresy;
wx:=round((Image1.Clientwidth-2*margines-zakresx)/2);
wy:=round((Image1.Clientheight-2*margines-zakresy)/2);
wxp:=wx;
wyp:=wy;

RysujWielokat();

end;

procedure TForm1.Button5Click(Sender: TObject);

Var
  LPoint : integer;
begin
  PierwszyPunkt := True;

  if not ZnajdzOtoczke(Wielokat) then begin
    ShowMessage('Zbyt mała liczba punktów (n<3)');
    Exit;
  end;
  SetLength(Punkty, length(Punkty) + 1);
  Punkty[High(Punkty)] := Punkty[0];


  Image1.Canvas.Pen.Color := clred;
  Image1.Canvas.Polyline(Punkty);
  Image1.Canvas.Pen.Color := clblue;
  for LPoint := 0 to High(Punkty) do
    Image1.Canvas.Ellipse(Punkty[LPoint].X - 3, Punkty[LPoint].Y - 3,
                          Punkty[LPoint].X + 3, Punkty[LPoint].Y + 3);
end;


end.

Brak avatara
Napisany 2012-01-08 20:52 przez plotka

moze mi ktos pomóc, chce aby aplikacja poza rysowaniem otoczki dla losowych punktów i wskazanych myszka, wczytywala je z pliku i dla nich znajdowała otoczke

Brak avatara
Napisany 2011-12-16 17:43 przez qeeepek

ma ktoś listing z rozdziału 5?

Brak avatara
Napisany 2011-08-07 13:46 przez aaaa

Delphi 7. Kompendium programisty - http://allegro.pl/show_item.php?item=1756727337

Brak avatara
Napisany 2011-01-28 19:50 przez Adik0160

gdzie tu jest dział download?

Brak avatara
Napisany 2010-07-26 20:38 przez Albertl

W rozdziale 4. nie ma także załącznika z listingami, a przydały by się.

Brak avatara
Napisany 2009-07-21 12:34 przez forsaken

W rozdziale 4 brak jest rysunku 4.6. Mozna prosic o uzupelnienie?

Avatar: Henryk555
Napisany 2009-07-06 13:04 przez Henryk555

A ja kupiłem i nie żałuę Dobra książka dla tych, którzy nie koniecznie muszą uważać się za wzorce doskonałości Wiele dobrych i co najważniejsze dobrze tłumaczonych wątków jakże potrzebnych w nauce programowania Gratuluje Adam

Avatar: Henryk555
Napisany 2009-07-03 11:46 przez Henryk555

Dobra rzecz dla każdego, kto po prostu nie udaje programisty ale uczy sie od tych, którzy coś zrozumieli To moje zdanie i tyle

Brak avatara
Napisany 2009-06-16 15:18 przez Zeely

pepol jak masz problem z labelem? Trochę nie skumałem... Musiał byś powiedzieć coś więcej o tym zadaniu...

Brak avatara
Napisany 2009-06-11 20:43 przez pepol

ludzie pomozcie!!! staram sie delikatnie wejsc w swiat programowania a tu juz na starcie jakis glupi problem:-) sam poczatek instrukcji gdzie zadanie polega na wprowadzeniu jednego labela, no i nie wiem co tam mozna skopac a wyskakuje mi error unable to create process

Brak avatara
Napisany 2009-03-07 13:46 przez aso

@pobrać się tego nie da. To jest wersja online.
Książka jest super.

Brak avatara
Napisany 2009-01-18 10:55 przez ziomster555

Jak to zassać ?

Brak avatara
Napisany 2008-11-03 19:47 przez Adam Boduch

Nie, to byly myslniki :/ pewnego razu byly problemy z baza danych i z kodowaniem w wyniku czego doszlo do zamiany na "kraczki" (w tym przypadku - znak "?"). Nalezy to poprawic :(

Avatar: Darkhog
Napisany 2008-10-10 08:00 przez Darkhog

W tekście zdarzają się ? pytajniki ? w środku zdania (te pytajnik zostały wstawione umyślnie, zeby pokazać o co chodzi). Należy ? to ? poprawić.

Brak avatara
Napisany 2008-05-22 14:33 przez Adam Boduch

4 rozdzial nareszcie zostal dodany...

Brak avatara
Napisany 2008-02-22 17:26 przez 88adrian

Rozdział 4. IDE Delphi, czy ten rozdział zostanie dodany? czy nie ma co na to liczyć?

Avatar: Coldpeer
Napisany 2007-08-21 19:33 przez Coldpeer

@Trok: http://pl.wikipedia.org/wiki/Z[...]C5%9Brodowisko_programistyczne
@Bartek 121: :|

Brak avatara
Napisany 2007-06-11 12:20 przez Trok

"Rozdział 4. IDE Delphi" - Rozdzial ten niestety nie dziala, czy ktos wyjasni mi co to IDE Delphi i czy to jest bardzo wazne przy poczatkowej nauce Delphi?

Brak avatara
Napisany 2007-05-23 15:44 przez Bartek 121

dzekuje zate gupoty

Avatar: Coldpeer
Napisany 2006-12-20 17:04 przez Coldpeer

@wodnick: a po co komu spis treści, skoro jest na stronie? :/ A jeśli chodzi o ten "rozbudowany" to jest on w poszczególnych rozdziałach przecież.

Brak avatara
Napisany 2006-12-03 19:47 przez hellger

Super sprawa z tą książką :)  przyda się mi na pewno. Na tym semestrze mam programowanie w Delphi. Ciekaw jestem rozdziału 4-go i mam nadzieje, że się pojawi :).

Brak avatara
Napisany 2006-10-28 20:36 przez wodnick

sie ma, jeśli ktoś chce mogę przesłać w DOC powyższy "rozbudowany" spis treści, gtelec@op.pl

Avatar: Coldpeer
Napisany 2006-10-24 22:25 przez Coldpeer

Nie ma.

Brak avatara
Napisany 2006-10-03 10:08 przez kaban_os

a jest kompedium do ściągnięcia??

Chodzi mi o wersję PDF.

Dajcie mi znać na mój e-mail: kaban_os@yahoo.com

Brak avatara
Napisany 2006-05-30 21:52 przez ramzesik

podziwiam autora książki że ją udostępnił bo zwykle nikt tak nie robi. Dzięki bardzo mi się przyda.

Avatar: Coldpeer
Napisany 2006-05-11 17:34 przez Coldpeer

Deepshock: o programowaniu obiektowym masz też tu: http://4programmers.net/Delphi/OOP a o plikach sam poszukaj (jest tego trochę, jest :)) :P

Brak avatara
Napisany 2006-04-30 19:15 przez max1996

całkiem niezły podręcznik poprostu wypas po sam pas

Brak avatara
Napisany 2006-04-25 15:59 przez Deepshock

@Coldpeer: dziękuje za podpowiedź. Jestem tutaj nowy, więc wiecie. :) Nie obeznany też. Strata że nie ma tych początkowych, bo ja właśnie na tym etapie jestem. Dopiero zaczynam naukę programowania, ale jestem dobrej myśli. Oby jak najszybciej zostały dodane brakujące materiały. :)

Avatar: Coldpeer
Napisany 2006-04-22 17:50 przez Coldpeer

Deepshock: dlatego, że jeszcze tych tekstów nie ma :) Wkrótce je Adam zapewne doda :) Na przyszłość: linki koloru niebieskiego nie istnieją - czerwone tak.

Brak avatara
Napisany 2006-04-13 17:31 przez Deepshock

Nie działa Rozdział 3 i 4 w części I. Po kliknięciu na linku pojawia mi się możliwość edycji.

Brak avatara
Napisany 2006-04-12 10:22 przez Adam Boduch

Linku do listingow powinny juz dzialac ok. W razie jakichkolwiek problemow z linkami prosze pisac na adam@boduch.net

Avatar: Coldpeer
Napisany 2006-04-11 15:57 przez Coldpeer

@lukasz_j: po co?
@przemekgodula: ktoś Ci każe??
@sazian: Ctrl+S :|

Brak avatara
Napisany 2006-04-07 22:23 przez lukasz_j

Było by fajnie, gdyby kiedys wyszla wersja w pliku PDF lub DOC.

Brak avatara
Napisany 2006-04-06 16:57 przez przemekgodula

Niechce mi się załączniki do rozdziału ściągać.

Brak avatara
Napisany 2006-03-26 15:33 przez sazian

a macie wersie off-line??

Avatar: Feratoin
Napisany 2006-02-06 01:14 przez Feratoin

buuu nie ma calej tej ksiazki:(

Avatar: Coldpeer
Napisany 2006-02-24 21:38 przez Coldpeer

Feratoin: nie wszystko naraz :p Tobie by się chciało tak formatował od razu każdy, cały, długi rozdział? ;>

Avatar: Rolland
Napisany 2006-01-16 08:08 przez Rolland

NIe przesadzajcie ludzie Delphi 7 "MOŻNA" powiedzieć że to przeżytek wiec nic się nie stało że kupiliście sobie książkę 2-3 lata temu. Ja np. lubie mieć ksiązki w tradycyjnej postaci i elektronicznej bo można wykożystać dobre strony obu tych form.

Avatar: WeeR
Napisany 2006-01-15 15:31 przez WeeR

Ehhh co ja tu będe dużo mówił... poczekam na następne książki też w formie strony :P

Avatar: Marooned
Napisany 2006-01-13 17:00 przez Marooned

WeeR - zapłaciłeś by nie męczyć oczu czytając z monitora ;p

Brak avatara
Napisany 2006-01-05 18:56 przez Patyk

A ja ci powiem że niepotrzebnie kupiłeś bo prawie wszystko można (i można było) znaleźć w tym serwisie ;P

Brak avatara
Napisany 2005-12-30 08:07 przez BaraQuda

typowy przykład człowieka mam i innym niedam

Avatar: WeeR
Napisany 2005-12-28 12:23 przez WeeR

Mam nadzieję, że jednak będzie się to różniło chociaż troche od wersji książkowej, np. czegoś nie będzie, albo będzie opisane w skrócie, bo jednak ja kupiłem tą książke...

Dodaj komentarz

Brak avatara
4programmers.net