我正在尝试将此代码从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
答案 0 :(得分:5)
答案 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)
答案 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不知道它是什么语言。