1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Площадь окружности и треугольника, проходящими через три точки
Есть задача, надо из множества точек выбрать три так, что бы разница между площадью круга и треугольника проходящими через эти точки была минимальна. Но выдает ошибку, Error 207:Invalid floating point operation,когда чмсло точек больше 14. Вот текст программы, подскажите в чем может быть ошибка
program graphpoints; uses crt,graph; const nmax=1000; type t_point=record x:longint; y:longint; end; var p:array[1..nmax]of t_point; maxx,maxy,j,n,i,k,x1,x2,x3,y1,y2,y3,l:longint; driver,mode:integer; t,tbest,r,a,b,rb,c,per,sk,skb,st,stb,d,db:real; rad,radb:t_point;
procedure generatedata; var i:integer; begin for i:=1 to n do begin p[i].x:=random(maxx); p[i].y:=random(maxy); end; end;
Function FindOuterRadius(A, B, C : t_point; Var Rr : t_point): Boolean; Var M : Array[1..2,1..3] Of Extended; D, Dx, Dy : Extended; Begin M[1, 1] := 2 * (A.X - B.X); M[1, 2] := 2 * (A.Y - B.Y); M[1, 3] := Sqr(A.X) +Sqr(A.Y) - (Sqr(B.X) + Sqr(B.Y));
If D <> 0 Then Begin Rr.X := trunc(Dx/D); Rr.Y := trunc(Dy/D); FindOuterRadius := True; End Else Begin Rr.X := 0; Rr.Y := 0; FindOuterRadius := False; End; End;
begin randomize; write('Введите количество точек: '); readln(n); driver:=detect; initgraph(driver,mode,'d:\tp\bgi'); maxx:=getmaxx; maxy:=getmaxy; generatedata; db:=1000000; j:=1; k:=1; for i:=1 to n do begin putpixel(p[i].x,p[i].y,white); circle(p[i].x,p[i].y,1); end; for i:=1 to n-2 do begin for j:=i+1 to n-1 do begin for k:=j+1 to n do begin if FindOuterRadius(p[i],p[j],p[k],Rad) then begin r:=sqrt(sqr(Rad.x-p[i].x)+sqr(Rad.y-p[i].y)); sk:=pi*r*r; a:=sqrt(sqr(p[j].x-p[i].x)+sqr(p[j].y-p[i].y)); b:=sqrt(sqr(p[k].x-p[j].x)+sqr(p[k].y-p[j].y)); c:=sqrt(sqr(p[i].x-p[k].x)+sqr(p[i].y-p[k].y)); per:=(a+b+c)/2; st:=sqrt(per*(per-c)*(per-b)*(per-a)); d:=abs(st-sk); if (d<db) and (Rad.x<=maxx) and (Rad.y<=maxy) then begin db:=d; stb:=st; skb:=sk; x1:=p[i].x; x2:=p[j].x; x3:=p[k].x; y1:=p[i].y; y2:=p[j].y; y3:=p[k].y; l:=1; radb.x:=rad.x; radb.y:=rad.y; rb:=r; end; end; end; end; end; if l=1 then begin circle(Radb.x,Radb.y,trunc(rb)); line(x1,y1,x2,y2); line(x2,y2,x3,y3); line(x1,y1,x3,y3); end; readkey; closegraph; if l=1 then writeln('S круга = ',skb,' S треугольника ',stb,' разница между ними ',db) else writeln('не существует 3 таких точек через которые можно провести окружность'); readkey; end.
Сообщение отредактировано: milfes - 8.01.2007 23:29