首页 > 解决方案 > 在 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]

建议的带有地图和剪裁的线列表

标签: wolfram-mathematica

解决方案


其他类型的编程语言在很大程度上取决于您编写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但没有成功,我认为您应该确切研究为什么这对您不起作用以及这是否对您有用。


推荐阅读