【问题标题】:Color gradient for Mandelbrot Android application doesn't workMandelbrot Android 应用程序的颜色渐变不起作用
【发布时间】:2011-07-27 17:46:25
【问题描述】:

我正在尝试编写适用于 Android 的 Mandelbrot 集。 我试着把它画在画布上。它有效,但我想要一个颜色渐变。 这是我的代码:

package de.turbofractal;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;


public class FractalView extends View {
   private int n,g,xMax,yMax;
   private float zr,zrh,zr0,zi,zi0,ar,br,ai,bi;
   private int[][] Iterationen = new int[2560][1440];
   private Paint paint;

   public FractalView(Context context) {
      super(context);
      paint = new Paint();
      ar=-2; br=2; ai=-2; bi=2;
   }

   @Override
   protected void onDraw(Canvas canvas) {
       g = 20;
       for(int xx = 1; xx <= xMax; xx++) {
           for(int yy = 1; yy <= yMax; yy++) {
               schirmzupap(ar,br,bi,ai,xx,yy,xMax,yMax);
               n = 1;
               zr0 = zr;
               zi0 = zi;
               while ((n<g) && (zr*zr+zi*zi<4)) {
                   zrh = zr;
                   zr = (zr*zr)-zi*zi+zr0;
                   zi = zrh*zi+zi*zrh+zi0;
                   n++;
               }
               paint.setARGB(255,0,0,Math.round((n/g)*255));  //<--------------------this is where the color gradient should be created. But the programm only draws full blue (0,0,255). Why is that?
               canvas.drawPoint(xx, yy, paint);            
           }

        }
        invalidate();
   }      


   private void schirmzupap(float ax,float bx,float ay,float by,int xschirm,int yschirm,int w,int h) {
       zr = xschirm*(bx-ax)/w+ax;
       zi = yschirm*(ay-by)/h+by;
   } 

   @Override
   public void onSizeChanged(int w, int h, int oldW, int oldH) {
      xMax = w-1;
      yMax = h-1;
   }
}

编辑: eclipse模拟器是这样绘制的: http://i53.tinypic.com/2mwfs7c.png

但我希望它画成这样(用 Delphi 编程): http://i53.tinypic.com/ehg2et.png

【问题讨论】:

    标签: android colors gradient mandelbrot


    【解决方案1】:
    paint.setARGB(255,0,0,Math.round((n/g)*255));  
    

    setARGB 的参数是 alpha、red、green 和 blue - 您只为 alpha 和 blue 参数提供值。

    b参数内部,ng都是整数参数,所以当你将它们相除时,你会得到一个整数结果,不是一个双精度数。 (参见“Java Integer Division, How do you produce a double?”)这意味着你只能得到结果的整数部分,这不是你想要的。将 ng 转换为双精度,它应该可以工作。

    【讨论】:

    • 没错。基本上我只想要从黑色到蓝色的颜色渐变。在不破坏同时条件的情况下,n 越高,像素被绘制的蓝色越多,黑色越少。但目前所有像素都被绘制成全蓝色 (0,0,255)。
    • 已编辑 - 起初我以为你在问为什么它都是蓝色的,但后来我意识到存在整数除法问题。
    • 哦,这是一个非常愚蠢的错误,但我是 Java 新手...非常感谢!
    • 顺便说一句,在这种情况下,整数除法实际上是你的朋友。只需使用 (255 * n / g) 作为您的蓝色值。这将为您提供与 (int)(Math.round(255 * (n/(double)g))) 相同的输出,但效率更高。
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多