当前位置: 首页 > 知识库问答 >
问题:

用C(DISLIN)生成Mandlebrot集

洪鸿博
2023-03-14

我试图用c生成mandlebrot集,但我得到了一些不正确的输出 . . . 这个代码有什么问题?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "dislin.h"

//generate jula set data for particular constant
static long double const_x;
static long double const_y;
static long double r_lim;

//handle complex number arithmetic
long double julia_x(long double x, long double y){
  return x * x - y * y;
}
long double julia_y(long double x, long double y){
  return 2 * x * y;
}

long double _abs(long double x, long double y){
  return sqrt(x * x + y * y);
}

//method for determining if a point in the plane is in the julia set
int julia_element(float x, float y, int max_steps){
  long double iter_x = (long double)x;
  long double iter_y = (long double)y;
  int i = 0;
  while(i < max_steps && _abs(iter_x, iter_y) < r_lim){
    long double x_temp = julia_x(iter_x, iter_y);
    iter_y = julia_y(iter_x, iter_y) + const_y;
    iter_x = julia_x(iter_x, iter_y) + const_x;
    i++;
  }
  return i;
}

int main(void){
  //constants for mandlebrot set
  const_x = -0.61803398875; //1 - golden ratio
  const_y = 0.0;
  long double radius = _abs(const_x, const_y);
  r_lim = 2; //solves r_lim(r_lim - 1) = radius

  static int julia_lim = 1000;

  //establish grid size and scale factor
  int POINTS = 10000;
  long double scale = 0.03;

  //store points to be plotted
  float * julia_set_x = malloc(POINTS * sizeof(float));
  float * julia_set_y = malloc(POINTS * sizeof(float));

  int current_x = 0;
  int count = 0;
  for(int i = 0; i < POINTS; i++){
    if(i % 100 == 0){
      current_x++;
    }

    float _x = (float)(-1.5 + current_x * scale);
    float _y = (float)(-1.5 + (i % 100) * scale);

    if(julia_element(_x, _y, julia_lim) == julia_lim){
      julia_set_x[i] = _x;
      julia_set_y[i] = _y;
      count++;
    }else{
      julia_set_x[i] = 0.0;
      julia_set_y[i] = 0.0;
    }
  }
  //draw julia set
  scrmod("revers");
  setpag("da4l");
  metafl("cons");
  disini();

  titlin("Julia Set", 1);
  titlin("F(Z) = Z*Z - 0.8 + 0.156i", 3);

  name("R-axis", "x");
  name("I-axis", "y");

  qplsca(julia_set_x, julia_set_y, 5 * count);


  free(julia_set_x);
  free(julia_set_y);
  return 0;
}

这是输出

它只与这里的结果具有对称性:

https://en.wikipedia.org/wiki/Julia_set#/media/File:Time_escape_Julia_set_from_coordinate_(phi-2,_0). jpg

能得到一些想法会很棒

K

共有1个答案

祝花蜂
2023-03-14

julia_element这看起来不太对:

long double x_temp = julia_x(iter_x, iter_y);
iter_y = julia_y(iter_x, iter_y) + const_y;
iter_x = julia_x(iter_x, iter_y) + const_x;

你是说

long double x_temp = julia_x(iter_x, iter_y);
iter_y = julia_y(iter_x, iter_y) + const_y;
iter_x = x_temp + const_x;

但是为什么不使用C复数呢?

 类似资料:
  • DISLIN是一个高级别,易于使用的绘图库,支持曲线,条形图,饼图,三维彩色图,曲面,轮廓,和地图显示。支持多种输出格式,如X11的,VGA,PostScript , PDF格式,CGM, HPGL , TIFF和PNG等。绘图采用Perl解释语言 , 支持Python和Java,同时还支持大多数的操作系统。

  • 我正在用C#开发一个加密用户和管理员密码的类项目。为了加密,我使用了< code > triplescryptoserviceprovider 。 在配置应用程序中,用户输入用于加密和解密密码的密钥。我想有一个按钮来生成密钥来帮助用户,但我不知道如何随机生成128位。如何生成128位的密钥?

  • 本文向大家介绍windows中使用C# 调用 C语言生成的dll,包括了windows中使用C# 调用 C语言生成的dll的使用技巧和注意事项,需要的朋友参考一下 首先建立一个C语言源文件test.c 然后下载mingw64,解压,进入到bin目录,查看是否有gcc.exe ,只要下载正确肯定是有的,可以把这个bin目录加入环境变量,就可以在任意地方运行gcc。偷懒的做法是直接把刚才做好的test

  • 我正在做一个C#项目,试图生成一个DocuSign信封。 作为起点,我试图在https://github.com/docusign/eg-01-csharp-jwt-framework.通过DocuSign JWT示例 我转到了控制台应用程序让我转到的URL。https://account-d.docusign.com/oauth/auth?response_type=code 完成该过程后,我确

  • 本文向大家介绍C++ 使用CMake生成构建环境,包括了C++ 使用CMake生成构建环境的使用技巧和注意事项,需要的朋友参考一下 示例 CMake可以从单个项目定义为几乎所有编译器或IDE生成构建环境。以下示例将演示如何将CMake文件添加到跨平台的“ Hello World” C ++代码。 CMake文件始终被命名为“ CMakeLists.txt”,并且应该已经存在于每个项目的根目录中(可

  • 我已经使用BouncyCastle来帮助创建基于RSA的证书,因此接下来的步骤或多或少遵循了创建RSA证书的方法。 (注意,前缀用于来自BouncyCastle的类,用于.NET类) 1生成密钥对:私钥和公钥 如果我可以使用没有私钥的证书,则可以执行以下操作: 我就完蛋了。 当试图设置私钥时会出现问题: