[STM32F7] 在STM32F746DISC上显示分形

[复制链接]
 楼主| ccw1986 发表于 2016-5-5 22:12 | 显示全部楼层 |阅读模式
STM32F746DISC开发板上有一个很大的液晶屏,可以显示各种图像。下面展示了用开发板显示奇妙的分形图形。

这里不介绍分形的理论了,大家可以网上搜索看看,它的计算公式是 Z = Z*Z + C,反复迭代计算,根据发散速度标明各点的颜色。

先看看实际效果,手机拍出来有些条纹,实际是没有的,液晶屏上显示的效果其实还不错。


下面是的程序代码。目前只实现了基本的显示,下一步将增加放大、缩小、改变颜色等功能。
  1. #include "mbed.h"
  2. #include "LCD_DISCO_F746NG.h"
  3. #include "TS_DISCO_F746NG.h"

  4. #define ITERATION  150
  5. #define BAILOUT 4

  6. LCD_DISCO_F746NG lcd;
  7. TS_DISCO_F746NG ts;


  8. uint16_t screen_width, screen_height;

  9. uint16_t calcMandelBrot(double x, double y)
  10. {
  11.     uint16_t i;
  12.     double xx, yy, tx, ty;
  13.    
  14.     xx = yy = 0;
  15.     i = 0;
  16.     while((i < ITERATION) && ((xx*xx + yy*yy) < BAILOUT))
  17.     {
  18.         tx = xx*xx - yy*yy + x;
  19.         ty = 2*xx*yy + y;
  20.         xx = tx;
  21.         yy = ty;
  22.         i++;
  23.     }
  24.     return i;
  25. }

  26. void rectMandelBrot(double x1, double y1, double x2, double y2)
  27. {
  28.     double dx, dy;
  29.     uint16_t i, j;
  30.     uint32_t color;
  31.    
  32.     dx = (x2 - x1)/screen_width;
  33.     dy = (y2 - y1)/screen_height;
  34.    
  35.     for(i = 0; i < screen_width; i++)
  36.     {
  37.         for(j = 0; j < screen_height; j++)
  38.         {
  39.             color = calcMandelBrot(x1 + dx*i, y1 + dy*j);
  40.             lcd.DrawPixel(i, j, 0xFF000000 | (color<<2) | (color <<4));
  41.         }
  42.     }
  43.    
  44. }

  45. int main()
  46. {
  47.     lcd.Clear(LCD_COLOR_BLACK);

  48.     screen_width = lcd.GetXSize() - 100;
  49.     screen_height = lcd.GetYSize();

  50.     rectMandelBrot(-2.5, -2, 2.5, 2);
  51.    
  52.     while(1)
  53.     {
  54.     }
  55. }


mintspring 发表于 2016-5-5 23:14 | 显示全部楼层
如果每次的计算坐标都是颜色稍微改变一点点,那岂不是非常炫彩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

925

帖子

6

粉丝

84

主题

925

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部