STM32F746DISC开发板上有一个很大的液晶屏,可以显示各种图像。下面展示了用开发板显示奇妙的分形图形。
这里不介绍分形的理论了,大家可以网上搜索看看,它的计算公式是 Z = Z*Z + C,反复迭代计算,根据发散速度标明各点的颜色。
先看看实际效果,手机拍出来有些条纹,实际是没有的,液晶屏上显示的效果其实还不错。
下面是的程序代码。目前只实现了基本的显示,下一步将增加放大、缩小、改变颜色等功能。
#include "mbed.h"
#include "LCD_DISCO_F746NG.h"
#include "TS_DISCO_F746NG.h"
#define ITERATION 150
#define BAILOUT 4
LCD_DISCO_F746NG lcd;
TS_DISCO_F746NG ts;
uint16_t screen_width, screen_height;
uint16_t calcMandelBrot(double x, double y)
{
uint16_t i;
double xx, yy, tx, ty;
xx = yy = 0;
i = 0;
while((i < ITERATION) && ((xx*xx + yy*yy) < BAILOUT))
{
tx = xx*xx - yy*yy + x;
ty = 2*xx*yy + y;
xx = tx;
yy = ty;
i++;
}
return i;
}
void rectMandelBrot(double x1, double y1, double x2, double y2)
{
double dx, dy;
uint16_t i, j;
uint32_t color;
dx = (x2 - x1)/screen_width;
dy = (y2 - y1)/screen_height;
for(i = 0; i < screen_width; i++)
{
for(j = 0; j < screen_height; j++)
{
color = calcMandelBrot(x1 + dx*i, y1 + dy*j);
lcd.DrawPixel(i, j, 0xFF000000 | (color<<2) | (color <<4));
}
}
}
int main()
{
lcd.Clear(LCD_COLOR_BLACK);
screen_width = lcd.GetXSize() - 100;
screen_height = lcd.GetYSize();
rectMandelBrot(-2.5, -2, 2.5, 2);
while(1)
{
}
}
|