MathgeomGLS
204 строки · 5.0 Кб
1function GetAvgX(L: TList): extended;
2var
3minx, maxx, x: extended;
4z: integer;
5begin
6minx := 66666;
7maxx := -66666;
8for z := 0 to L.Count - 1 do
9begin
10if assigned(L.Items[z]) then
11if TObject(L.Items[z]) is TGPoint then
12begin
13x := TGPoint(L.Items[z]).getX;
14if x > maxx then
15maxx := x;
16if x < minx then
17minx := x;
18end;
19end;
20result := (maxx + minx) / 2;
21end;
22
23// ---------------------------------------------------------------------
24
25function Next(i: integer; L: TList): integer;
26begin
27inc(i);
28if i = L.Count then
29i := 0;
30result := i;
31end;
32
33function prev(i: integer; L: TList): integer;
34begin
35dec(i);
36if i < 0 then
37i := L.Count - 1;
38result := i;
39end;
40
41// ---------------------------------------------------------------------
42procedure GetVPoly(i: integer; var L: TList);
43var
44z: integer;
45begin
46if assigned(L) then
47begin
48L.Clear;
49end
50else
51L := TList.Create;
52for z := 0 to ListPoints.Count - 1 do
53if assigned(ListPoints.Items[z]) then
54if TObject(ListPoints.Items[z]) is TGLine then
55if (TGLine(ListPoints.Items[z]).BisectorOf[1] = i) or
56(TGLine(ListPoints.Items[z]).BisectorOf[2] = i) then
57TGLine(ListPoints.Items[z]).CopyToList(L);
58end;
59
60
61// ---------------------------------------------------------------------
62
63function FindMinIPDistance(var slist: TList; var sindex: integer;
64var ip: TGPoint): extended;
65var
66z: integer;
67p: TGPoint;
68min: extended;
69begin
70p := nil;
71ip := nil;
72min := 66666;
73for z := 0 to slist.Count - 1 do
74if TGLine(slist.Items[z]).Intersect(Edge) then
75begin
76TGLine(slist.Items[z]).GetCurrentIPoint(p);
77if (v.DistanceTo(p) < min) and (v.DistanceTo(p) > 1E-5) then
78begin // must be with security distance
79min := v.DistanceTo(p);
80ip := p.clone as TGPoint;
81sindex := z;
82end;
83end;
84p.Free;
85result := min;
86end;
87
88
89// ---------------------------------------------------------------------
90
91function SortY(i1, i2: pointer): integer;
92begin
93if TGPoint(i1).getY > TGPoint(i2).getY then
94result := 1
95else
96result := -1;
97end;
98
99function SortX(i1, i2: pointer): integer;
100begin
101if TGPoint(i1).getX > TGPoint(i2).getX then
102result := 1
103else
104result := -1;
105end;
106
107procedure sort(L: TList; cf: TListSortCompare);
108// performs a bubble sort. TList.sort doesn't work for some reason.
109var
110z, i: integer;
111p: pointer;
112begin
113for z := L.Count - 2 downto 0 do
114for i := 0 to z do
115begin
116if cf(L.Items[i], L.Items[i + 1]) < 0 then
117begin
118p := L.Items[i];
119L.Items[i] := L.Items[i + 1];
120L.Items[i + 1] := p; // exchange items
121TGraphObject(L.Items[i]).ReIndex(false, i);
122TGraphObject(L.Items[i + 1]).ReIndex(false, i + 1);
123end;
124end;
125
126end;
127
128// ---------------------------------------------------------------------
129
130procedure DiscardLines;
131var
132a, b, c: integer;
133ip: TGPoint;
134l1, l2: TGLine;
135label Next;
136begin
137l2 := nil;
138a := 0;
139while a < ListPoints.Count do
140begin
141if TObject(ListPoints.Items[a]) is TGLine then
142begin
143l1 := ListPoints.Items[a];
144
145for b := 0 to ConvexHull1.Count - 1 do
146if (l1.BisectorOf[1] = TGPoint(ConvexHull1.Items[b]).getOrigIndex) or
147(l1.BisectorOf[2] = TGPoint(ConvexHull1.Items[b]).getOrigIndex) then
148begin // l1 should be left from chain
149if l2 <> nil then
150begin
151l2.p2.Free;
152l2.Free;
153end;
154l2 := TGLine.Create(l1.p1, TGPoint.Create(l1.p1.getX - 1, l1.p1.getY,
155nil, nil), OnePoint, nil, nil);
156for c := 0 to chain.Count - 1 do
157begin
158if l2.Intersect(chain.Items[c]) then
159begin
160ip := nil;
161l2.GetCurrentIPoint(ip);
162if l1.p1.DistanceTo(ip) > 1E-5 then
163begin
164ip.Free;
165TGLine(ListPoints.Items[a]).Delete(true);
166dec(a);
167goto Next;
168end;
169end;
170end;
171end;
172
173for b := 0 to ConvexHull2.Count - 1 do
174if (l1.BisectorOf[1] = TGPoint(ConvexHull2.Items[b]).getOrigIndex) or
175(l1.BisectorOf[2] = TGPoint(ConvexHull2.Items[b]).getOrigIndex) then
176begin // l1 should be right from chain
177if l2 <> nil then
178begin
179l2.p2.Free;
180l2.Free;
181end;
182l2 := TGLine.Create(l1.p1, TGPoint.Create(l1.p1.getX + 1, l1.p1.getY,
183nil, nil), OnePoint, nil, nil);
184for c := 0 to chain.Count - 1 do
185begin
186if l2.Intersect(chain.Items[c]) then
187begin
188ip := nil;
189l2.GetCurrentIPoint(ip);
190if l1.p1.DistanceTo(ip) > 1E-5 then
191begin
192ip.Free;
193TGLine(ListPoints.Items[a]).Delete(true);
194dec(a);
195goto Next;
196end;
197end;
198end;
199end;
200Next:
201end;
202inc(a);
203end; // while
204end;
205