Guest User

Równanie okręgu wpisanego - sposób konstrukcyjny

a guest
Mar 15th, 2022
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.74 KB | None | 0 0
  1.  
  2. program untitled;
  3.  
  4. uses crt,math;
  5. type TPoint = record
  6.         x,y:Real;
  7.      end;
  8.      TArray=array[1..3]of Real;
  9. procedure quadratic(a,b,c:Real;var x1,x2:Real);
  10. var delta:Real;
  11. begin
  12.   delta := sqr(b) - 4 * a * c;
  13.   if delta >= 0 then
  14.   begin
  15.     x1 := (-b - sqrt(delta))/(2*a);
  16.     x2 := (-b + sqrt(delta))/(2*a);
  17.   end;
  18. end;
  19.  
  20. procedure bisectoreq(pa,pb,pc:TPoint;var b1,b2:TArray);
  21. var l1,l2:TArray;
  22.     r,t1,t2,temp:Real;
  23.     a,b,c,d:TPoint;
  24.     i:byte;
  25.     acute:boolean;
  26. begin
  27.   //Rownanie prostej zawierajacej pierwsze ramie kata
  28.   l1[1] := -(pb.y - pa.y);
  29.   l1[2] := pb.x - pa.x;
  30.   l1[3] := -pb.x * l1[1] - pb.y * l1[2];
  31.   //Rownanie prostej zawierajacej drugie ramie kata
  32.   l2[1] := -(pc.y - pb.y);
  33.   l2[2] := pc.x - pb.x;
  34.   l2[3] := -pc.x * l2[1] - pc.y * l2[2];
  35.   {
  36.   a.x := -(l1[3] * l2[2] - l2[3] * l1[2])/(l1[1]*l2[2]-l2[1]*l1[2]);
  37.   a.y := -(l1[1] * l2[3] - l2[1] * l1[3])/(l1[1]*l2[2]-l2[1]*l1[2]);
  38.   }
  39.   //Wierzcholek kata
  40.   a.x := pb.x;
  41.   a.y := pb.y;
  42.   //Losowy wybor punktu na jednym z ramion kata
  43.   if l1[2] <> 0 then
  44.   begin
  45.     b.x := a.x + 1 + random(10);
  46.     b.y := -1/l1[2] *(l1[3] + l1[1] * b.x);
  47.   end
  48.   else
  49.   begin
  50.     b.y := a.y + 1 + random(10);
  51.     b.x := -1/l1[1]*(l1[3] + l1[2] * b.y);
  52.   end;
  53.   r := hypot(b.x - a.x,b.y - a.y);
  54.   (*Wyznaczanie punktu przeciecia okregu o środku w wierzchołku kąta  
  55.    i promieniu rownym odległości wylosowanego punktu od wierzchołka kąta
  56.    z prostą zawierającą drugie ramię kąta
  57.    Obliczenia rozbito na dwa przypadki ze względu na możliwość dzielenia przez zero
  58.   *)
  59.   if l2[2] <> 0 then
  60.   begin
  61.       quadratic(1+sqr(l2[1]/l2[2]),2*(l2[3]/l2[2] + a.y) * (l2[1]/l2[2]) - 2*a.x,sqr(a.x) + sqr(l2[3]/l2[2] + a.y) - sqr(r),t1,t2);
  62.       c.x := t1;
  63.       c.y := -1/l2[2] * (l2[3] + l2[1] * c.x);
  64.       d.x := t2;
  65.       d.y := -1/l2[2] * (l2[3] + l2[1] * d.x);
  66.   end
  67.   else
  68.   begin
  69.       quadratic(1+sqr(l2[2]/l2[1]),2*(l2[3]/l2[1] + a.x) * (l2[2]/l2[1]) - 2*a.y,sqr(a.y) + sqr(l2[3]/l2[1] + a.x) - sqr(r),t1,t2);
  70.       c.y := t1;
  71.       c.x := -1/l2[1] * (l2[3] + l2[2] * c.y);
  72.       d.y := t2;
  73.       d.x := -1/l2[1] * (l2[3] + l2[2] * d.y);
  74.   end;
  75.   //Prosta prostopadla do prostej BC przechodząca przez wierzchołek kąta
  76.   b1[1] := c.x - b.x;
  77.   b1[2] := c.y - b.y;
  78.   b1[3] := -a.x * b1[1] - a.y * b1[2];
  79.   //Prosta prostopadla do prostej BD przechodząca przez wierzchołek kąta
  80.   b2[1] := d.x - b.x;
  81.   b2[2] := d.y - b.y;
  82.   b2[3] := -a.x * b2[1] - a.y * b2[2];
  83.   acute := ((l1[1] * b1[1] + l1[2] * b1[2]) <> 0) and (abs((l1[1] * b1[2] - l1[2] * b1[1])/(l1[1] * b1[1] + l1[2] * b1[2])) < 1);
  84.   if not acute then
  85.      for i := 1 to 3 do
  86.      begin
  87.        temp := b1[i];
  88.        b1[i] := b2[i];
  89.        b2[i] := temp;
  90.      end;
  91. end;
  92.  
  93. procedure inscribedCircleEq(a,b,c:TPoint;var s:TPoint;var r:Real);
  94. var d:TPoint;
  95.     b1,b2,b3:TArray;
  96. begin
  97.   bisectoreq(a,b,c,b1,b2);
  98.   bisectoreq(b,a,c,b2,b3);
  99.   //Wspolrzende srodka jako przeciecie dwusiecznych katow wewnetrznych
  100.   s.x := -(b1[3] * b2[2] - b2[3] * b1[2])/(b1[1] * b2[2] - b2[1] * b1[2]);
  101.   s.y := -(b1[1] * b2[3] - b2[1] * b1[3])/(b1[1] * b2[2] - b2[1] * b1[2]);
  102.   //Rownanie prostej zawierajacej bok trojkata
  103.   b3[1] := -(b.y - a.y);
  104.   b3[2] := b.x - a.x;
  105.   b3[3] := -b.x * b3[1] - b.y * b3[2];
  106.   //Rownanie prostej prostopadlej do prostej zawierajacej bok trojkata przechodzacej przez srodek okregu wpisanego
  107.   b2[1] := (b.x - a.x);
  108.   b2[2] := (b.y - a.y);
  109.   b2[3] := -s.x * b2[1] - s.y * b2[2];
  110.   // Przeciecie prostej zawierajacej bok trojkata i do niej prostopadlej
  111.   d.x := -(b3[3] * b2[2] - b2[3] * b3[2])/(b3[1] * b2[2] - b2[1] * b3[2]);
  112.   d.y := -(b3[1] * b2[3] - b2[1] * b3[3])/(b3[1] * b2[2] - b2[1] * b3[2]);
  113.   r := hypot(d.x - s.x,d.y - s.y);
  114. end;
  115.  
  116. var a,b,c,s:TPoint;
  117.     r:Real;
  118.     esc:char;
  119.     f:text;
  120.  
  121. BEGIN
  122. assign(f,'inscribed.txt');
  123. {$I-}
  124.   reset(f);  
  125. {$I+}
  126. if ioresult = 0 then
  127.    append(f)
  128. else
  129.    rewrite(f);
  130. repeat
  131.    repeat
  132.        writeln('Podaj wspolrzedne punktu A');
  133.        readln(a.x,a.y);
  134.        writeln('Podaj wspolrzedne punktu B');
  135.        readln(b.x,b.y);
  136.        writeln('Podaj wspolrzedne punktu C');
  137.        readln(c.x,c.y);
  138.    until ((b.x - a.x) * (c.y - a.y) <> (b.y - a.y) * (c.x - a.x));
  139.    writeln(f,' Wspolrzedne punktu A to : (',a.x:1:10,',',a.y:1:10,')' );
  140.    writeln(f,' Wspolrzedne punktu B to : (',b.x:1:10,',',b.y:1:10,')' );
  141.    writeln(f,' Wspolrzedne punktu C to : (',c.x:1:10,',',c.y:1:10,')' );
  142.    inscribedCircleEq(a,b,c,s,r);
  143.    writeln('Rownanie okregu wpisanego w trojkat o danych wierzcholkach ');
  144.    writeln(f,'Rownanie okregu wpisanego w trojkat o danych wierzcholkach ');
  145.    writeln ('(x -',s.x:1:10,')^2 + (y - ',s.y:1:10,')^2 = ',sqr(r):1:10);
  146.    writeln (f,'(x -',s.x:1:10,')^2 + (y - ',s.y:1:10,')^2 = ',sqr(r):1:10);
  147.    esc := readkey;
  148. until esc = #27;   
  149. close(f);
  150. END.
  151.  
Advertisement
Add Comment
Please, Sign In to add comment