ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1043. Cover an Arc

(WA) What's wrong with my program?
Posted by Grebnov Ilya[ISPU] 1 Apr 2003 14:30
VAR
  X0, X1, X2 : Extended;
  Y0, Y1, Y2 : Extended;
  A, B, C : Extended;
  A0, B0, C0 : Extended;
  A1, B1, C1 : Extended;
  CX, CY, R : Extended;
  MinX, MaxX, MinY, MaxY : Extended;

  FUNCTION MyRoundA(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundA := A
    ELSE
      MyRoundA := Trunc(A)+1
  END;

  FUNCTION MyRoundB(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundB := A
    ELSE
      MyRoundB := Trunc(A)-1
  END;

BEGIN
  ReadLn(X0, Y0);
  ReadLn(X1, Y1);
  ReadLn(X2, Y2);
  MinX := X0;
  IF MinX > X1 THEN MinX := X1;
  MaxX := X0;
  IF MaxX < X1 THEN MaxX := X1;
  MinY := Y0;
  IF MinY > Y1 THEN MinY := Y1;
  MaxY := Y0;
  IF MaxY < Y1 THEN MaxY := Y1;
  CX := (X0+X1)/2;
  CY := (Y0+Y1)/2;
  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;
  IF (A <> 0) THEN
    BEGIN
      A0 := B/A;
      B0 := -1;
      C0 := CY-A0*CX;
    END
  ELSE
    BEGIN
      A0 := 1;
      B0 := 0;
      C0 := -CX;
    END;
  CX := (X0+X2)/2;
  CY := (Y0+Y2)/2;
  A := (Y2-Y0);
  B := (X0-X2);
  C := X2*Y0-X0*Y2;
  IF (A <> 0) THEN
    BEGIN
      A1 := B/A;
      B1 := -1;
      C1 := CY-A1*CX;
    END
  ELSE
    BEGIN
      A1 := 1;
      B1 := 0;
      C1 := -CX;
    END;

  {center}
  CX := (B0*C1-B1*C0)/(A0*B1-A1*B0);
  CY := (A1*C0-A0*C1)/(A0*B1-A1*B0);
  {radius}
  R := Sqrt(Sqr(X0-CX)+Sqr(Y0-CY));

  {Line (X0,Y0) to (X1,Y1)}

  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;

  IF (A*X2+B*Y2+C)*(A*(CX-R)+B*CY+C) >= 0 THEN MinX := CX-R;
  IF (A*X2+B*Y2+C)*(A*(CX+R)+B*CY+C) >= 0 THEN MaxX := CX+R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY-R)+C) >= 0 THEN MinY := CY-R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY+R)+C) >= 0 THEN MaxY := CY+R;

  MinX := MyRoundB(MinX);
  MaxX := MyRoundA(MaxX);
  MinY := MyRoundB(MinY);
  MaxY := MyRoundA(MaxY);

  IF MinX < -1000 THEN MinX := -1000;
  IF MinY < -1000 THEN MinY := -1000;
  IF MaxX > 1000 THEN MaxX := 1000;
  IF MaxY > 1000 THEN MaxY := 1000;


  Write((MaxX-MinX)*(MaxY-MinY):0:0);
END.
Why my program still WA? Please help me! Thank you!
Posted by Grebnov Ilya[ISPU] 1 Apr 2003 22:43
{$N+}
{$E-}
VAR

  X0, X1, X2 : Extended;
  Y0, Y1, Y2 : Extended;
  A, B, C : Extended;
  A0, B0, C0 : Extended;
  A1, B1, C1 : Extended;
  CX, CY, R : Extended;
  MinX, MaxX, MinY, MaxY : Extended;

  FUNCTION MyRoundUp(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundUp := Trunc(A)
    ELSE
      IF A > 0 THEN
        MyRoundUp := Trunc(A+1)
    ELSE
      MyRoundUp := Trunc(A)
  END;

  FUNCTION MyRoundDown(A : Extended) : Extended;
  BEGIN
    IF Trunc(A) = A THEN
      MyRoundDown := Trunc(A)
    ELSE
      IF A < 0 THEN
        MyRoundDown := Trunc(A-1)
    ELSE
      MyRoundDown := Trunc(A);
  END;

BEGIN

  ReadLn(X0, Y0);
  ReadLn(X1, Y1);
  ReadLn(X2, Y2);

  MinX := X0;
  IF MinX > X1 THEN MinX := X1;
  MaxX := X0;
  IF MaxX < X1 THEN MaxX := X1;
  MinY := Y0;
  IF MinY > Y1 THEN MinY := Y1;
  MaxY := Y0;
  IF MaxY < Y1 THEN MaxY := Y1;

  CX := (X0+X1)/2;
  CY := (Y0+Y1)/2;

  {Line (X0,Y0) to (X1,Y1)}
  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;

  IF (Y1 <> Y0) THEN
    BEGIN
      A0 := B/A;
      B0 := -1;
      C0 := CY-A0*CX;
    END
  ELSE
    BEGIN
      A0 := 1;
      B0 := 0;
      C0 := -CX;
    END;

  CX := (X0+X2)/2;
  CY := (Y0+Y2)/2;

  {Line (X0,Y0) to (X2,Y2)}
  A := (Y2-Y0);
  B := (X0-X2);
  C := X2*Y0-X0*Y2;

  IF (Y2 <> Y0) THEN
    BEGIN
      A1 := B/A;
      B1 := -1;
      C1 := CY-A1*CX;
    END
  ELSE
    BEGIN
      A1 := 1;
      B1 := 0;
      C1 := -CX;
    END;

  {center}
  CX := (B0*C1-B1*C0)/(A0*B1-A1*B0);
  CY := (A1*C0-A0*C1)/(A0*B1-A1*B0);

  {radius}
  R := Sqrt(Sqr(X0-CX)+Sqr(Y0-CY));

  {Line (X0,Y0) to (X1,Y1)}
  A := (Y1-Y0);
  B := (X0-X1);
  C := X1*Y0-X0*Y1;

  IF (A*X2+B*Y2+C)*(A*(CX-R)+B*CY+C) > 0 THEN MinX := CX-R;
  IF (A*X2+B*Y2+C)*(A*(CX+R)+B*CY+C) > 0 THEN MaxX := CX+R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY-R)+C) > 0 THEN MinY := CY-R;
  IF (A*X2+B*Y2+C)*(A*CX+B*(CY+R)+C) > 0 THEN MaxY := CY+R;

  MaxX := MyRoundUp(MaxX);
  MaxY := MyRoundUp(MaxY);
  MinX := MyRoundDown(MinX);
  MinY := MyRoundDown(MinY);

  Write((MaxX-MinX)*(MaxY-MinY):0:0);

END.