uva 10609 - Fractal
题目大意:给出A,B两个点的坐标,以及T,每次找到A、B的四等分点C,D,然后以AB/2为边长,C,D为顶点,构建一个等边三角形,E为另外一个顶点,然后再对C,E;E,D做同样的操作,直到构建的等边三角形的边长小于T时。输出所有过程中的点,按照x坐标排序,相同的按照y坐标。
解题思路:dfs模拟,用ans记录点,最后排序,C,D,E可以根据向量的方法从A,B得到。
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 #include <altorithm> 5 using namespace std; 6 const double sq3 = sqrt(3.0); 7 struct point { 8 double x, y; 9 }; 10 11 vector<point> ans; 12 double T; 13 14 bool cmp (const point& A, const point& B) 15 { 16 if(fabs(A.x - B.x) > 1e-6) return A.x < B.x; 17 return A.y < B.y; 18 } 19 20 double dis(double x, double y) { return sqrt(x * x + y * y); } 21 22 void dfs (point A, point B) 23 { 24 double len = dis(A.x - B.x, A.y - B.y); 25 if (len / 2 < T) return; 26 27 point C, D, E; 28 29 C.x = B.x + 3 * (A.x - B.x) / 4; 30 C.y = B.y + 3 * (A.y - B.y) / 4; 31 32 D.x = B.x + (A.x - B.x) / 4; 33 D.y = B.y + (A.y - B.y) / 4; 34 35 E.x = (A.x + B.x)/2 + sq3/4*(A.y - B.y); 36 E.y = (A.y + B.y)/2 - sq3/4*(A.x - B.x); 37 38 ans.push_back(C); 39 ans.push_back(D); 40 ans.push_back(E); 41 42 dfs(C, E); 43 dfs(E, D); 44 } 45 46 int main() 47 { 48 int cas = 1; 49 point A, B; 50 while(scanf("%lf%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y, &T) == 5 && T >= 1) 51 { 52 ans.clear(); 53 ans.push_back(A); 54 ans.push_back(B); 55 56 dfs(A, B); 57 58 printf("Case %d:\n", cas ++); 59 sort(ans.begin(), ans.end(), cmp); 60 printf("%lu\n", ans.size()); 61 for (int i = 0; i < ans.size(); i++) 62 printf("%0.5lf %0.5lf\n", ans[i].x, ans[i].y); 63 } 64 return 0; 65 }
已知等边三角形两点的坐标.求第三点坐标, 已知X(x1,y1), Y(x2,y2) 求Z(x3,y3), x3=? y3=?
1、求已知线段的斜角:tgα=(y1-y2)/(x1-x2)
2、求已知线段的长度:L=√((y1-y2)^2+(x1-x2)^2)
3、求第三点的坐标:
x3=x2+L*cos(α+60);y3=y2+L*sin(α+60)