【问题标题】:How to draw smooth contour/level curves of multivariable functions如何绘制多变量函数的平滑轮廓/水平曲线
【发布时间】:2021-11-09 12:14:27
【问题描述】:

G'day 程序员和数学爱好者。

最近我一直在探索 CAS 图形计算器的功能;特别是,他们如何能够为多变量函数绘制水平曲线和等高线。

在我提出问题之前,请注意几点:

  • 我将 Python 的 Pygame 库纯粹用于窗口和图形。当然还有更好的选择,但我真的很想保持我的代码尽可能原始,以努力学习最多。
  • 是的,是的。我知道matplotlib!天哪,我见过 100 条关于使用其他支持库的不同建议。虽然它们绝对是令人惊叹且功能强大的工具,但我真的在努力从这里的基础上积累我的知识,以便有朝一日我什至能够发展和支持像它们这样的库。

我的最终目标是让情节看起来像这样平滑: Mathematica Contour Plot Circle E.g.

我目前做的是:

  • 在 500x500 点等于 0 的网格上评估函数,具有一定的误差容限(我的是 0.01)。这为我提供了 f(x,y)=0 处水平曲线的粗略近似值。
  • 然后我使用一个不可靠的距离函数来找到每个点的最近邻居,并在两者之间绘制一条抗锯齿线。

这两个步骤的结果可以在这里看到:

First Evaluating Valid Grid Points

Then Drawing Lines to Closest Points

由于显而易见的原因,我在图表中存在间隙,下一个最近点始终保持图表不连续。唉!我想到了另一个笨拙的解决方法。除了找到最近的点之外,它实际上会寻找下一个尚未访问过的最近点吗?这个想法很接近,但似乎仍然没有真正接近有效。以下是我实施后的结果:

Slightly Smarter Point Connecting

我的问题是,这种事情通常如何在图形计算器中实现?我一直在做这一切都错了吗?任何想法或建议将不胜感激:)

(我没有包含任何代码,主要是因为它不是很清楚,也不是特别与问题相关)。

另外,如果有人要提出一些核心数学答案,请不要害怕提出建议,我在编码和数学(尤其是数值和计算方法)方面拥有良好的背景,所以我希望我应该能够对付他们。

【问题讨论】:

  • 也许我遗漏了一些东西,但您不能使用sincos 来计算圆上的点,还是距离您要铺设的地基不够近
  • 啊,好问题,我应该指定的。当然我可以用一百万种不同的方式画一个圆,但我试图将这个问题推广到任何形式为 f(x,y)+c = 0 的多变量函数

标签: python math pygame calculator


【解决方案1】:

所以您正在评估平面上每个 x 和 y 点的方程。然后你检查结果是否

检查是否应绘制点的更好方法是检查以下情况之一是否为真:
(a) 如果点为零
(b) 如果该点为正且至少有一个负邻
(c) 如果该点为负且至少有一个正邻居

这有 3 个问题:

  • 它不支持任何类型的抗锯齿,因此结果看起来不会像您想要的那样平滑
  • 您不能制作更粗的线条(超过 1 个像素)
  • 如果 0 点线只是接触(两边为正,一侧不为正,另一侧为负)

第二种解决方案可能会解决这些问题,但它是由我制作的,未经测试,因此它可能有效,也可能无效:

您将值分配给一个,然后为每个点从其角计算到零线的距离。这是寻找距离的算法:

def distance(tl, tr, bl, br):  # the 4 corners
   avg = abs((tl + tr + bl + br) / 4)  # getting the absolute average
   m = min(map(abs, (tl + tr + bl + br)))  # absolute minimum of points
   if min == 0:  # special case
        return float('inf')
   return avg / m  # distance to 0 point assuming the trend will continue

这将返回到您现在可以绘制像素的 0 线的估计距离,例如如果你想要一条 5 像素的线,那么如果结果为 *255,如果你使用的是 pygames alpha选项)

这个解决方案假设函数有点线性。

尝试一下,最坏的情况下它不起作用......

【讨论】:

    【解决方案2】:

    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.30.1319&rep=rep1&type=pdf

    这个 21 页的文档包含了我准确流畅地绘制隐式曲线所需的一切。它甚至涵盖了优化方法并支持隐式函数的分岔点。强烈推荐给任何与我上面类似的问题的人。

    感谢所有提出建议和澄清问题的人,他们都帮助我找到了这个资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2023-03-09
      • 2012-05-16
      • 1970-01-01
      • 2017-06-10
      相关资源
      最近更新 更多