0

このコードを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
4

7 に答える 7

5

同様の SO の質問があります: Tools to assist

これは、Java を C# に変換するための MS リリースのツールです

于 2009-06-25T20:03:12.517 に答える
4

System.Drawing と Graphics クラスを見てください。

編集:混乱を解消するために、OPのコードはJavaではありません。処理中です。コメントでそう言っていますが、クラス定義もインポートもなく、呼び出しが Java 呼び出しではないため、それもわかります。バイトコードにコンパイルされ、Java と相互運用しますが、Java ではありません。自動変換は役に立ちません。

于 2009-06-25T20:00:51.100 に答える
2

System.Drawing名前空間には、あらゆる種類のグラフィックスが含まれています。そして、それに関するいくつかのチュートリアルがあります。

于 2009-06-25T20:02:18.603 に答える
2

高いフレームレートを維持しながらピクセルを操作して画面に描画しようとしている場合は、lockbits と unlockbits を使用して System.Drawing.Bitmap を調べたいと思うでしょう。

良い説明はここにあります。そうしないと、まともな速度でピクセルレベルの編集を行うことができなくなります。

于 2009-06-25T20:05:20.000 に答える
1

processing.orgにアクセスしてProcessingソフトウェアをダウンロードすると、このコードをIDEにコピーできます。次に、「ファイル>エクスポート」を実行すると、Javaソースコードを備えたプログラムのJavaアプレットバージョンが作成されます。次に、他のコンバーターを実行してC#コードを取得できます。

(このコードは古いバージョンのProcessingのようです。実行するには、「framerate」を「frameRate」に変更する必要がありました。また、「Tools>CreateFont...」コマンドを実行して作成する必要がありました。必要な「Arial-48.vlw」フォントファイル。)

于 2009-12-03T20:01:42.067 に答える
1

個々のピクセルを描画するには、次を使用できます。

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

あなたはここを見たいと思うかもしれません。

于 2009-06-25T20:02:08.277 に答える
-1

Guess the Base Class をプレイしていますか? :)

その元のコードは、グローバル変数とフリー関数を含む完全な Java ではないようです。クラス宣言の内容ですか?

問題は、Java コードがどのフレームワークを使用していたかということです。派手なダブル バッファリング システムの場合、ピクセルを画面に直接プロットしても、Winforms で同じ結果が得られない可能性があります。

次のキーワードをグーグルで検索すると、おそらく最良の結果が得られるでしょう: DirectX C#

更新: OP はそれがどの言語であるかを知りませんでした。

于 2009-06-25T20:05:14.447 に答える