|
本帖最后由 hbghlyj 于 2021-1-14 23:44 编辑 先把不相邻的顶点的配对存储到pair,它有n(n-3)/2个元素.- points = Table[{Cos[2 k Pi/n], Sin[2 k Pi/n], k}, {k, 0,
- n - 1}]; pair = Subsets[points, {2}];
复制代码 定义以(x1,y1),(x2,y2)为圆心,r为半径的两圆的交点的函数f,当没有交点时输出Nothing(这个对象放在列表中会自动被删除).- f[{{x1_,y1_,k1_},{x2_,y2_,k2_}}]=If[(x1-x2)^2+(y1-y2)^2<=4r^2,{{((x1+x2)((x1-x2)^2+(y1-y2)^2)-Abs[y1-y2]Sqrt[-((x1-x2)^2+(y1-y2)^2)((x1-x2)^2+(y1-y2)^2-4r^2)])/(2((x1-x2)^2+(y1-y2)^2)),1/(2((x1-x2)^2+(y1-y2)^2)(y1-y2))((x1-x2)^2 y1^2+y1^4-2y1^3 y2+2y1 y2^3-y2^2((x1-x2)^2+y2^2)+x1 Abs[y1-y2]Sqrt[-((x1-x2)^2+(y1-y2)^2)((x1-x2)^2+(y1-y2)^2-4r^2)]-x2 Abs[y1-y2]Sqrt[-((x1-x2)^2+(y1-y2)^2)((x1-x2)^2+(y1-y2)^2-4r^2)]),{k1,k2},i},{((x1+x2)((x1-x2)^2+(y1-y2)^2)+Abs[y1-y2]Sqrt[-((x1-x2)^2+(y1-y2)^2)((x1-x2)^2+(y1-y2)^2-4r^2)])/(2((x1-x2)^2+(y1-y2)^2)),1/(2((x1-x2)^2+(y1-y2)^2)(y1-y2))((x1-x2)^2 y1^2+y1^4-2y1^3 y2+2y1 y2^3-y2^2((x1-x2)^2+y2^2)-x1 Abs[y1-y2]Sqrt[-((x1-x2)^2+(y1-y2)^2)((x1-x2)^2+(y1-y2)^2-4r^2)]+Abs[y1-y2]x2 Sqrt[-((x1-x2)^2+(y1-y2)^2)((x1-x2)^2+(y1-y2)^2-4r^2)]),{k1,k2},i}},Nothing];
复制代码 定义两点连线的斜率函数s- s[{x1_, y1_}, {x2_, y2_}] = (y1 - y2)/(x1 - x2);
复制代码 将所有交点存到intersec- intersec = Select[Flatten[Table[(f /@ pair) /. r -> 2 Cos[\[Pi]/(2n) + i \[Pi]/n], {i, 0,(n-3)/2}], 2],! MemberQ[Table[MapThread[Chop@*N@*Plus, {-#[[1;;2]], Delete[points[[m]], 3]}], {m,n}], {0, 0}] &];
复制代码 把x轴上的交点存到ve- ve = Select[
- Flatten[Table[Thread[{(x /. Solve[(x - Cos[2 Pi i/n])^2 + (Sin[2 Pi i/n])^2 == (2 Cos[\[Pi]/(2n) + j \[Pi]/n])^2 && x > 0, x, Reals]), i, j}], {i, 0, (n-1)/2}, {j, 0, (n-3)/2}], 2],
- Length[#] > 1 &];
复制代码 把x轴上方的交点存到nve- nve = {}; For[i = 1, i < Length[intersec], i++,
- If[N[intersec[[i]][[2]]] > 0, AppendTo[nve, intersec[[i]]], ,
- Print[i]]]
复制代码 把倾斜角存到angle- angle = Flatten[
- Table[If[Chop[N[First[ve[[i]]] - First[nve[[j]]]]] !=
- 0, {Chop[N[ArcTan[s[{First[ve[[i]]], 0}, nve[[j]][[1 ;; 2]]]]]],
- Flatten[{Delete[ve[[i]], 1], nve[[j]][[3 ;; 4]]}]}, Nothing], {i,
- Length[ve]}, {j, Length[nve]}], 1];
复制代码 开始搜索- S = {}; For[i = 1, i != Length[angle], i++,
- For[j = i + 1, j != Length[angle], j++,
- If[Chop[N[
- 10^(-2) FractionalPart[(angle[[i]] + angle[[j]]) 2 n/Pi]]] == 0,
- AppendTo[
- S, {Last[angle[[i]]], Last[angle[[j]]],
- Chop[N[(angle[[i]] + angle[[j]]) 2 n/Pi]]}]]]]
复制代码 加一个进度条加一个实时输出栏把+改成-再搜索一波- S = {}; For[i = 1, i != Length[angle], i++,For[j = i + 1, j != Length[angle], j++, If[Chop[N[10^(-2) FractionalPart[(angle[[i]] - angle[[j]]) 2 n/Pi]]] == 0, AppendTo[S, {Last[angle[[i]]], Last[angle[[j]]], Chop[N[(angle[[i]] - angle[[j]]) 2 n/Pi]]}]]]]
复制代码 |
|