【问题标题】:Drawing a Mandelbrot Set绘制 Mandelbrot 集
【发布时间】:2022-02-28 03:21:52
【问题描述】:

我正在尝试制作 Mandelbrot Set 的功能,但我不确定我做错了什么,这里是代码:

private void StartCircles()
{
    float savePower = BlackCircle.anchoredPosition.x;
    GameObject[] AllCircles = new GameObject[itarations];
    AllCircles[0] = BlackCircle.gameObject;
    for (int i = 1; i < itarations; i++)
    {
        GameObject Circle = Instantiate(BlackCircle.gameObject, Vector3.zero, Quaternion.identity);
        Circle.transform.SetParent(CanvasPerent);
        savePower = Mathf.Pow(savePower, 2);
        savePower += RedCircle.anchoredPosition.x;
        Circle.GetComponent<RectTransform>().anchoredPosition = new Vector2(savePower,
            AllCircles[i - 1].GetComponent<RectTransform>().anchoredPosition.y * -1);
        AllCircles[i] = Circle;
    }
    CleanSqud = new GameObject[itarations];
    CleanSqud = AllCircles;
}

我不确定 y 位置应该是什么,如果 x 位置是 2 的幂,它怎么会是 0。

这是显示:

【问题讨论】:

  • 如果平方数是complex number,2 的幂的 x 位置可以是
  • 我没有看到任何复杂的域,也没有基于逃逸半径的结束条件......为什么你在单像素迭代循环中使用变换、圆形和矩形?那将是Slooooooooow,而且没有任何意义。看到这个simple Mandelbort(注意片段着色器中的for循环),一旦工作你可以移动到more advanced一个
  • 要清楚 for 循环将计算每个像素的迭代次数,因此您需要对图像的每个像素执行此操作... PS如果您不熟悉复杂域,您可以在此处找到如何使用真实域计算basic operations。这里还有一些更奇特的东西tetration fractal
  • 谢谢,我会学习复数
  • 请注意,2**n 是 2 的幂,但 n**2 不是。后者被表述为“二的幂”(n**2)而不是“二的幂”(2**n)。语言差异很小,但意义重大,因为意义上的差异至关重要。

标签: c# algorithm mandelbrot


【解决方案1】:

我设法让我的代码在一段时间后工作,如果有人遇到我的问题,我有一些答案可以分享:

好吧,我只想制作 zn + 1 = zn * zn + c 的函数 我没有做全套只有这个功能,这是我的代码:

    #region Actions
private void OnDestroy()
{
    MoveBlack.HasMoved -= HasMoved;
    MoveBlack.HasStoped -= HasStoped;

    MoveRed.HasMoved -= HasMoved;
    MoveRed.HasStoped -= HasStoped;
}
private void LateUpdate()
{
    if (moved) { updateCircles(); }
    if (hasparty)
    {
        foreach(GameObject game in CleanSqud)
        {
            game.GetComponent<Image>().color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f));
        }
    }
}
private void HasMoved()
{
    moved = true;
}

private void HasStoped()
{
    moved = false;
}


#endregion

#region Updateing
private void updateCircles()
{
    foreach (GameObject Circle in CleanSqud) { if (Circle.gameObject.name != "BlackCirlce") { Destroy(Circle); } }
    StartCircles();
}


private void StartCircles()
{


    float x = BlackCircle.anchoredPosition.x;
    float y = BlackCircle.anchoredPosition.y;
    GameObject[] AllCircles = new GameObject[itarations];
    AllCircles[0] = BlackCircle.gameObject;
    for (int i = 1; i < itarations; i++)
    {

        GameObject Circle = Instantiate(BlackCircle.gameObject, Vector3.zero, Quaternion.identity);
        Circle.transform.SetParent(CanvasPerent);
        AllCircles[i] = Circle;

        x = Mathf.Pow(x, 2);
        x -= Mathf.Pow(AllCircles[i - 1].GetComponent<RectTransform>().anchoredPosition.y, 2);
        x += RedCircle.anchoredPosition.x;

        y = (2 * AllCircles[i - 1].GetComponent<RectTransform>().anchoredPosition.x
            * AllCircles[i - 1].GetComponent<RectTransform>().anchoredPosition.y) + RedCircle.anchoredPosition.y;

        Circle.GetComponent<RectTransform>().anchoredPosition = new Vector2(x, y);





    }
    CleanSqud = new GameObject[itarations];
    CleanSqud = AllCircles;
}
#endregion

所以你应该做的是将 y 显示为虚构的而将 x 显示为真实的使用等式显示它: 这个 x = 旧 x 的幂 - 旧 y 的幂 + c.x 这个 y = 2 * 旧 x * 旧 y + c.y

这应该可以! 谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多