wolfram-mathematica - 在 Mathematica 中绘制线条列表并修剪到一个区域
问题描述
例如,我在列表中指定了一些行
linelist = {Line[{{-390, 1}, {1690, 1}}],
Line[{{-390, 40}, {1690, 40}}], Line[{{-390, 79}, {1690, 79}}],
Line[{{-390, 118}, {1690, 118}}], Line[{{-390, 781}, {1690, 781}}],
Line[{{-390, 820}, {1690, 820}}], Line[{{-390, 859}, {1690, 859}}],
Line[{{-390, 898}, {1690, 898}}], Line[{{-498, 460}, {1185, 1682}}],
Line[{{-521, 491}, {1162, 1714}}],
Line[{{-544, 523}, {1139, 1745}}],
Line[{{-567, 554}, {1116, 1777}}],
Line[{{-590, 586}, {1093, 1809}}],
Line[{{-613, 617}, {1070, 1840}}],
Line[{{-636, 649}, {1047, 1872}}],
Line[{{-659, 681}, {1024, 1903}}],
Line[{{946, -541}, {1588, 1437}}],
Line[{{908, -528}, {1551, 1449}}],
Line[{{871, -517}, {1514, 1462}}],
Line[{{834, -504}, {1477, 1473}}],
Line[{{797, -493}, {1440, 1486}}],
Line[{{760, -481}, {1402, 1498}}],
Line[{{723, -469}, {1366, 1510}}],
Line[{{686, -457}, {1328, 1522}}],
Line[{{1291, -237}, {648, 1741}}],
Line[{{1255, -250}, {611, 1729}}],
Line[{{1217, -261}, {575, 1717}}],
Line[{{1181, -274}, {538, 1705}}],
Line[{{1143, -285}, {501, 1693}}],
Line[{{1107, -296}, {463, 1681}}],
Line[{{1069, -309}, {427, 1668}}],
Line[{{1032, -321}, {389, 1657}}], Line[{{995, -333}, {352, 1646}}],
Line[{{958, -345}, {316, 1633}}],
Line[{{1002, -638}, {-680, 584}}], Line[{{979, -668}, {-703, 553}}]}
Graphics@linelist
我试图找出一种方法来遍历每一行以执行测试,例如与 0,0 坐标的距离。
此外,终点不在我的关注范围之内。我想将线条限制在盒装区域,例如从 -1600、-1600 到 1600、1600
我已经玩了几个小时,并试图为 Line 语句创建一个 for 循环,但是,我无法让它们回到同一个图表上。
我通过剪裁得到的情节适用于水平线,但是倾斜的线不再平行。(来自下面的建议答案)
newlinelist = Map[({{x1, y1}, {x2, y2}} = #[[1]];
Line[{{Clip[x1, {0, 1300}],
Clip[y1, {0, 1300}]}, {Clip[x2, {0, 1300}],
Clip[y2, {0, 1300}]}}]) &, linelist]
解决方案
其他类型的编程语言在很大程度上取决于您编写For
循环。在 Mathematica 中可以做到这一点,但还有其他方法可以做到这一点。例如:
linelist={
Line[{{-390,1},{1690,1}}],Line[{{-390,40},{1690,40}}],Line[{{-390,79},{1690,79}}],
Line[{{-390,118},{1690,118}}],Line[{{-390,781},{1690,781}}],Line[{{-390,820},{1690,820}}],
Line[{{-390,859},{1690,859}}],Line[{{-390,898},{1690,898}}],Line[{{-498,460},{1185,1682}}],
Line[{{-521,491},{1162,1714}}],Line[{{-544,523},{1139,1745}}],Line[{{-567,554},{1116,1777}}],
Line[{{-590,586},{1093,1809}}],Line[{{-613,617},{1070,1840}}],Line[{{-636,649},{1047,1872}}],
Line[{{-659,681},{1024,1903}}],Line[{{946,-541},{1588,1437}}],Line[{{908,-528},{1551,1449}}],
Line[{{871,-517},{1514,1462}}],Line[{{834,-504},{1477,1473}}],Line[{{797,-493},{1440,1486}}],
Line[{{760,-481},{1402,1498}}],Line[{{723,-469},{1366,1510}}],Line[{{686,-457},{1328,1522}}],
Line[{{1291,-237},{648,1741}}],Line[{{1255,-250},{611,1729}}],Line[{{1217,-261},{575,1717}}],
Line[{{1181,-274},{538,1705}}],Line[{{1143,-285},{501,1693}}],Line[{{1107,-296},{463,1681}}],
Line[{{1069,-309},{427,1668}}],Line[{{1032,-321},{389,1657}}],Line[{{995,-333},{352,1646}}],
Line[{{958,-345},{316,1633}}],Line[{{1002,-638},{-680,584}}],Line[{{979,-668},{-703,553}}]};
newlinelist=Map[({{x1,y1},{x2,y2}}=#[[1]];
Line[{{Clip[x1,{-1600,1600}],Clip[y1,{-1600,1600}]},
{Clip[x2,{-1600,1600}],Clip[y2,{-1600,1600}]}}])&,linelist
]
返回
{Line[{{-390,1},{1600,1}}],Line[{{-390,40},{1600,40}}],Line[{{-390,79},{1600,79}}],
Line[{{-390,118},{1600,118}}],Line[{{-390,781},{1600,781}}],Line[{{-390,820},{1600,820}}],
Line[{{-390,859},{1600,859}}],Line[{{-390,898},{1600,898}}],Line[{{-498,460},{1185,1600}}],
Line[{{-521,491},{1162,1600}}],Line[{{-544,523},{1139,1600}}],Line[{{-567,554},{1116,1600}}],
Line[{{-590,586},{1093,1600}}],Line[{{-613,617},{1070,1600}}],Line[{{-636,649},{1047,1600}}],
Line[{{-659,681},{1024,1600}}],Line[{{946,-541},{1588,1437}}],Line[{{908,-528},{1551,1449}}],
Line[{{871,-517},{1514,1462}}],Line[{{834,-504},{1477,1473}}],Line[{{797,-493},{1440,1486}}],
Line[{{760,-481},{1402,1498}}],Line[{{723,-469},{1366,1510}}],Line[{{686,-457},{1328,1522}}],
Line[{{1291,-237},{648,1600}}],Line[{{1255,-250},{611,1600}}],Line[{{1217,-261},{575,1600}}],
Line[{{1181,-274},{538,1600}}],Line[{{1143,-285},{501,1600}}],Line[{{1107,-296},{463,1600}}],
Line[{{1069,-309},{427,1600}}],Line[{{1032,-321},{389,1600}}],Line[{{995,-333},{352,1600}}],
Line[{{958,-345},{316,1600}}],Line[{{1002,-638},{-680,584}}],Line[{{979,-668},{-703,553}}]}
这样做是使用一个函数,该Map
函数采用一个列表和另一个函数应用于该列表中的每个项目,并返回一个结果列表。该函数对您的应用程序所做的是从您的应用程序中提取 x1,y1,x2,y2 值,Line
然后使用 MathematicaClip
函数来约束这些值,最后Line
用新值构造一个新值。
新用户可能难以理解这些#
和功能的东西。&
这是另一种编写应该做同样事情的方法。
f[Line[{{x1_,y1_},{x2_,y2_}}]]:=Line[{{Clip[x1,{-1600,1600}],Clip[y1,{-1600,1600}]},
{Clip[x2,{-1600,1600}],Clip[y2,{-1600,1600}]}}];
newlinelist=Map[f,linelist]
您应该验证它是否正确修剪了您的每条线,使其位于您想要的 -1600...1600 框中。
我有点担心结果。如果你比较这两个图形
Graphics[linelist]
Graphics[newlinelist]
你可以看到它们的上半部分是不同的,这似乎不仅仅是因为修剪了 x 和 y 的范围。请注意,第二条线中的某些线不再平行。如果那是你真正想要的,你应该试着说服自己。
获得不同图形的一种完全不同的方法,但不改变底层线列表,是比较这两个
Graphics[linelist]
Graphics[linelist,PlotRange->{{-1600,1600},{-1600,1600}}]
请注意,所有线条在第二条中保持平行。
您写道,您曾尝试使用PlotRange
但没有成功,我认为您应该确切研究为什么这对您不起作用以及这是否对您有用。
推荐阅读
- regex - 如何在 MongoDB 中使用条件查询
- javascript - 如何根据列表中的标签链接提交按钮?
- swiftui - 如何在 SwiftUI 中为函数定义默认的空输入内容?
- python - Python 命令行中的语法“SOME_VAR=/some/path python pythonFile.py”是什么?
- java - 我无法截断要比较的数字
- reactjs - Webpack/Babel/React 项目上的“当前未启用对实验语法 'jsx' 的支持”
- tensorflow - 如何在下面的代码中找到分配给验证集的每个图像的标签?
- android - Android 10 及更高版本的 Scoped Storage 应用程序崩溃,将图像上传到服务器
- javascript - 获取 URL 时如何删除“localhost:3000”
- sql-server - 无法为 .Net Core 3.1 搭建登录页面。错误:运行选择的代码生成器包还原失败时出错