помогите конвертировать код обработки в C # - PullRequest
0 голосов
/ 25 июня 2009

Я пытаюсь преобразовать этот код из Java в C # (расположен здесь )

У меня есть некоторый опыт работы с 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 ]

5 голосов
/ 26 июня 2009
4 голосов
/ 26 июня 2009

Посмотрите на System.Drawing и класс Graphics.

РЕДАКТИРОВАТЬ: просто чтобы устранить путаницу, код OP не Java. Это Обработка . Об этом говорится в комментариях, но вы также можете сказать об этом, потому что нет определения класса, нет импорта, и вызовы не являются вызовами Java. Он компилируется в байт-код и взаимодействует с Java, но это не Java - никакое автоматическое преобразование не поможет.

2 голосов
/ 26 июня 2009

Если вы пытаетесь манипулировать пикселями и рисовать на экране, сохраняя высокую частоту кадров, вам, вероятно, захочется заглянуть в System.Drawing.Bitmap с использованием битов блокировки и разблокировки.

Хорошее объяснение можно найти здесь . В противном случае вы не сможете редактировать на уровне пикселей с приличной скоростью.

2 голосов
/ 26 июня 2009

System.Drawing Пространство имен содержит всевозможные графические элементы. И есть некоторые учебники на нем.

1 голос
/ 26 июня 2009

Чтобы нарисовать отдельный пиксель, вы можете использовать:

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

Вы можете посмотреть здесь .

0 голосов
/ 03 декабря 2009

Если вы зайдете на processing.org и загрузите программное обеспечение для обработки, вы можете скопировать этот код в IDE. Затем, если вы выполните «Файл> Экспорт», он создаст версию программы на Java-апплете, дополненную исходным кодом Java. Тогда, может быть, вы можете запустить какой-то другой конвертер, чтобы получить код C #.

(Обратите внимание, что этот код, кажется, является более старой версией Обработки; мне пришлось изменить «framerate» на «frameRate» для его запуска. Также мне пришлось выполнить команду «Инструменты> Создать шрифт ...» создать файл шрифта "Arial-48.vlw", который необходим.)

0 голосов
/ 26 июня 2009

Играем ли мы в «Угадай базовый класс»? :)

Этот оригинальный код не является полным Java, как с глобальными переменными и свободными функциями. Содержимое объявления класса?

Вопрос в том, какую платформу использовал код Java? Потому что, если это причудливая система двойной буферизации, вы, вероятно, не получите те же результаты в Winforms, рисуя пиксели прямо на экране.

Вы, вероятно, получите лучшие результаты, прибегнув к поиску по ключевым словам: DirectX C #

Обновление: ОП не знал, на каком языке это было.

...