这是我试图找到我的问题wireframes in Mathematica的答案的第一部分。Mathematica:加入线段
给定一组线段,如何连接两条连接的AND段位于同一条线上。例如考虑线段l1 = {(0,0), (1,1)}
和l2 = {(1,1), (2,2)}
。这两条线段可以组合成一条线段,即l3 = {(0,0), (2,2)}
。这是因为l1
和l2
分享点(1,1)
和每个线段的斜率是相同的。这里是一个视觉:
l1 = JoinedCurve[{{{0, 2, 0}}}, {{{0, 0}, {1, 1}}}, CurveClosed -> {0}];
l2 = JoinedCurve[{{{0, 2, 0}}}, {{{1, 1}, {2, 2}}}, CurveClosed -> {0}];
Graphics[{Red, l1, Blue, l2}, Frame -> True]
有一点要注意的是,在上述的例子l1
和l2
可以被组合成由3个点指定的一个行,即{{0,0},{1,1},{2,2}}
。
这个问题的第一部分是:给定一个由2个点指定的线段集合,如何减少这个集合的最小重复点数量。考虑这个由例如:
lines = {
{{0,0}, {1,1}},
{{3,3}, {2,2}},
{{2,2}, {1,1}},
{{1,1}, {0.5,0.5}},
{{0,1}, {0,2}},
{{2,3}, {0,1}}
}
我要的是一个函数说REDUCE
这给了我下面的输出:
R = {
{{0,0}, {1,1}, {2,2}, {3,3}},
{{1,1}, {0.5,0.5}},
{{2,1}, {0,1}, {0,2}}
}
唯一重复的我们需要的是{1,1}
。我这样做的方式如下:我把第一行R
然后我看着lines
中的下一行,并注意到没有终点匹配R
行中的终点,所以我将此新行添加到R
。 lines
中的下一行是{{2,2},{1,1}}
,端点{1,1}
与R
中的第一行相匹配,因此我在R
中追加了{2,2}
。现在我加{{1,1}, {0.5,0.5}}
到R
,我也加了{{0,1}, {0,2}}
。由于lines
中的最后一行有一个端点与R
中的端点匹配,所以我附加了它,因此我们有{{2,1}, {0,1}, {0,2}}
。最后,我查看R
中的所有行,并查看是否有任何端点匹配,在这种情况下,行{{3,3}, {2,2}}
与R
中第一行的右端匹配,因此我附加{3,3}
,因此不需要{2,2}
。
这可能不是最好的办法,因为它可能不会给你最好的减少。无论如何,假设我们有这个约简函数,那么我们可以检查是否需要所有的点来描述一条线。这可以按如下方式完成:
如果我们有超过3个点描述该行,请检查前3个点是否共线,如果是,则删除中间一个,并检查2个端点的集合和一个新的观点。如果他们不是共线,那么转移一个点并检查接下来的3个点。
我问这个问题的原因是因为我想减少描述2D图形所需的点数。尝试以下方法:
g1 = ListPlot3D[
{{0, -1, 0}, {0, 1, 0}, {-1, 0, 1}, {1, 0, 1}, {-1, 1, 1}},
Mesh -> {2, 2},
Boxed -> False,
Axes -> False,
ViewPoint -> {2, -2, 1},
ViewVertical -> {0, 0, 1}
]
以下数学8函数改变3D对象进行的列表(一个线是2点的列表)描述对象的线框:
G3TOG2INFO[g_] := Module[{obj, opt},
obj = ImportString[ExportString[g, "PDF", Background -> None], "PDF"][[1]];
opt = Options[obj];
obj = Cases[obj, _JoinedCurve, \[Infinity]];
obj = Map[#[[2]][[1]] &, obj];
{obj, opt}
]
注意,在数学7我们必须通过_Line
分别代替_JoinedCurve
。应用功能上g1
我们得到
{lines, opt} = G3TOG2INFO[g1];
Row[{Graphics[Map[Line[#] &, lines], opt], [email protected]}]
里面还有90个线段,但我们只需要12(如果我没有做对的直线计数的任何错误)。
所以你有挑战。我们如何操作lines
以具有描述该图所需的最少量的信息。
'JoinedCurve'不在Mathematica 7中,但mma7用户可以使用'Cases [g2,_Line,Infinity]'代替。 – 2011-06-16 04:45:08
我忘了提及输出是用MM8制作的。必须有2个版本的代码。感谢您指出。 – jmlopez 2011-06-16 04:53:30
@Wizard先生,我编辑了这个问题。我几乎有一个线框问题的答案,这将是我算法的最后一步。 – jmlopez 2011-06-20 02:53:34