打印
[STM32F7]

在STM32F746DISC上显示分形

[复制链接]
929|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccw1986|  楼主 | 2016-5-5 22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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)
    {
    }
}


沙发
mintspring| | 2016-5-5 23:14 | 只看该作者
如果每次的计算坐标都是颜色稍微改变一点点,那岂不是非常炫彩

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

925

帖子

6

粉丝