没有“新”就不能使用我的“类型” ComplexNumber-为什么?

DSlomer64

多年来,Mandelbrot装置一直是我的最爱。几年前,我已经在Pascal上成功创建了它,最近又在TI-83图形计算器上成功创建了它(Java使它更快地更新了)。

由于涉及到复数,因此我从一个文本中获取了一个版本,该版本extends RecursiveAction使用BufferedImageand ForkJoinPool(不理解这些概念和总体实现),并使用我几个月前开发的例程来修改(完全删除)点绘图,使其看起来更像是复数。

原版的:

public class MandelbrotTask extends RecursiveAction  {

...

public void render() {

...

for (int x = xStart; x <= xEnd; x++) {
  for (int y = yStart; y <= yEnd; y++) {
    double r = x * zoomFactor / image.getWidth() - zoomFactor / 2 + offsetX;
    double i = y * zoomFactor / image.getHeight() - zoomFactor / 2 + offsetY;
    double zr = 0, zi = 0;
    int iter;
    for (iter = 0; iter < maxIter; iter++) {
      double nzr = zr * zr - zi * zi + r;
      double nzi = 2 * zr * zi + i;
      if (nzr * nzr + nzi * nzi > escapeRadius * escapeRadius)
        break;
      zr = nzr;
      zi = nzi;
    }
    image.setRGB(x, y, Color.HSBtoRGB(0.5f * iter / maxIter, 1.0f, 1.0f));
  }
}

我修改过的,更干净的代码:

for (int x = xStart; x <= xEnd; x++) {
  for (int y = yStart; y <= yEnd; y++) {
    z1 = new ComplexNumber(x * dx - zoomFactor / 2 + offsetX,
                           y * dy - zoomFactor / 2 + offsetY);
    z0 = new ComplexNumber(0,0);
    int iter;
    for (iter = 0; iter < maxIter; iter++) {
      nz = cAdd(cMult(z0,z0),z1);
      if (cAbs(nz) > escapeRadius )
        break;
      z0 = nz;
    }
    image.setRGB(x, y, Color.HSBtoRGB(0.5f * iter / maxIter, 1.0f, 1.0f));
  }
}

我唯一的问题是如何在定义z1和z0的两行上摆脱“ new”似乎我在浪费大量的内存,因为在上述代码块的近25,000次执行期间,两个对象总共“更新”了1,000,000+次,尽管这没有问题。

我知道我new至少需要在该方法内部执行一次,但是如果我将语句(如下所示)放在循环之外(以及内部或外部render()),并且如果我省略new了上面代码块中定义z1和z0的这两行,我收到错误消息“找不到符号:方法ComplexNumber(double,double)位置:类MandelbrotTask。”

z1 = new ComplexNumber();
z0 = new ComplexNumber();

----编辑10:21 12/26/13

这是被调用的ComplexNumber类的一部分。构造函数调用ComplexNumber()集合real,并imag-inary部分为0。

class ComplexNumber {
  public double real;       
  public double imag;       

  public ComplexNumber() {
    real = 0.0;
    imag = 0.0;
  }

  public ComplexNumber(double r, double i) {
    this.real = r;
    this.imag = i;
  }

    public static ComplexNumber cAdd(ComplexNumber a, ComplexNumber b) {
    return new ComplexNumber(a.real + b.real, a.imag + b.imag);
  }

  public static ComplexNumber cMult(ComplexNumber a, ComplexNumber b) {
   return new ComplexNumber(a.real * b.real - a.imag * b.imag, a.real * b.imag + a.imag * b.real);
  }

  public static double sqr(double x) {
    return x * x;
  }

  public static double cAbs(ComplexNumber z) {
    return Math.sqrt(sqr(z.real) + sqr(z.imag));
  }

}
声波计划

得到了一些好评,因此我将自己的评论转换为答案。如果要避免在循环中反复实例化,唯一的出路是为ComplexNumber创建setter方法

public void setReal(double real) { this.real = real; }
public void setImaginary(double im) { this.im = im; }
public void setTo(double real, double im) { setReal(real); setImaginary(im); }

我假设您的课程有称为real和的字段im

此外,如果您不能修改类本身,则应通过创建form的包装器类来扩展它class MyComplexNumber extends ComplexNumber,然后为MyComplexNumber实现setter方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

update() 的主要目的是什么?为什么我的代码没有 update() 就不能工作?

来自分类Dev

为什么不参考Outlook库就不能使用MailItem.BodyFormat?

来自分类Dev

为什么不参考Outlook库就不能使用MailItem.BodyFormat?

来自分类Dev

为什么在共享服务中使用 Subject 或 BehaviorSubject,没有 observable 就不能实现?

来自分类Dev

为什么没有花括号就不能创建1语句函数?

来自分类Dev

为什么没有客户端就不能控制服务器?

来自分类Dev

为什么这段代码没有空格就不能解析?

来自分类Dev

为什么我的CREATE TABLE语句不带反引号就不能运行?

来自分类Dev

为什么在Ruby on Rails中不使用!important就不能更改link_to文本颜色?

来自分类Dev

为什么我不能使用私有抽象方法?

来自分类Dev

为什么我不能使用asyncTask

来自分类Dev

为什么我不能使用TensorFlow一键式编码标签?(错误的切片索引没有类型<type'NoneType'>的类型)

来自分类Dev

Perl:没有括号就不能使用正则表达式

来自分类Dev

为什么我必须强制转换为类型参数,而不能使用受约束的类型?

来自分类Dev

为什么我不能使用dplyr使用mutate()创建新列的函数?

来自分类Dev

为什么我的Viewpager在第二次打开后没有显示任何片段,为什么不能使用childfragmentmanager?

来自分类Dev

为什么虚拟函数不能使用返回类型推导?

来自分类Dev

为什么不能使用`Show a => [Something-> a]`类型?

来自分类Dev

为什么不能使用long long int类型?C ++

来自分类Dev

为什么不能使用memcmp()函数比较浮点类型?

来自分类Dev

为什么不能使用long long int类型?C ++

来自分类Dev

为什么不能使用类的实例创建新的线程?

来自分类Dev

为什么我不能使用通用类型来实现非通用签名

来自分类Dev

函数不能使用类型推断,但是我不明白为什么

来自分类Dev

C ++语法问题-为什么我不能使用逗号分隔不同类型的变量定义

来自分类Dev

为什么不从NSObject继承类就不能迅速采用协议?

来自分类Dev

为什么不选中就不能在字节上工作?

来自分类Dev

为什么我不能使用带有“ GET”方法的Express'Router()访问我的参数

来自分类Dev

为什么我不能使用我所有的8 GB RAM?

Related 相关文章

  1. 1

    update() 的主要目的是什么?为什么我的代码没有 update() 就不能工作?

  2. 2

    为什么不参考Outlook库就不能使用MailItem.BodyFormat?

  3. 3

    为什么不参考Outlook库就不能使用MailItem.BodyFormat?

  4. 4

    为什么在共享服务中使用 Subject 或 BehaviorSubject,没有 observable 就不能实现?

  5. 5

    为什么没有花括号就不能创建1语句函数?

  6. 6

    为什么没有客户端就不能控制服务器?

  7. 7

    为什么这段代码没有空格就不能解析?

  8. 8

    为什么我的CREATE TABLE语句不带反引号就不能运行?

  9. 9

    为什么在Ruby on Rails中不使用!important就不能更改link_to文本颜色?

  10. 10

    为什么我不能使用私有抽象方法?

  11. 11

    为什么我不能使用asyncTask

  12. 12

    为什么我不能使用TensorFlow一键式编码标签?(错误的切片索引没有类型<type'NoneType'>的类型)

  13. 13

    Perl:没有括号就不能使用正则表达式

  14. 14

    为什么我必须强制转换为类型参数,而不能使用受约束的类型?

  15. 15

    为什么我不能使用dplyr使用mutate()创建新列的函数?

  16. 16

    为什么我的Viewpager在第二次打开后没有显示任何片段,为什么不能使用childfragmentmanager?

  17. 17

    为什么虚拟函数不能使用返回类型推导?

  18. 18

    为什么不能使用`Show a => [Something-> a]`类型?

  19. 19

    为什么不能使用long long int类型?C ++

  20. 20

    为什么不能使用memcmp()函数比较浮点类型?

  21. 21

    为什么不能使用long long int类型?C ++

  22. 22

    为什么不能使用类的实例创建新的线程?

  23. 23

    为什么我不能使用通用类型来实现非通用签名

  24. 24

    函数不能使用类型推断,但是我不明白为什么

  25. 25

    C ++语法问题-为什么我不能使用逗号分隔不同类型的变量定义

  26. 26

    为什么不从NSObject继承类就不能迅速采用协议?

  27. 27

    为什么不选中就不能在字节上工作?

  28. 28

    为什么我不能使用带有“ GET”方法的Express'Router()访问我的参数

  29. 29

    为什么我不能使用我所有的8 GB RAM?

热门标签

归档