Autor Beitrag
Maius
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 29.04.08 13:34 
Hi @ all,

ich habe folgendes problem: in meinem informatik-wahlfach müssen wir folgende aufgabe bearbeiten:

Ein goldgräber hat nach streifzügen durch das weite, unerforschte land einige vielversprechende schürfplätze entdeckt. diese plätze hat er auf einer karte vermerkt. bevor er jedoch mit seinen grabungen beginnen kann, muss er das von ihm beanspruchte gebiet, seinen claim, abstecken. dazu will er einen zaun errichten, der den claim möglichst kurz umschließt.

schreibe ein programm, das nach eingabe beliebig vieler schürfplätze die streckenbeschreibung und die länge des kürzesten claim-zaunes ermittelt und ausgibt. jeder schürfplatz wird durch ein paar (x,y) ganzzahliger koordinaten angegeben. zur vereinfachung kannst du davon ausgehen, dass ein schürfplatz keine ausdehnung besitzt und auch dann schon zum claim gehört, wenn er genau unter dem zaun zu liegen kommt.

ich habe mir folgendes überlegt: -man wählt einen punkt mit xmax als startpunkt
-von dort aus muss man zum nächsten, am äußersten liegenden punkt, dieser hätte zum
vorhergehenden punkt die größte steigung der benachbarten punkte usw.
-das macht man solange, bis man wieder am startpunkt angelangt ist
-nun müsste man noch die punkte verbinden und die länge des zaunes berechnen

leider hab ich nicht viel ahnung vom programmieren und das buch, das ich mir bestellt hab, hat lieferschwierigkeiten.
von daher wäre ich für hilfe sehr dankbar.

folgendes hab ich schon programmiert:


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
unit uZaun;

interface

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

type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    Button1: TButton;
    Image1: TImage;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);


  private
  XWerte : array of integer;
  YWerte : array of integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  setlength(xwerte, length(xwerte)+1);
  setlength(ywerte, length(ywerte)+1);
  xwerte[length(xwerte)-1] := strtoint(labelededit1.Text);
  ywerte[length(ywerte)-1] := strtoint(labelededit2.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
  image1.Canvas.Pen.Color:= clblack;
  for I := 0 to length(xwerte) - 1 do

  image1.Canvas.Ellipse(Xwerte[i]-5,Ywerte[i]-5,Xwerte[i]+5,Ywerte[i]+5);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  setlength(xwerte,1);
  setlength(ywerte,1);
end;

end.


Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Di 29.04.08 15:46 
Du sollst also die konvexe Hülle der Punkte berechnen. Schau Doch mal hier: www.inf.fh-flensburg...thmen/geo/graham.htm

Oder Du machst es brute force und berechnest alle möglichen Kombinationen. Was aber sehr schnell sehr langsam wird :-)

Grüße,
Uli
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 617
Erhaltene Danke: 364

W7
Delphi 6 pro
BeitragVerfasst: Mi 30.04.08 16:15 
Moin Maius,
uko hat recht, du mußt die konvexe Hülle der Punkte ermitteln.

Vielleicht hilft die Version in Turbo Pascal anno 1988:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
program konvexeHuelle;
 uses crt;
  const
    bell=7;
    breite=48;
    hoehe =24;
  var
    baumx,baumy:array[0..100of integer;
            a,b:array[1..2of integer;
    LMAX,la,lb,winkel,max:real;
            zeichen,taste:char;
    ymax,i,anzahl,anfang,neu,min,zaun,p1,p2,p3:integer;
    procedure plot(k:integer);
       begin
         gotoxy(baumx[k],hoehe-baumy[k]+1);
         write(zeichen);write(chr(bell))
       end;(*procedureende*)
 
    function frei(k:integer):boolean;
      var
       i:integer;
       besetzt:boolean;
      begin
        besetzt:=false;i:=1;
        while (i<>k) and (not besetzt) do
         begin
           if (baumx[i]=baumx[k]) and (baumy[i]=baumy[k]) then besetzt:=true;
           i:=i+1
         end;
        frei:=not besetzt;
      end;(*ende function*)

    procedure bestimme;
     begin
      randomize;
      for i:=1 to anzahl do
       begin
        repeat
          baumx[i]:=random(breite)+1;
          baumy[i]:=random(hoehe)+1
        until frei(i)
       end
     end;(*bestimme ende*)
 
    procedure eingabe;
     var x,y:integer;
     begin
      for i:=1 to anzahl do
       begin
         repeat
           write('baumnr.',i:4,' (x y): ');
           readln(x,y);
           x:=abs(x);x:=x mod (breite)+1;
           y:=abs(y);y:=y mod (hoehe)+1;
           baumx[i]:=x;baumy[i]:=y
         until frei(i)
       end
     end;(*eingabe ende*)
     begin(*main*)
     clrscr;
     repeat
       write('positionen (b)estimmen lassen');
        write('oder (e)ingeben?');
       taste:=readkey
     until taste in ['b','B','e','E'];
     writeln(taste);
     repeat
       write('wieviele baeume?');
       readln(anzahl)
     until anzahl in [1..100];
        if upcase(taste)='B' then bestimme else eingabe;
         zeichen:='*';clrscr;
         for i:=1 to anzahl do plot(i);
         min:=2*breite;ymax:=0;
         for i:=1 to anzahl do
          begin
            if baumx[i]<min then
             begin
               min:=baumx[i];
               anfang:=i;ymax:=baumy[i]
             end;
          
            if (baumx[i]=min) and (baumy[i]>ymax) then
             begin
               min:=baumx[i];anfang:=i;
               ymax:=baumy[i]
             end;
          end;
         ZEICHEN:='#';plot(anfang);
         baumx[0]:=baumx[anfang];baumy[0]:=2*hoehe;
         p1:=0;p2:=anfang;zaun:=0;
         repeat
           zaun:=zaun+1;neu:=anfang;gotoxy(50,zaun+4);
           writeln('pfahl',zaun:4,' bei x:',baumx[p2]:4,' y:',baumy[p2]:4);
           a[1]:=baumx[p1]-baumx[p2];a[2]:=baumy[p1]-baumy[p2];
           lmax:=0;la:=sqrt(sqr(a[1])+sqr(a[2]));max:=breite;
           for p3:=1 to anzahl do
            begin
              if p3<>p2 then
               begin
                 b[1]:=baumx[p3]-baumX[p2];b[2]:=baumy[p3]-baumy[p2];
                 lb:=sqrt(sqr(b[1])+sqr(b[2]));
                 winkel:=(a[1]*b[1]+a[2]*b[2])/la/lb;
                 if winkel<max then
                  begin
                    max:=winkel;
                    neu:=p3;lmax:=lb
                  end;
               
                 if (winkel=max) and (lb>lmax) then
                  begin
                    max:=winkel;
                    neu:=p3;lmax:=lb
                  end;
               end
            end;
            plot(neu);
            p1:=p2;p2:=neu
          until neu=anfang;
          for i:=1 to 3 do write(chr(bell));
            taste:=readkey
    end.

Gruß
Fiete

_________________
Fietes Gesetz: use your brain (THINK)
Maius Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 01.05.08 15:13 
danke schonmal an uko und fiete. habt mir schon sehr weiter geholfen!!!