栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

纯C语言绘制动态三维圆

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

纯C语言绘制动态三维圆

最近在网上翻到了有关用C语言在Windows环境下绘制动态圆的代码,很值得我们去借鉴。

众说周知,C/C++天生就是和黑窗口一对,只有字符。但运行下面的代码一定会惊艳到你。

注意:
        代码可能需要在编译选项中加入以下代码才能运行
-lgdi32
Code:
#include 
#include 
#define PI 3.1415926
#define SX 8
#define SY 16
#define DX PI / SX
#define DY PI * 2 / SY
#define X(a, b) (cx + v[a][b].x * r), (cy + v[a][b].y * r)
typedef struct { double x, y; } Vec;
void calc(double i, double j, double rot, Vec* v) {
    double x = sin(i) * cos(j), y = sin(i) * sin(j), z = cos(i),
        s = sin(rot), c = cos(rot), c1 = 1 - c, u = 1 / sqrt(3.0f), u2 = u * u;
    v->x = x * (c + u2 * c1) + y * (u2 * c1 - u * s) + z * (u2 * c1 + u * s);
    v->y = x * (u2 * c1 + u * s) + y * (c + u2 * c1) + z * (u2 * c1 - u * s);
}
int main() {
    HWND hwnd = GetConsoleWindow(); HDC hdc1 = GetDC(hwnd);
    double rot = 0;
    while(1) {
        RECT rect; GetClientRect(hwnd, &rect); int w = rect.right, h = rect.bottom, cx = w / 2, cy = h / 2, r = h * 0.375;
        HDC hdc2 = CreateCompatibleDC(hdc1); HBITMAP bmp = CreateCompatibleBitmap(hdc1, w, h); SelectObject(hdc2, bmp);
        SelectObject(hdc2, GetStockObject(WHITE_PEN));
        Vec v[SX + 1][SY + 1];
        for(int i = 0; i <= SX; ++i) for(int j = 0; j <= SY; ++j) calc(i * DX, j * DY, rot, &v[i][j]);
        for(int i = 0; i < SX; ++i) for(int j = 0; j < SY; ++j) {
            MoveToEx(hdc2, X(i, j), NULL); LineTo(hdc2, X(i + 1, j));
            MoveToEx(hdc2, X(i, j), NULL); LineTo(hdc2, X(i, j + 1));
        }
        BitBlt(hdc1, 0, 0, w, h, hdc2, 0, 0, SRCCOPY); DeleteObject(bmp); DeleteDC(hdc2);
        rot += 0.01; Sleep(10);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717046.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号