帮我将处理代码转换为C#

时间:2009-06-25 19:51:23

标签: c# processing system.drawing

我正在尝试将此代码从java转换为C#(位于here

我有一些winform经验,但在winform应用程序中绘制像素的次数不多。

我觉得我可以转换大部分子方法,但我不知道如何在屏幕上绘制单个像素

任何将java转换为c#的帮助或工具都会受到极大的欢迎

// Buddhabrot
// j.tarbell   January, 2004
// Albuquerque, New Mexico
// complexification.net

// based on code by Paul Bourke
// astronomy.swin.edu.au/~pbourke/

// Processing 0085 Beta syntax update
// j.tarbell   April, 2005

int dim = 800;             // screen dimensions (square window)
int bailout = 200;         // number of iterations before bail
int plots = 10000;        // number of plots to execute per frame (x30 = plots per second)

// 2D array to hold exposure values
int[] exposure = new int[dim*dim];
int maxexposure;           // maximum exposure value
int time = 0;
int exposures = 0;

boolean drawing;
PFont metaBold;

//  MAIN ----------------------------------------------------------------

void setup() {
  // set up drawing area
  size(800,800,P3D);
  background(0);
  // take it nice and easy
  framerate(15);
  // load typeface
  metaBold = loadFont("Arial-48.vlw");
}

void draw() {
  plotPlots();
  time++;
  if (time%30==0) {
    // show progress every 2 seconds or so...
    findMaxExposure();
    renderBrot();
    // show exposure value
    fill(255);
    noStroke();
    textFont(metaBold, 14);
    text("bailout:  "+bailout+"    exposures: "+exposures, 5, dim-6);
  }
}

void plotPlots() {
  float x, y;
  // iterate through some plots
  for (int n=0;n<plots;n++) {
    // Choose a random point in same range
    x = random(-2.0,1.0);
    y = random(-1.5,1.5);
    if (iterate(x,y,false)) {
      iterate(x,y,true);
      exposures++;
    }
  }
}

void renderBrot() {
  // draw to screen
  for (int i=0;i<dim;i++) {
    for (int j=0;j<dim;j++) {
      float ramp = exposure[i*dim+j] / (maxexposure / 2.5);
      // blow out ultra bright regions
      if (ramp > 1)  {
        ramp = 1;
      }
      color c = color(int(ramp*255), int(ramp*255), int(ramp*255));
      set(j,i,c);
    }
  }
}

//   Iterate the Mandelbrot and return TRUE if the point exits
//   Also handle the drawing of the exit points
boolean iterate(float x0, float y0, boolean drawIt) {
  float x = 0;
  float y = 0;
  float xnew, ynew;
  int ix,iy;

  for (int i=0;i<bailout;i++) {
    xnew = x * x - y * y + x0;
    ynew = 2 * x * y + y0;
    if (drawIt && (i > 3)) {
      ix = int(dim * (xnew + 2.0) / 3.0);
      iy = int(dim * (ynew + 1.5) / 3.0);
      if (ix >= 0 && iy >= 0 && ix < dim && iy < dim) {
        // rotate and expose point
        exposure[ix*dim+iy]++;
      }

    }
    if ((xnew*xnew + ynew*ynew) > 4) {
      // escapes
      return true;
    }
    x = xnew;
    y = ynew;
  }
  // does not escape
  return false;
}

void findMaxExposure() {
  // assume no exposure
  maxexposure=0;
  // find the largest density value
  for (int i=0;i<dim;i++) {
    for (int j=0;j<dim;j++) {
      maxexposure = max(maxexposure,exposure[i*dim+j]);
    }
  }
}

// Buddhabrot
// j.tarbell   January, 2004

7 个答案:

答案 0 :(得分:5)

以下是类似的问题:Tools to assist

这是MS released tool for converting Java to C#

答案 1 :(得分:4)

查看System.Drawing和Graphics类。

编辑:只是为了消除困惑,OP的代码不是Java。这是Processing。它在评论中也这么说,但是,你可以说,因为没有类定义,没有导入,并且调用不是Java调用。它编译为字节码,并与Java互操作,但它不是Java - 没有自动转换会有所帮助。

答案 2 :(得分:2)

System.Drawing命名空间中包含各种图形内容。它上面有some tutorials

答案 3 :(得分:2)

如果您在保持高帧率时尝试操纵像素并绘制到屏幕,则可能需要使用lockbits和unlockbits查看System.Drawing.Bitmap。

可以找到一个很好的解释here。否则你无法以任何合适的速度进行像素级编辑。

答案 4 :(得分:1)

要绘制单个像素,您可以使用:

e.Graphics.FillRectangle(aBrush, x, y, 1, 1);

您可能希望查看here

答案 5 :(得分:0)

如果您转到processing.org并下载处理软件,则可以将此代码复制到IDE中。然后,如果您执行“File&gt; Export”,它将创建程序的Java applet版本,并附带Java源代码。那么也许你可以运行一些其他的转换器来获得C#代码。

(请注意,此代码似乎是Processing的旧版本;我必须将“framerate”更改为“frameRate”才能运行。另外,我必须执行命令“Tools&gt; Create Font ...”创建所需的“Arial-48.vlw”字体文件。)

答案 6 :(得分:-1)

我们在玩Guess the Base Class吗? :)

原始代码似乎不是完整的java,具有全局变量和自由函数的东西。它是类声明的内容吗?

问题是,Java代码使用的是什么框架?因为如果它是一个花哨的双缓冲系统,那么你可能不会通过直接在屏幕上绘制像素而在Winforms中获得相同的结果。

您可能会通过Google搜索获得关键字的最佳结果:DirectX C#

更新: OP不知道它是什么语言。