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)

posted @ 2016-01-23 13:52  小小泽  阅读(244)  评论(0编辑  收藏  举报