Выбрать три различные точки из заданного множества точек на плоскости так, чтобы была минимальной разность между количествами точек, лежащих внутри и вне треугольника с вершинами в выбранных точках. Делала сама, но найти ошибку не могу( рисует совсем не то что нужно( Добавлено (31.01.11, 22:47) --------------------------------------------- Code uses Graph, crt; const nmax=100; x4=500; y4=500; rad=2; var d, m, n, i, j, k, l, z1, z2, z3, inside, outside, InOut, minraz, cross : integer; x: array[1..nmax] of real; y: array[1..nmax] of real; f: text; S, s1, s2, s3, X1, X2, X3, Y1, Y2, Y3 : real; procedure OpenInFile(var f: text); var name: string; error: integer; begin repeat writeln('Vvedite put k faily:'); readln(name); assign(f, name); {$i-} reset(f); {$i+} error:=ioresult; if error<>0 then writeln('not'); until error=0; end;
procedure crossing(var x1,x2,y1,y2, x3, y3 : real; x4,y4: real; cross: integer); var ua, ub, a, b, del : real; begin a:=(x4-x3)*(y1-y3) - (y4-y3)*(x1-x3); b:=(x2-x1)*(y1-y3) - (y2-y1)*(x1-x3); del:=(y4-y3)*(x2-x1) - (x4-x3)*(y2-y1); if del<>0 then begin ua:=a/del; ub:=b/del; end; if ((ua>0) and (ua<1)) and ((ub>0)and(ub<1)) then cross:=cross+1; end;
[b]Добавлено[/b] (31.01.11, 22:48) --------------------------------------------- BEGIN d := Detect; OpenInFile(f); n:=1; while not eof(f) do begin readln(f, x[n], y[n]); n:=n+1; end; inside:=0; outside:=0; minraz:=n; for i:=1 to n do begin for j:=i+1 to n do begin for k:=j+1 to n do begin for m:=1 to n do begin cross:=0; crossing(x[i], y[i], x[j], y[j], x[m], y[m], x4, y4, z1); crossing(x[k], y[k], x[j], y[j], x[m], y[m], x4, y4, z2); crossing(x[i], y[i], x[k], y[k], x[m], y[m], x4, y4, z3); cross:=cross+z1+z2+z3; if cross=1 then inside:=inside+1 else outside:=outside+1; end;
InOut:=abs(inside-outside); if InOut<=minraz then begin minraz:=InOut; X1:=x[i]; Y1:=y[i]; X2:=x[j]; Y2:=y[j]; X3:=x[k]; Y3:=y[k]; end; end; end; end; InitGraph(d, m, ''); SetColor(green); Line(round(X1), round(Y1), round(X2), round(Y2)); Line(round(X2), round(Y2), round(X3), round(Y3)); Line(round(X3), round(Y3), round(X1), round(Y1)); close (f); readln; closeGraph; end.
№ 1 | Автор: МарьЯ |
2011-01-31, 22:48 | Изменено: МарьЯ - Пн, 2011-01-31, 22:48
|
Репутация: [ + 2 ]
|
|
|