- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我试图找到问题答案的一部分 wireframes in Mathematica .
给定一组线段,如何连接两个相连且位于同一条线上的线段。例如考虑线段 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}}
}
我想要的是一个函数 say 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
中的第一行,所以我将 {2,2}
附加到 R
中的行。现在我将 {{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 个点。
我问这个问题的原因是因为我想减少描述二维图形所需的点数。尝试以下操作:
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}
]
以下 Mathematica 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}
]
请注意,在 Mathematica 7 中,我们必须将 _JoinedCurve
替换为 _Line
。将函数应用于 g1
我们得到
{lines, opt} = G3TOG2INFO[g1];
Row[{Graphics[Map[Line[#] &, lines], opt], Length@lines}]
那里有 90 条线段,但我们只需要 12 条(如果我在计算直线时没有犯错的话)。
所以你遇到了挑战。我们如何操作线
以获得描述图形所需的最少信息量。
最佳答案
第 1 步是查找这些线是否在同一投影上。如果第一条线的斜率等于从第一条线的倒数第二个点到第二条线的第二个点的构造线段的斜率,则为真。
我的工作机器上没有 Mathematica,所以我无法对此进行测试(可能存在语法错误),但像下面这样的东西应该可以工作:
(( #2[[2,2]]-#1[[-2,2]])/(#2[[2,1]]-#1[[-2,1]])) ==
(( #1[[-1,2]]-#1[[-2,2]])/(#1[[-1,1]]-#1[[-2,1]])) &
@@@ (Transpose[{Most[lines],Rest[lines]}])
本质上,这一切所做的就是测试第一行的“上升超过运行”是否等于连接线段的“上升超过运行”。
我假设 :lines: 不是 JoinedCurve 元素的列表,而是 n*2 个点列表的简单列表。我还假设定义每条线段的点对按规范顺序排列,这些点在 x 方向上按升序排列。即第一个点的第一个元素的值小于第二个点的第一个元素的值。如果不是,请先对它们进行排序。
第 2 步实际上是连接点。这将应用步骤 1 中的测试,然后将两条线替换为一条连接线。您可以将其包装在 FixedPoint 中以连接同一投影中的所有线。
If[(( #2[[2,2]]-#1[[-2,2]])/(#2[[2,1]]-#1[[-2,1]])) ==
(( #1[[-1,2]]-#1[[-2,2]])/(#1[[-1,1]]-#1[[-2,1]])), {#1[[-2]],#2[[2]]}] &
@@@ (Transpose[{Most[lines],Rest[lines]}])
这一切都假定您要比较的线对在列表中是相邻的。如果它们可能是您集合中的任何一行,那么您首先需要生成一个列表,其中包含要比较的所有可能的行对,例如使用 Tuples[listOfLines, {2}],而不是上面的 Transpose 函数。
好的,把这些放在一起:
f = If[(( #2[[2,2]]-#1[[-2,2]])/(#2[[2,1]]-#1[[-2,1]])) ==
(( #1[[-1,2]]-#1[[-2,2]])/(#1[[-1,1]]-#1[[-2,1]])), {#1[[-2]],#2[[2]]}] & ;
FixedPoint[f @@@ #, Tuples[Sort[listOfLines],{2}] ]
我已将第 2 步测试和替换函数分解为一个命名的纯函数,这样 #s 就不会混淆。
关于wolfram-mathematica - 数学 : Joining line segments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6367125/
我在一个俄罗斯编程论坛上遇到了这个问题,但还没有想出一个优雅的解决方案。 问题: 你有一个包含N个正整数的数组,你需要将它分成M个连续的段,使得最大段的和是可能的最小值。通过段的总数,我的意思是它所有
我正在从文本“从 0 到 1 的操作系统”中学习链接脚本,并且在文本中他们展示了一个使用关键字 PHDRS 的示例; ENTRY(main); PHDRS { headers PT_P
一个小型测试程序在 64 位 Linux 上使用 gfortran (4.4.5) 返回段错误。 n=2_8**22_8 时不存在故障。 gdb 指示在循环的第一次迭代期间函数 mylen 中发生段错
我正在尝试计算一个比率,当我的分子数组充满 0 时它可以工作,但是当我在分子数组中有值时会中断程序。 223 Double_t *ratio_calculations(int bin_numbers,
我正在研究组合分页/分段系统,在我的书中有两种方法: 1.paged segmentation 2.segmented paging 我无法弄清楚两者之间的区别。我认为在分页分段中,段被分成页面,在分
语义分割只是一种重复,还是“语义分割”和“分割”之间有区别? “场景标记”和“场景解析”有区别吗? 像素级分割和像素级分割有什么区别? (附带问题:当您拥有这种逐像素注释时,您是否可以免费获得对象检测
我遇到了一个非常奇怪的行为,我正在遵循在线文档,并且在创建一个段来与我的子段一起使用时,lambda 按以下顺序执行: xray_recorder.begin_segment('segment-nam
我们正在我们的服务器上进行一些负载测试,我正在使用 tshark 将一些数据捕获到 pcap 文件,然后使用 wireshark GUI 通过转到 Analyze -> expert Info 来查看
我是一名高中生,今年开始学习汇编。 我目前正在制作 Pacman 克隆作为我的最终项目。 我遇到的唯一问题是我的代码很大,*.exe 文件几乎有 64KB。 所以我的问题是,如果我转向模型介质,我需要
前言 本系列文章是博主在工作中使用SAM模型时的学习笔记,包含三部分: SAM初步理解,简单介绍模型框架,不涉及细节和代码 SAM细节理解,对各模块结合代码进一步分析 SAM微调实例
我很困惑进程在使用虚拟内存时如何可能出现段错误。据我了解,“虚拟”内存允许进程访问所有可用内存,然后将其映射到“实际”硬件内存。通过这种转换,进程怎么可能尝试访问不允许访问的内存部分? 最佳答案 听起
Tritwise操作(向右旋转和疯狂操作)无法正确运行,并在Malbolge编译器/解释器中引发分段错误。 在看到有关Coding Challenges和Code Golf的惊人答案之后,我决定开始在
只是有关DirectX11镶嵌的问题。 在“船体着色器”中,可以设置的最大镶嵌因子为64(不确定原因)。现在,尽管对于小型飞机已经足够了,但是对于大型飞机来说,这还远远不够,所以我想知道如何渲染大型飞
我需要在 matlab 中手动分割图像。我很想使用“impoly”,但我主要需要分割圆形对象。 我在 Youtube 上的 Ali Pashaei 视频中找到了我需要的东西,在“FlowImagePr
我有下面的代码。当我取消注释 temperature(i,j) = anode_temperature 时,我会出现 SegFault。 forall(i=0:Cells(1), j=0:Cells(
我是 C 编程新手,我的代码中出现了段错误。该程序使用返回函数来询问用户他们的银行帐户中有多少钱。稍后我将添加代码来计算利息。感谢您为我查看此内容,因为我很难找出为什么会出现此错误。 #include
为了测试,我编写了一个代码来计算 #include int main(void) { int p, i, primes[50], index; boo
这个问题已经有答案了: What is a segmentation fault? (17 个回答) 已关闭 5 年前。 最近我开始研究内置函数,但遇到了一个错误,那就是: 为什么我会遇到此程序段错误
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
注意:我们有很多段错误,基本相同 答案,所以我试图将其分解为一个规范的问题,例如 我们有undefined reference。 尽管我们有一个关于what a segmentati
我是一名优秀的程序员,十分优秀!