- 积分
- 14
- 注册时间
- 2009-5-7
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2010-4-21 18:01:00
|
显示全部楼层
来自 北京
本帖最后由 ggggwhw 于 2010-4-21 18:14 编辑
虽然代码还没有完成, 但是现在已经出来精确解了, 下面是基本思路, 先传上来大家分享一下, 我需要一些时间完善一下, 现在需要改善的是再添几个判断, 如果还不行的话, 就要加上循环语句了.- weizhi = {{99, 2}, {43, 64}, {44, 28}, {80, 0}, {28,
- 94}, {8, 15}, {12, 89}, {1, 30}, {81, 41}, {10, 3}, {68, 11}, {78,
- 43}, {7, 17}, {64, 99}, {67, 11}, {65, 19}, {61, 41}, {27,
- 68}, {76, 73}, {45, 79}}
- (*预定义三角形外心公式*)
- waixin[{x1_, y1_}, {x2_, y2_}, {x3_,
- y3_}] := {(x2^2 y1 - x3^2 y1 - x1^2 y2 + x3^2 y2 - y1^2 y2 +
- y1 y2^2 + x1^2 y3 - x2^2 y3 + y1^2 y3 - y2^2 y3 - y1 y3^2 +
- y2 y3^2)/(2 (x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 -
- x2 y3)), -(-x1^2 x2 + x1 x2^2 + x1^2 x3 - x2^2 x3 - x1 x3^2 +
- x2 x3^2 - x2 y1^2 + x3 y1^2 + x1 y2^2 - x3 y2^2 - x1 y3^2 +
- x2 y3^2)/(2 (x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 - x2 y3))};
- (*先将这二十个点的重心作为圆心的近似解*)
- yuanxin = Mean[weizhi];
- weizhi = Sort[weizhi, Norm[#1 - yuanxin] >= Norm[#2 - yuanxin] &];
- (*将离圆心最远的一个点作为最小圆上的一个点doc[1]*)
- doc[1] = weizhi[[1]];
- banjing = Norm[doc[1] - yuanxin];
- (*作图,第一个近似最小圆*)
- tu[0] = ListPlot[{yuanxin}, PlotStyle -> Directive[Red]];
- tu[1] = ListPlot[weizhi, PlotStyle -> Directive[Blue]];
- tu[2] = Graphics[Circle[yuanxin, banjing]];
- Show[Table[tu[j], {j, 0, 2}],
- AxesOrigin -> {0, 0},
- AspectRatio -> Automatic,
- PlotRange ->
- Transpose@{yuanxin - banjing - 10, yuanxin + banjing + 10}]
- "第一个近似最小圆的圆心:"
- yuanxin
- yuanxin // N
- "第一个近似最小圆的半径:"
- banjing
- banjing // N
- (*将离doc[1]最远的一个点作为最小圆上的另一个点doc[2]*)
- weizhi = Sort[weizhi, Norm[#1 - doc[1]] >= Norm[#2 - doc[1]] &];
- doc[2] = weizhi[[1]];
- (*将线段 {doc[1],doc[2]}近似看作最小圆的一条直径*)
- banjing = Norm[doc[1] - doc[2]]/2;
- yuanxin = (doc[1] + doc[2])/2;
- (*作图,第二个近似最小圆*)
- tu[0] = ListPlot[{yuanxin}, PlotStyle -> Directive[Red]];
- tu[1] = ListPlot[weizhi, PlotStyle -> Directive[Blue]];
- tu[2] = Graphics[Circle[yuanxin, banjing]];
- Show[Table[tu[j], {j, 0, 2}],
- AxesOrigin -> {0, 0},
- AspectRatio -> Automatic,
- PlotRange ->
- Transpose@{yuanxin - banjing - 10, yuanxin + banjing + 10}]
- "第二个近似最小圆的圆心:"
- yuanxin
- yuanxin // N
- "第二个近似最小圆的半径:"
- banjing
- banjing // N
- (*将离圆心最远的点作为最小圆上的第三个点doc[3]*)
- weizhi = Sort[weizhi, Norm[#1 - yuanxin] >= Norm[#2 - yuanxin] &];
- doc[3] = weizhi[[1]];
- If[! MemberQ[{doc[1], doc[2]}, doc[3]],
- (*将三角形 {doc[1],doc[2],doc[3]}的外接圆作为最小圆*)
- yuanxin = waixin[doc[1], doc[2], doc[3]];
- banjing = Norm[doc[1] - yuanxin]
- ];
- tu[0] = ListPlot[{yuanxin}, PlotStyle -> Directive[Red]];
- tu[1] = ListPlot[weizhi, PlotStyle -> Directive[Blue]];
- tu[2] = Graphics[Circle[yuanxin, banjing]];
- Show[Table[tu[j], {j, 0, 2}],
- AxesOrigin -> {0, 0},
- AspectRatio -> Automatic,
- PlotRange ->
- Transpose@{yuanxin - banjing - 10, yuanxin + banjing + 10}]
- "满足条件的最小圆的圆心:"
- yuanxin
- yuanxin // N
- "满足条件的最小圆的半径:"
- banjing
- banjing // N
复制代码 |
|