一、項(xiàng)目介紹
這是一個(gè)用C語言繪制的靜態(tài)立體圖形,但是一直盯住你就會發(fā)現(xiàn)圖形中間有一顆心在隱隱跳動!
眼見不一定為實(shí),你也會被自己的大腦“欺騙”。
編譯環(huán)境:visual c++ 6.0
第三方庫:Easyx2022 注意需要提前安裝easyX,如沒有基礎(chǔ)可以先了解easyX圖形編程
二、運(yùn)行截圖
(添加折線前)
(添加折線后)
三、代碼思路
1.引入easyx頭文件
#include <easyx.h>
2.創(chuàng)建繪圖窗口
initgraph(774, 774); setbkcolor(0xa6a6a6); cleardevice();
3.繪制背景
setorigin(387 - UNIT / 2, 387 - UNIT / 2); for (int x = -9; x <= 9; x++) for (int y = -9; y <= 9; y++) DrawBlock(x * UNIT, y * UNIT, (x + y) % 2); setorigin(0, 0);
4.畫輔助圖
IMAGE img(774, 774); SetWorkingImage(&img); setbkcolor(BLACK); cleardevice();
5.畫心(只需畫左半側(cè))
POINT ps[4] = { 387, 236, 321, 167, 129, 419, 387, 666 }; setfillcolor(WHITE); solidpolygon(ps, 4); solidellipse(76, 124, 368, 456); SetWorkingImage(NULL);
6.根據(jù)輔助圖,將輔助圖中白色部分與右側(cè)顛倒
DWORD* ref = GetImageBuffer(&img); DWORD* bk = GetImageBuffer(NULL); int t; for (int y = 0; y < 774; y++) for (int x = 0; x < 774 / 2; x++) if (ref[y * 774 + x] != BLACK) { t = bk[y * 774 + x]; bk[y * 774 + x] = bk[y * 774 + 774 - x]; bk[y * 774 + 774 - x] = t; }
完成
四、完整源碼
#include <graphics.h> #include <conio.h> #include <easyx.h> #include <stdio.h> const int UNIT = 43; ///畫背景單元方格/// void DrawBlock(int x, int y, bool odd) { int c1, c2; if (odd) { c1 = RED; c2 = WHITE; } else { c1 = WHITE; c2 = LIGHTRED; } setlinecolor(c1); line(x, y, x + UNIT - 1, y); line(x + UNIT - 1, y, x + UNIT - 1, y + UNIT - 1); setlinecolor(c2); line(x, y, x , y + UNIT - 1); line(x, y + UNIT - 1, x + UNIT - 1, y + UNIT - 1); setfillcolor(c1); POINT ps[3] = {x, y, x + 8, y, x, y + 8}; // 左上 solidpolygon(ps, 3); ps[0].x = x + UNIT;ps[0].y = y; // 右上 ps[1].x = ps[0].x - 8;ps[1].y = ps[0].y; ps[2].x = ps[0].x;ps[2].y = ps[0].y + 8; solidpolygon(ps, 3); ps[0].x = x + UNIT;ps[0].y = y + UNIT - 1; // 右下 ps[1].x = ps[0].x - 8;ps[1].y = ps[0].y; ps[2].x = ps[0].x;ps[2].y = ps[0].y - 8; solidpolygon(ps, 3); setfillcolor(c2); ps[0].x = x;ps[0].y = y; // 左上 ps[1].x = ps[0].x + 4;ps[1].y = ps[0].y + 4; ps[2].x = ps[0].x;ps[2].y = ps[0].y + 8; solidpolygon(ps, 3); ps[0].x = x + UNIT;ps[0].y = y + UNIT - 1; // 右下 ps[1].x = ps[0].x - 8;ps[1].y = ps[0].y; ps[2].x = ps[0].x - 4;ps[2].y = ps[0].y - 4; solidpolygon(ps, 3); ps[0].x = x;ps[0].y = y + UNIT - 1; // 左下 ps[1].x = ps[0].x + 8;ps[1].y = ps[0].y; ps[2].x = ps[0].x;ps[2].y = ps[0].y - 8; solidpolygon(ps, 3); setlinecolor(0x888888); line(x, y, x + 3, y + 3); line(x + UNIT - 1, y + UNIT - 1, x + UNIT - 4, y + UNIT - 4); } int main() { initgraph(774, 774);// 創(chuàng)建圖形窗口 setbkcolor(0xa6a6a6); cleardevice(); ///畫背景/// setorigin(387 - UNIT / 2, 387 - UNIT / 2); for (int x = -9; x <= 9; x++) for (int y = -9; y <= 9; y++) DrawBlock(x * UNIT, y * UNIT, (x + y) % 2); setorigin(0, 0); ///畫輔助圖/// IMAGE img(774, 774); SetWorkingImage(&img); setbkcolor(BLACK); cleardevice(); ///畫心(只需畫左半側(cè))/// POINT ps[4] = { 387, 236, 321, 167, 129, 419, 387, 666 }; setfillcolor(WHITE); solidpolygon(ps, 4); solidellipse(76, 124, 368, 456); SetWorkingImage(NULL); ///根據(jù)輔助圖,將輔助圖中白色部分與右側(cè)顛倒/// DWORD* ref = GetImageBuffer(&img); DWORD* bk = GetImageBuffer(NULL); int t; for (int y = 0; y < 774; y++) for (int x = 0; x < 774 / 2; x++) if (ref[y * 774 + x] != BLACK) { t = bk[y * 774 + x]; bk[y * 774 + x] = bk[y * 774 + 774 - x]; bk[y * 774 + 774 - x] = t; } setcolor(BLUE); setbkmode(TRANSPARENT); settextstyle(30,0,"楷體"); outtextxy(600, 600, "Dotcpp.com"); _getch(); closegraph(); return 0; }
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程