鱼C论坛

 找回密码
 立即注册
查看: 1255|回复: 7

[已解决]画函数图像

[复制链接]
发表于 2021-4-12 22:04:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有大佬有用C语言写的画函数图像的程序吗,带坐标轴的那种。求观摩
最佳答案
2021-4-16 18:03:37

说好的C语言了,你用的C++编译器肯定报错,试试这个
#include "screen.h"
#include <stdlib.h>
#include <string.h>

screen_t *screen_init(size_t width, size_t height) {
    screen_t *screen = (screen_t *)malloc(sizeof(*screen));
    *screen = (screen_t){width, height, (char *)malloc(width * height)};
    memset(screen->buff, ' ', screen->width * screen->height);
    return screen;
}

void screen_deinit(screen_t *screen) {
    free(screen->buff);
    free(screen);
}

void screen_putchar(screen_t *screen, size_t x, size_t y, char ch) {
    if(x < screen->width && y < screen->height)
        screen->buff[y * screen->width + x] = ch;
}

void screen_refresh(screen_t *screen, FILE *fp) {
    for(size_t y = 0; y < screen->height; ++y) {
        for(size_t x = 0; x < screen->width; ++x) {
            fputc(screen->buff[y * screen->width + x], fp);
        }
        fputc('\n', fp);
    }
}

void screen_draw_border(screen_t *screen, char ch) {
    for(size_t y = 0; y < screen->height; ++y) {
        for(size_t x = 0; x < screen->width; ++x) {
            if(y == 0 || x == 0 || y == screen->height - 1 || x == screen->width - 1)
                screen_putchar(screen, x, y, ch);
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-13 08:54:02 | 显示全部楼层
MATLAB 编辑 讨论1 上传视频
MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 [1]
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室),软件主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式。 [1]
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等。MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。

---------来自百度百科
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-13 16:05:04 | 显示全部楼层
本帖最后由 人造人 于 2021-4-13 16:08 编辑

你不要再让我在数轴上写上数字,^_^

1.png

main.c
#include "screen.h"
#include <math.h>

double radian(double angle) {
    return angle * M_PI / 180;
}

void number_axis(screen_t *screen, size_t x, size_t y, char ch) {
    for(size_t i = 1; i < screen->height - 1; ++i)
        screen_putchar(screen, x, i, ch);
    for(size_t i = 1; i < screen->width - 1; ++i)
        screen_putchar(screen, i, y, ch);
}

void draw(screen_t *screen) {
    ssize_t offset_x = 10;
    ssize_t offset_y = screen->height / 2;
    number_axis(screen, offset_x, offset_y, 'n');
    for(size_t x = 1; x < screen->width - 1; ++x) {
        screen_putchar(screen, offset_x + x, offset_y - 15 * sin(radian(8 * x)), '0');
    }
}

int main(void) {
    screen_t *screen = screen_init(130, 41);
    screen_draw_border(screen, '#');
    draw(screen);
    screen_refresh(screen, stdout);
    screen_deinit(screen);
    return 0;
}

screen.h
#ifndef _SCREEN_H_
#define _SCREEN_H_

#include <stdio.h>
#include <stddef.h>

typedef struct {
    size_t width, height;
    char *buff;
} screen_t;

screen_t *screen_init(size_t width, size_t height);
void screen_deinit(screen_t *screen);
void screen_putchar(screen_t *screen, size_t x, size_t y, char ch);
void screen_refresh(screen_t *screen, FILE *fp);
void screen_draw_border(screen_t *screen, char ch);

#endif

screen.c
#include "screen.h"
#include <stdlib.h>
#include <string.h>

screen_t *screen_init(size_t width, size_t height) {
    screen_t *screen = malloc(sizeof(*screen));
    *screen = (screen_t){width, height, malloc(width * height)};
    memset(screen->buff, ' ', screen->width * screen->height);
    return screen;
}

void screen_deinit(screen_t *screen) {
    free(screen->buff);
    free(screen);
}

void screen_putchar(screen_t *screen, size_t x, size_t y, char ch) {
    if(x < screen->width && y < screen->height)
        screen->buff[y * screen->width + x] = ch;
}

void screen_refresh(screen_t *screen, FILE *fp) {
    for(size_t y = 0; y < screen->height; ++y) {
        for(size_t x = 0; x < screen->width; ++x) {
            fputc(screen->buff[y * screen->width + x], fp);
        }
        fputc('\n', fp);
    }
}

void screen_draw_border(screen_t *screen, char ch) {
    for(size_t y = 0; y < screen->height; ++y) {
        for(size_t x = 0; x < screen->width; ++x) {
            if(y == 0 || x == 0 || y == screen->height - 1 || x == screen->width - 1)
                screen_putchar(screen, x, y, ch);
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-16 15:56:30 | 显示全部楼层
本帖最后由 君子好逑 于 2021-4-16 15:57 编辑
人造人 发表于 2021-4-13 16:05
你不要再让我在数轴上写上数字,^_^


大佬,有报错
屏幕截图 2021-04-16 155546.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-16 15:58:33 | 显示全部楼层
yuxijian2020 发表于 2021-4-13 08:54
MATLAB 编辑 讨论1 上传视频
MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深 ...

呃,这课的老师就是不让用matlab,我也很麻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-16 18:03:37 | 显示全部楼层    本楼为最佳答案   

说好的C语言了,你用的C++编译器肯定报错,试试这个
#include "screen.h"
#include <stdlib.h>
#include <string.h>

screen_t *screen_init(size_t width, size_t height) {
    screen_t *screen = (screen_t *)malloc(sizeof(*screen));
    *screen = (screen_t){width, height, (char *)malloc(width * height)};
    memset(screen->buff, ' ', screen->width * screen->height);
    return screen;
}

void screen_deinit(screen_t *screen) {
    free(screen->buff);
    free(screen);
}

void screen_putchar(screen_t *screen, size_t x, size_t y, char ch) {
    if(x < screen->width && y < screen->height)
        screen->buff[y * screen->width + x] = ch;
}

void screen_refresh(screen_t *screen, FILE *fp) {
    for(size_t y = 0; y < screen->height; ++y) {
        for(size_t x = 0; x < screen->width; ++x) {
            fputc(screen->buff[y * screen->width + x], fp);
        }
        fputc('\n', fp);
    }
}

void screen_draw_border(screen_t *screen, char ch) {
    for(size_t y = 0; y < screen->height; ++y) {
        for(size_t x = 0; x < screen->width; ++x) {
            if(y == 0 || x == 0 || y == screen->height - 1 || x == screen->width - 1)
                screen_putchar(screen, x, y, ch);
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-16 23:22:40 | 显示全部楼层
人造人 发表于 2021-4-16 18:03
说好的C语言了,你用的C++编译器肯定报错,试试这个

大佬,你那个背景图怎们弄的

我的黑不溜秋的,好羡慕啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 00:35:31 | 显示全部楼层
君子好逑 发表于 2021-4-16 23:22
大佬,你那个背景图怎们弄的

我的黑不溜秋的,好羡慕啊

archlinux + i3wm
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 17:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表