【发布时间】:2011-06-16 07:58:42
【问题描述】:
我们如何告诉 Mathematica 给我们一组不相交的线?在这种情况下,如果两条线有一个共同点(不是端点),则它们相交。考虑这个简单的案例:
l1 = {{-1, 0}, {1, 0}};
l2 = {{0, -1}, {0, 1}};
lines = {l1, l2};
这个想法是创建一个函数,给定一组线,返回一组不相交的线。如果存在这样的函数,比如split,则输出
split[lines]
会
{
{{-1, 0}, {0,0}},
{{ 0, 0}, {1,0}},
{{ 0,-1}, {0,0}},
{{ 0, 0}, {0,1}}
}
该函数检测到{0,0} 是集合中两条线的交点,为了得到不相交的线,它在交点处破坏了线段,从而产生了另外两条线。如果原始输入包含更多行,则此过程会变得更加复杂。有谁知道如何在 Mathematica 中有效地做到这一点而不使用循环?了解一种算法来查找two lines are intersecting 可能会有所帮助。
注意
这个问题是我尝试找出how to make wire frames in Mathematica with hidden line removal 的第二部分。请随意添加更多合适的标签。
【问题讨论】:
-
我这里没有 Mma,但你想要的是使用标准线性代数将每一行表示为 A.{x, y}=c,并找到两个方程的点线为真,使用 LinearSolve.然后,检查解决方案是否在给定的两条线段的末端之间。如果是这样,请在该点打破线条。与我对您之前问题的回答一样,您希望对 Tuples[Sort[lines],{2}] 执行此操作。
-
@Verbeia,
Tuples[Sort[lines], {2}]应该做什么?让我们假设lines在我的帖子中被定义。 -
只有当您有一个要检查的多于两行的列表并且想要检查所有可能的行对时,才需要使用元组函数。它所做的只是从具有两个以上元素的列表中创建所有可能的元素对的列表。下面的 ACL 回答处理重复问题,可能是比元组更好的解决方案。
标签: wolfram-mathematica mathematica-8