三角形外接圆+圆的参数方程
1 //pku_1266_三角形外接圆+圆的参数方程.cpp 2 #include <stdio.h> 3 #include <math.h> 4 5 const double eps = 1e-6; 6 const double pi = acos(-1); 7 const double inf = 9999999.0; 8 9 typedef struct TPoint 10 { 11 double x, y; 12 }TPoint; 13 14 typedef struct TCircle 15 { 16 TPoint c; 17 double r; 18 }TCircle; 19 20 typedef struct TTriangle 21 { 22 TPoint t[3]; 23 }TTriangle; 24 25 double max(double x, double y) 26 { 27 if(x > y) return x; 28 else return y; 29 } 30 31 double min(double x, double y) 32 { 33 if(x < y) return x; 34 else return y; 35 } 36 37 double distance(TPoint p1, TPoint p2) 38 { 39 return sqrt((p1.x - p2.x) * (p1.x - p2.x) 40 + (p1.y - p2.y) * (p1.y - p2.y)); 41 } 42 43 double triangleArea(TTriangle t) 44 { 45 //已知三角形三个顶点的坐标,求三角形的面积 46 return fabs(t.t[0].x * t.t[1].y + t.t[1].x * t.t[2].y 47 + t.t[2].x * t.t[0].y - t.t[1].x * t.t[0].y 48 - t.t[2].x * t.t[1].y - t.t[0].x * t.t[2].y) / 2; 49 } 50 51 TCircle circumcircleOfTriangle(TTriangle t) 52 { 53 //三角形的外接圆 54 TCircle tmp; 55 double a, b, c, c1, c2; 56 double xA, yA, xB, yB, xC, yC; 57 a = distance(t.t[0], t.t[1]); 58 b = distance(t.t[1], t.t[2]); 59 c = distance(t.t[2], t.t[0]); 60 //根据S = a * b * c / R / 4;求半径R 61 tmp.r = a * b * c / triangleArea(t) / 4; 62 63 xA = t.t[0].x; yA = t.t[0].y; 64 xB = t.t[1].x; yB = t.t[1].y; 65 xC = t.t[2].x; yC = t.t[2].y; 66 c1 = (xA * xA + yA * yA - xB * xB - yB * yB) / 2; 67 c2 = (xA * xA + yA * yA - xC * xC - yC * yC) / 2; 68 69 tmp.c.x = (c1 * (yA - yC) - c2 * (yA - yB)) / 70 ((xA - xB) * (yA - yC) - (xA - xC) * (yA - yB)); 71 tmp.c.y = (c1 * (xA - xC) - c2 * (xA - xB)) / 72 ((yA - yB) * (xA - xC) - (yA - yC) * (xA - xB)); 73 74 return tmp; 75 } 76 77 double Get_angle(TPoint p, TCircle c) 78 { 79 double ans; 80 ans = acos((p.x - c.c.x) / c.r); 81 if(p.y < c.c.y){ 82 if(ans >= M_PI / 2){ 83 ans = (M_PI - ans) + M_PI; 84 } 85 else { 86 ans = 2 * M_PI - ans; 87 } 88 } 89 return ans; 90 } 91 92 double swap(double &a, double &b) 93 { 94 double c; 95 c = a; 96 a = b; 97 b = c; 98 } 99 100 int UP(double a) 101 { 102 int a0; 103 if(a >= 0){ 104 a0 = int(a); 105 if(fabs(a0 - a) < eps) return a0; 106 else return a0 + 1; 107 } 108 else { 109 a0 = (int)a; 110 if(fabs(a0 - 1 - a) < eps) return a0 - 1; 111 return a0; 112 } 113 } 114 115 int DOWN(double a) 116 { 117 int a0; 118 if(a >= 0){ 119 a0 = (int)a; 120 if(fabs(a - (a0 + 1)) < eps) return a0 + 1; 121 return a0; 122 } 123 else { 124 a0 = (int)a; 125 if(fabs(a0 - a) < eps) return a0; 126 else return a0 - 1; 127 } 128 } 129 130 int main() 131 { 132 TCircle c; 133 TTriangle t; 134 TPoint p1, p2, p3; 135 double a1, a2, a3, tmp; 136 int max_x, min_x, max_y, min_y; 137 scanf("%lf%lf", &p1.x, &p1.y); 138 scanf("%lf%lf%lf%lf", &p2.x, &p2.y, &p3.x, &p3.y); 139 t.t[0] = p1; 140 t.t[1] = p2; 141 t.t[2] = p3; 142 c = circumcircleOfTriangle(t); 143 a1 = Get_angle(p1, c); 144 a2 = Get_angle(p2, c); 145 a3 = Get_angle(p3, c); 146 if(a1 > a2) swap(a1, a2); 147 //讨论 148 if(a3 >= a1 && a3 <= a2){ 149 tmp = 0; 150 if(tmp >= a1 && tmp <= a2){ 151 max_x = UP(c.c.x + c.r); 152 } 153 else max_x = UP(max(p1.x, p2.x)); 154 tmp = pi / 2; 155 if(tmp >= a1 && tmp <= a2){ 156 max_y = UP(c.c.y + c.r); 157 } 158 else max_y = UP(max(p1.y, p2.y)); 159 tmp = pi; 160 if(tmp >= a1 && tmp <= a2){ 161 min_x = DOWN(c.c.x - c.r); 162 } 163 else min_x = DOWN(min(p1.x, p2.x)); 164 tmp = pi * 3 / 2; 165 if(tmp >= a1 && tmp <= a2){ 166 min_y = DOWN(c.c.y - c.r); 167 } 168 else min_y = DOWN(min(p1.y, p2.y)); 169 } 170 else { 171 tmp = 0; 172 if(tmp <= a1 || tmp >= a2){ 173 max_x = UP(c.c.x + c.r); 174 } 175 else max_x = UP(max(p1.x, p2.x)); 176 tmp = pi / 2; 177 if(tmp <= a1 || tmp >= a2){ 178 max_y = UP(c.c.y + c.r); 179 } 180 else max_y = UP(max(p1.y, p2.y)); 181 tmp = pi; 182 if(tmp <= a1 || tmp >= a2){ 183 min_x = DOWN(c.c.x - c.r); 184 } 185 else min_x = DOWN(min(p1.x, p2.x)); 186 tmp = pi * 3 / 2; 187 if(tmp <= a1 || tmp >= a2){ 188 min_y = DOWN(c.c.y - c.r); 189 } 190 else min_y = DOWN(min(p1.y, p2.y)); 191 } 192 printf("%d\n", (max_x - min_x) * (max_y - min_y)); 193 return 0; 194 }