【问题标题】:Create mixer or equalizer in Turbo C++ graphics在 Turbo C++ 图形中创建混音器或均衡器
【发布时间】:2018-01-02 13:07:59
【问题描述】:

我尝试创建条形图,但输出只是条形图,我想像视觉均衡器一样上下移动条形图,但我不知道具体的代码。有人知道吗?

这是一张图片:

我的尝试:

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
#include <graphics.h>

void main(){
    int gd = DETECT, gm;
    initgraph(&gd,&gm, “D:\\TC\\BGI”);
    randomize();
    int x = 100;
    int y,a; 
    setfillstyle(2,GREEN);

    do{
        delay(100);
        y = random(150);
        if ((200-y) >=a){ 
            setfillstyle(2,BLACK);
            bar (x,200-y,x+20,a); 
        } 
        else { 
            bar (x,200,x+20,200-y); 
        }  
        a = 200-y; 
    }
    while(!kbhit());
    getch(); 
    closegraph(); 
}

【问题讨论】:

  • 加上random 输入,这将很难实现。因为如果不初始化每帧种子,它会闪烁很多,并且它会是静态的。为了平滑模拟,您可以在开始时创建一组随机正弦波,然后每帧对其进行迭代......另一种选择是使用您当前的实现并随着时间的推移在状态之间进行插值......

标签: graphics turbo-c++ bgi


【解决方案1】:

您应该在主循环中重复执行此操作:

  1. 计算柱的位置

    您没有提供输入或输出的任何信息。混频器设备将更多信号混合在一起,均衡器是可调带通滤波器阵列。那么这些条形代表什么?

    如果它们是用于设置带通滤波器的滤波器GUI,那么您需要为它们添加接口,例如用鼠标或其他方式“移动”它们。为此,我们需要更多信息...

    如果条形图代表频谱图,那么您需要对随时间移动的某个输入信号窗口进行DFT

  2. 清除缓冲区

    这称为反向缓冲或双缓冲。如果我没记错BGI 可以做到这一点。这个想法是渲染到内存中以避免闪烁,当图像完成后将其复制到屏幕。

  3. 将条形图渲染到缓冲区

    这部分你声称你已经实现了,所以不需要解释。

  4. 将缓冲区渲染到屏幕

    这是后退/双缓冲的最后一步,以避免闪烁

  5. 等待/睡眠一段时间

  6. 检测退出条件

    如果激活则停止循环,否则再次转到 #1 ...

如果要制作鼠标GUI,则需要添加鼠标事件处理程序。我认为在 Borland Turbo C++ 中有一些库,但如果我弄错了,您可以使用 INT 33h 通过轮询定期扫描您自己的鼠标状态(这远非理想,但会为初学者工作)或连接您自己的鼠标处理程序。

这里有一些相关的东西可以阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多